From 6cd7773900ca990fb33984f0142ad3de4a807e47 Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Thu, 26 Aug 2021 22:44:32 +0000 Subject: [PATCH] Level and kill count requirements for quests 10294 and 10295. Contributed by gvr. --- .../Q10294_SporeInfestedPlace.java | 46 ++++++++++++++++--- .../Q10295_RespectforGraves.java | 46 +++++++++++++++++-- 2 files changed, 82 insertions(+), 10 deletions(-) diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/quests/Q10294_SporeInfestedPlace/Q10294_SporeInfestedPlace.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/quests/Q10294_SporeInfestedPlace/Q10294_SporeInfestedPlace.java index 52148a465d..a2ec08ff72 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/quests/Q10294_SporeInfestedPlace/Q10294_SporeInfestedPlace.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/quests/Q10294_SporeInfestedPlace/Q10294_SporeInfestedPlace.java @@ -22,6 +22,10 @@ import java.util.Set; import org.l2jmobius.gameserver.enums.QuestSound; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; +import org.l2jmobius.gameserver.model.events.EventType; +import org.l2jmobius.gameserver.model.events.ListenersContainer; +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLevelChanged; +import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.NpcLogListHolder; import org.l2jmobius.gameserver.model.quest.Quest; @@ -102,6 +106,8 @@ public class Q10294_SporeInfestedPlace extends Quest case "30120-03.htm": { qs.startQuest(); + final ListenersContainer container = player; + container.addListener(new ConsumerEventListener(player, EventType.ON_PLAYER_LEVEL_CHANGED, (OnPlayerLevelChanged levelChange) -> onLevelUp(levelChange, qs), this)); htmltext = event; break; } @@ -159,7 +165,7 @@ public class Q10294_SporeInfestedPlace extends Quest { htmltext = "30857.html"; } - else if (qs.isCond(3) && (player.getLevel() < 43)) + else if (qs.isCond(3) && (player.getLevel() > 43)) { htmltext = "30857-04.html"; } @@ -188,17 +194,15 @@ public class Q10294_SporeInfestedPlace extends Quest if ((qs != null) && qs.isCond(2)) { final int killCount = qs.getInt(KILL_COUNT_VAR) + 1; - if (killCount < 200) + if (killCount <= 200) { qs.set(KILL_COUNT_VAR, killCount); playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET); sendNpcLogList(killer); } - else + else if (allConditionsMet(killer, qs)) { - qs.setCond(3, true); - giveItems(killer, SOE_HIGH_PRIEST_OVEN); - qs.unset(KILL_COUNT_VAR); + prepareToFinishQuest(killer, qs); } } return super.onKill(npc, killer, isSummon); @@ -217,4 +221,34 @@ public class Q10294_SporeInfestedPlace extends Quest } return super.getNpcLogList(player); } + + @Override + public void onQuestAborted(PlayerInstance player) + { + player.removeListenerIf(EventType.ON_PLAYER_LEVEL_CHANGED, listener -> listener.getOwner() == player); + super.onQuestAborted(player); + } + + private void onLevelUp(OnPlayerLevelChanged event, QuestState qs) + { + final PlayerInstance player = event.getPlayer(); + sendNpcLogList(player); + if (allConditionsMet(player, qs)) + { + prepareToFinishQuest(player, qs); + } + } + + private boolean allConditionsMet(PlayerInstance player, QuestState qs) + { + return (qs != null) && qs.isCond(2) && (player.getLevel() > 43) && (qs.getInt(KILL_COUNT_VAR) >= 200); + } + + private void prepareToFinishQuest(PlayerInstance killer, QuestState qs) + { + qs.setCond(3, true); + giveItems(killer, SOE_HIGH_PRIEST_OVEN); + qs.unset(KILL_COUNT_VAR); + killer.removeListenerIf(EventType.ON_PLAYER_LEVEL_CHANGED, listener -> listener.getOwner() == killer); + } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/quests/Q10295_RespectforGraves/Q10295_RespectforGraves.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/quests/Q10295_RespectforGraves/Q10295_RespectforGraves.java index c1c7519cff..995ee42ff1 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/quests/Q10295_RespectforGraves/Q10295_RespectforGraves.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/quests/Q10295_RespectforGraves/Q10295_RespectforGraves.java @@ -22,6 +22,10 @@ import java.util.Set; import org.l2jmobius.gameserver.enums.QuestSound; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; +import org.l2jmobius.gameserver.model.events.EventType; +import org.l2jmobius.gameserver.model.events.ListenersContainer; +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLevelChanged; +import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.NpcLogListHolder; import org.l2jmobius.gameserver.model.quest.Quest; @@ -101,6 +105,8 @@ public class Q10295_RespectforGraves extends Quest case "30857-03.htm": { qs.startQuest(); + final ListenersContainer container = player; + container.addListener(new ConsumerEventListener(player, EventType.ON_PLAYER_LEVEL_CHANGED, (OnPlayerLevelChanged levelChange) -> onLevelUp(levelChange, qs), this)); giveItems(player, SOE_CEMETERY); htmltext = event; break; @@ -156,7 +162,7 @@ public class Q10295_RespectforGraves extends Quest if ((qs != null) && qs.isCond(1)) { final int killCount = qs.getInt(KILL_COUNT_VAR) + 1; - if (killCount < 300) + if (killCount <= 300) { qs.set(KILL_COUNT_VAR, killCount); playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET); @@ -164,9 +170,10 @@ public class Q10295_RespectforGraves extends Quest } else { - qs.setCond(2, true); - giveItems(killer, SOE_HIGH_PRIEST_OVEN); - qs.unset(KILL_COUNT_VAR); + if (allConditionsMet(killer, qs)) + { + prepareToFinishQuest(killer, qs); + } } } return super.onKill(npc, killer, isSummon); @@ -185,4 +192,35 @@ public class Q10295_RespectforGraves extends Quest } return super.getNpcLogList(player); } + + @Override + public void onQuestAborted(PlayerInstance player) + { + player.removeListenerIf(EventType.ON_PLAYER_LEVEL_CHANGED, listener -> listener.getOwner() == player); + super.onQuestAborted(player); + } + + private void onLevelUp(OnPlayerLevelChanged event, QuestState qs) + { + final PlayerInstance player = event.getPlayer(); + sendNpcLogList(player); + if (allConditionsMet(player, qs)) + { + prepareToFinishQuest(player, qs); + } + } + + private boolean allConditionsMet(PlayerInstance player, QuestState qs) + { + return (qs != null) && qs.isCond(1) && (player.getLevel() > 51) && (qs.getInt(KILL_COUNT_VAR) >= 300); + } + + private void prepareToFinishQuest(PlayerInstance killer, QuestState qs) + { + qs.setCond(2, true); + giveItems(killer, SOE_HIGH_PRIEST_OVEN); + qs.unset(KILL_COUNT_VAR); + sendNpcLogList(killer); + killer.removeListenerIf(EventType.ON_PLAYER_LEVEL_CHANGED, listener -> listener.getOwner() == killer); + } }