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

Квесты Территориальных войн Dominion_KillSpecialUnitQuest

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

Доброго времени суток , хотел попросить помощи в редактировании квеста Dominion_KillSpecialUnitQuest

 Сборка - Модифицированный Overlord

Описание проблемы - квест подразумевает что при убийстве юнитов зареганных за чужой замок игроку дается квестом на убийство 10-15 игроков определенной профессии. Проблема в том что на сборке сделано так что получить за одного и того же персонажа при его убийстве более 1-ого раза кв не засчитывается. Самостоятельно разобраться не получилось. нужно чтобы при убийстве одного персонажа хоть 1 хоть 10 раз кв засчитывался.

package quests;

import l2p.commons.util.Rnd;
import l2p.gameserver.data.xml.holder.EventHolder;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.base.ClassId;
import l2p.gameserver.model.entity.events.EventType;
import l2p.gameserver.model.entity.events.impl.DominionSiegeEvent;
import l2p.gameserver.model.entity.events.impl.DominionSiegeRunnerEvent;
import l2p.gameserver.model.quest.Quest;
import l2p.gameserver.model.quest.QuestState;
import l2p.gameserver.network.serverpackets.ExShowScreenMessage;
import l2p.gameserver.network.serverpackets.components.NpcString;
import l2p.gameserver.scripts.ScriptFile;

import org.apache.commons.lang3.ArrayUtils;


public abstract class Dominion_KillSpecialUnitQuest extends Quest implements ScriptFile
{
	private final ClassId[] _classIds;

	public Dominion_KillSpecialUnitQuest()
	{
		super(PARTY_ALL);

		_classIds = getTargetClassIds();
		DominionSiegeRunnerEvent runnerEvent = EventHolder.getInstance().getEvent(EventType.MAIN_EVENT, 1);
		for(ClassId c : _classIds)
			runnerEvent.addClassQuest(c, this);
	}

	protected abstract NpcString startNpcString();

	protected abstract NpcString progressNpcString();

	protected abstract NpcString doneNpcString();

	protected abstract int getRandomMin();

	protected abstract int getRandomMax();

	protected abstract ClassId[] getTargetClassIds();

	@Override
	public String onKill(Player killed, QuestState qs)
	{
		Player player = qs.getPlayer();
		if(player == null)
			return null;

		DominionSiegeEvent event1 = player.getEvent(DominionSiegeEvent.class);

		if(event1 == null)
			return null;

		DominionSiegeEvent event2 = killed.getEvent(DominionSiegeEvent.class);

		if(event2 == null || event2 == event1)
			return null;

		if(!ArrayUtils.contains(_classIds, killed.getClassId()))
			return null;

		int max_kills = qs.getInt("max_kills");
		if(max_kills == 0)
		{
			qs.setState(STARTED);
			qs.setCond(1);

			max_kills = Rnd.get(getRandomMin(), getRandomMax());
			qs.setMemoState("max_kills", max_kills);
			qs.setMemoState("current_kills", 1);

			player.sendPacket(new ExShowScreenMessage(startNpcString(), 2000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER, true, false, String.valueOf(max_kills)));
		}
		else
		{
			int current_kills = qs.getInt("current_kills") + 1;
			if(current_kills >= max_kills)
			{
				event1.addReward(player, DominionSiegeEvent.STATIC_BADGES, 10);

				qs.setState(COMPLETED);
				qs.addExpAndSp(534000, 51000);
				qs.exitQuest(true);

				player.sendPacket(new ExShowScreenMessage(doneNpcString(), 2000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER, true, false));
			}
			else
			{
				qs.setMemoState("current_kills", current_kills);
				player.sendPacket(new ExShowScreenMessage(progressNpcString(), 2000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER, true, false, String.valueOf(max_kills), String.valueOf(current_kills)));
			}
		}

		return null;
	}

	@Override
	public boolean canAbortByPacket()
	{
		return false;
	}

	@Override
	public void onLoad()
	{

	}

	@Override
	public void onReload()
	{

	}

	@Override
	public void onShutdown()
	{

	}
}

Буду рад любой помощи или подсказке.

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

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


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

смотреть KillListener в DominionSiegeEvent, в ядре.

скорее всего там ведется список тех, кого игрок уже убивал по квесту в это тв и идет сверка с этим списком.

  • Upvote 1

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


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

Нашел , не так и не понял какая часть отвечает за поиск id персонажа

public class KillListener implements OnKillListener
	{
		@Override
		public void onKill(Creature actor, Creature victim)
		{
			Player winner = actor.getPlayer();

			if((winner == null) || !victim.isPlayer() || (winner.getLevel() < 40) || (winner == victim) || (victim.getEvent(DominionSiegeEvent.class) == DominionSiegeEvent.this) || !actor.isInZone(Zone.ZoneType.SIEGE) || !victim.isInZone(Zone.ZoneType.SIEGE))
				return;

			winner.setFame(winner.getFame() + Rnd.get(10, 20), DominionSiegeEvent.this.toString());
			addReward(winner, KILL_REWARD, 1);

			if(victim.getLevel() >= 61)
			{
				Quest q = _runnerEvent.getClassQuest(((Player) victim).getClassId());

				if(q == null)
					return;

				QuestState questState = winner.getQuestState(q.getClass());

				if(questState == null)
				{
					questState = q.newQuestState(winner, Quest.CREATED);

					q.notifyKill(((Player) victim), questState);
				}
			}
		}

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


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

хм, и тут нету. тогда непонятно где еще может это отслеживаться.

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


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

тема по прежнему актуальна , возможно кто то захочет заняться на платной основе?

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


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

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

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

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

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

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

Войти

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

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

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

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

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