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

Умный НПС помогите

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

Всем доброго времени суток. Подскажите как сделать НПС киллера, который будет убивать игрока в радиусе видимости, если у игрока нет определенного предмета в инвентаре. 

 

 

Пример. 

Игрок прилетает в локацию без предмета, его убивает этот НПС.

Игрок прилетает в локацию с предметом, его не убивает этот НПС.

 

Есть идеи? 

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


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

Дороговато вам такая идея обойдется.

Все реализуемо при наличии у вас исходного кода.

  • Upvote 1

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


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

Дороговато вам такая идея обойдется.

Все реализуемо при наличии у вас исходного кода.

без исходов чекера не реализовать? 

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


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

без исходов чекера не реализовать? 

 

С функционалом что вам необходим конечно же, нет.

Все что можно будет реализовать без сурса это сделать НПС киллера, который будет убивать игрока в радиусе видимости

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


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

Ну или скрипт на вип тп,к примеру есть итем тпшит.Нет итема не тпшит.

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


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

С функционалом что вам необходим конечно же, нет.

Все что можно будет реализовать без сурса это сделать НПС киллера, который будет убивать игрока в радиусе видимости

понял, спасибо за ответ. 

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


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

Ну или скрипт на вип тп,к примеру есть итем тпшит.Нет итема не тпшит.

не подходит, хотелось именно чекера с проверкой итема. 

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


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

Почему это без сурса не получится? Через АИ можно сделать это всё. Какая сборка?

Изменено пользователем BymerOK
  • Upvote 2

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


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

Почему это без сурса не получится? Через АИ можно сделать это всё. Какая сборка?

Lovely

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


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

Кароче, если так и не сделал, то вот рабочий набросок:

package custom.killer;

import ru.catssoftware.gameserver.model.actor.instance.L2NpcInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance;
import ru.catssoftware.gameserver.model.quest.Quest;

/**
 * 
 * @author calypso
 *
 */

public class killer extends Quest {
	private final static int[] npcIds = { 27232, 27233 }; // ид нпц-киллеров
	private int PASS = 4037; // итем, наличие которого необходимо чтобы остаться в живых 
	private int MIN = 1; // минимальное кол-во итемов

	public killer(int questId, String name, String descr) {
		super(questId, name, descr);
		for (int npcs : npcIds)
			addAggroRangeEnterId(npcs);
	}

	@Override
	public String onAggroRangeEnter(L2NpcInstance npc, L2PcInstance player, boolean isPet) {
		
			if (player.getInventory().getItemByItemId(PASS) == null || player.getInventory().getItemByItemId(PASS).getCount() < MIN) {
				if(player.getAppearance().isInvisible())
					player.getAppearance().setVisible();
				player.doDie(npc);
			}

		return super.onAggroRangeEnter(npc, player, isPet);
	}

	public static void main(String[] args) {
		new killer(-1, "killer", "custom.killer");
	}
}

  • Upvote 2

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


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

 

Кароче, если так и не сделал, то вот рабочий набросок:

package custom.killer;

import ru.catssoftware.gameserver.model.actor.instance.L2NpcInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance;
import ru.catssoftware.gameserver.model.quest.Quest;

/**
 * 
 * @author calypso
 *
 */

public class killer extends Quest {
	private final static int[] npcIds = { 27232, 27233 }; // ид нпц-киллеров
	private int PASS = 4037; // итем, наличие которого необходимо чтобы остаться в живых 
	private int MIN = 1; // минимальное кол-во итемов

	public killer(int questId, String name, String descr) {
		super(questId, name, descr);
		for (int npcs : npcIds)
			addAggroRangeEnterId(npcs);
	}

	@Override
	public String onAggroRangeEnter(L2NpcInstance npc, L2PcInstance player, boolean isPet) {
		
			if (player.getInventory().getItemByItemId(PASS) == null || player.getInventory().getItemByItemId(PASS).getCount() < MIN) {
				if(player.getAppearance().isInvisible())
					player.getAppearance().setVisible();
				player.doDie(npc);
			}

		return super.onAggroRangeEnter(npc, player, isPet);
	}

	public static void main(String[] args) {
		new killer(-1, "killer", "custom.killer");
	}
}

сейчас проверю. 

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


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

 

Traceback (innermost last):

  (no code object) at line 0

SyntaxError: ('invalid syntax', ('__init__.py', 5, 1, '/**'))

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


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

 

Кароче, если так и не сделал, то вот рабочий набросок:

package custom.killer;

import ru.catssoftware.gameserver.model.actor.instance.L2NpcInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance;
import ru.catssoftware.gameserver.model.quest.Quest;

/**
 * 
 * @author calypso
 *
 */

public class killer extends Quest {
	private final static int[] npcIds = { 27232, 27233 }; // ид нпц-киллеров
	private int PASS = 4037; // итем, наличие которого необходимо чтобы остаться в живых 
	private int MIN = 1; // минимальное кол-во итемов

	public killer(int questId, String name, String descr) {
		super(questId, name, descr);
		for (int npcs : npcIds)
			addAggroRangeEnterId(npcs);
	}

	@Override
	public String onAggroRangeEnter(L2NpcInstance npc, L2PcInstance player, boolean isPet) {
		
			if (player.getInventory().getItemByItemId(PASS) == null || player.getInventory().getItemByItemId(PASS).getCount() < MIN) {
				if(player.getAppearance().isInvisible())
					player.getAppearance().setVisible();
				player.doDie(npc);
			}

		return super.onAggroRangeEnter(npc, player, isPet);
	}

	public static void main(String[] args) {
		new killer(-1, "killer", "custom.killer");
	}
}

 

Он это не прикрутит)

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


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

 

Line: -1 - Column: -1
 
Traceback (innermost last):
  (no code object) at line 0
SyntaxError: ('invalid syntax', ('__init__.py', 5, 1, '/**'))

 

Ну да, яву подгрузить из питона? :D

в папке /data/scripts/custom создай папку killer и создай там файл killer.java, затем вставь туда мой скрипт и запускай сервер.

  • Upvote 2

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


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

Ну да, яву подгрузить из питона? :D

в папке /data/scripts/custom создай папку killer и создай там файл killer.java, затем вставь туда мой скрипт и запускай сервер.

голова не варит) сделал уже, спасибо :) 
Изменено пользователем mazanaka

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


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

Рассмотрим квест альянс варки и кетры, специально попробовал пройти Квест Alliance with Ketra Orcs (Союз с Орками Кетра) и вот что имеем:

Выдано:

Mark of Ketra's Alliance - Level 5 (V Символ Союза с Кетра). (квестовая вещь)

Мобы в Кетре не трогают, хоть и задавал значение agro 500

Перемещаюсь в Варку, мобы агрятся почти сразу (по дефу 150 agro стояло)

 

Что нужно: укоротить квест до минимума, также возможно Марку переместить из квестовых в простые. Задать ид других нпс на квест.

 

Проверял на сборке pw-soft.

 

 

Игрок прилетает в локацию без предмета, его убивает этот НПС. (Нет марки,квест не пройден)

Игрок прилетает в локацию с предметом, его не убивает этот НПС.(Есть марка, квест пройден)

 

Минус в том что это квестом идет, а не просто итем-нпс. Хотя по мне так даже лучше, 

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

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


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

Рассмотрим квест альянс варки и кетры, специально попробовал пройти Квест Alliance with Ketra Orcs (Союз с Орками Кетра) и вот что имеем:

Выдано:

Mark of Ketra's Alliance - Level 5 (V Символ Союза с Кетра). (квестовая вещь)

Мобы в Кетре не трогают, хоть и задавал значение agro 500

Перемещаюсь в Варку, мобы агрятся почти сразу (по дефу 150 agro стояло)

 

Что нужно: укоротить квест до минимума, также возможно Марку переместить из квестовых в простые. Задать ид других нпс на квест.

 

Проверял на сборке pw-soft.

 

 

Игрок прилетает в локацию без предмета, его убивает этот НПС. (Нет марки,квест не пройден)

 

Игрок прилетает в локацию с предметом, его не убивает этот НПС.(Есть марка, квест пройден)

 

Минус в том что это квестом идет, а не просто итем-нпс. Хотя по мне так даже лучше, 

Спасибо, но уже сделал.

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


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

Ну да, яву подгрузить из питона? :D

в папке /data/scripts/custom создай папку killer и создай там файл killer.java, затем вставь туда мой скрипт и запускай сервер.

Все работает:) Спасибо.

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


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

 

Кароче, если так и не сделал, то вот рабочий набросок:

package custom.killer;

import ru.catssoftware.gameserver.model.actor.instance.L2NpcInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance;
import ru.catssoftware.gameserver.model.quest.Quest;

/**
 * 
 * @author calypso
 *
 */

public class killer extends Quest {
	private final static int[] npcIds = { 27232, 27233 }; // ид нпц-киллеров
	private int PASS = 4037; // итем, наличие которого необходимо чтобы остаться в живых 
	private int MIN = 1; // минимальное кол-во итемов

	public killer(int questId, String name, String descr) {
		super(questId, name, descr);
		for (int npcs : npcIds)
			addAggroRangeEnterId(npcs);
	}

	@Override
	public String onAggroRangeEnter(L2NpcInstance npc, L2PcInstance player, boolean isPet) {
		
			if (player.getInventory().getItemByItemId(PASS) == null || player.getInventory().getItemByItemId(PASS).getCount() < MIN) {
				if(player.getAppearance().isInvisible())
					player.getAppearance().setVisible();
				player.doDie(npc);
			}

		return super.onAggroRangeEnter(npc, player, isPet);
	}

	public static void main(String[] args) {
		new killer(-1, "killer", "custom.killer");
	}
}

 

 

В вашем коде в одном из сценариев может возникнуть исключение и скрипт полетит. Если мы будем обращаться к методу объекта, который указывает на null (если, конечно, getItemByItemId вообще может вернуть null). Кстати, одна из самых распространенных ошибок программистов. NullPointerException :)) Поэтому, я бы написал так:

@Override
public String onAggroRangeEnter(L2NpcInstance npc, L2PcInstance player, boolean isPet) {
    if (player.getInventory().getItemByItemId(PASS) == null) // You can't call an instance method with a null pointer, so let's divide all for few statements and this'll be our first statement
        killPlayer(player, npc); // So, if item just don't exist
    else if (player.getInventory().getItemByItemId(PASS).getCount() < MIN) // We'll check this only if such item exist
        killPlayer(player, npc);
    return super.onAggroRangeEnter(npc, player, isPet);
}

private static void killPlayer(L2PcInstance player, L2NpcInstance npc) {
    if(player.getAppearance().isInvisible())
        player.getAppearance().setVisible();
    player.doDie(npc);
}
Изменено пользователем Blueeyer

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


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

С функционалом что вам необходим конечно же, нет.

Все что можно будет реализовать без сурса это сделать НПС киллера, который будет убивать игрока в радиусе видимости

а как же ваше мастерство? если вы утверждали что такое нельзя будет сделать без исходного кода...

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


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

 

В вашем коде в одном из сценариев может возникнуть исключение и скрипт полетит. Если мы будем обращаться к методу объекта, который указывает на null (если, конечно, getItemByItemId вообще может вернуть null). Кстати, одна из самых распространенных ошибок программистов. NullPointerException :)) Поэтому, я бы написал так:

@Override
public String onAggroRangeEnter(L2NpcInstance npc, L2PcInstance player, boolean isPet) {
    if (player.getInventory().getItemByItemId(PASS) == null) // You can't call an instance method with a null pointer, so let's divide all for few statements and this'll be our first statement
        killPlayer(player, npc); // So, if item just don't exist
    else if (player.getInventory().getItemByItemId(PASS).getCount() < MIN) // We'll check this only if such item exist
        killPlayer(player, npc);
    return super.onAggroRangeEnter(npc, player, isPet);
}

private static void killPlayer(L2PcInstance player, L2NpcInstance npc) {
    if(player.getAppearance().isInvisible())
        player.getAppearance().setVisible();
    player.doDie(npc);
}

НПЕ не будет. Да и вообще я же указал:

 

 

Кароче, если так и не сделал, то вот рабочий набросок:

И  в чем разница между предоставленным вами кодом и моим, в добавлении англоязычных комментов?

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


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

НПЕ не будет. Да и вообще я же указал:

И  в чем разница между предоставленным вами кодом и моим, в добавлении англоязычных комментов?

у вас в if'e два условия, одно из которых звучит так:

player.getInventory().getItemByItemId(PASS) == null

тогда, исходя из этого, если getItemByItemId выдаст null, то как вы можете обратиться к его методу, если он не статический, все в том же ифе? 

player.getInventory().getItemByItemId(PASS).getCount() < MIN

В данном случае, если getItemByItemId == null интерпретатор в любом случае заметит во втором условии, принадлежащем тому же if'у, что вы обращаетесь к методу пустого элемента и тогда выдаст NullPointerException. И, поверьте, я не пытаюсь придраться к коду, все написано довольно не плохо, однако подобная вещь может создать сбои в работе

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

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


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

а как же ваше мастерство? если вы утверждали что такое нельзя будет сделать без исходного кода...

 

 Вот на таких мелочах и видно мастерство=)

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

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

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

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