Temen 0 Опубликовано 16 октября, 2015 (изменено) Доброго времени суток , хотел попросить помощи в редактировании квеста 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() { } } Буду рад любой помощи или подсказке. Изменено 16 октября, 2015 пользователем Temen Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 16 октября, 2015 смотреть KillListener в DominionSiegeEvent, в ядре. скорее всего там ведется список тех, кого игрок уже убивал по квесту в это тв и идет сверка с этим списком. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Temen 0 Опубликовано 16 октября, 2015 Нашел , не так и не понял какая часть отвечает за поиск 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); } } } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 16 октября, 2015 хм, и тут нету. тогда непонятно где еще может это отслеживаться. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Temen 0 Опубликовано 16 октября, 2015 тема по прежнему актуальна , возможно кто то захочет заняться на платной основе? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты