diff --git a/src/main/java/emu/grasscutter/data/def/QuestData.java b/src/main/java/emu/grasscutter/data/def/QuestData.java index 31ac2ce7e..13e806dab 100644 --- a/src/main/java/emu/grasscutter/data/def/QuestData.java +++ b/src/main/java/emu/grasscutter/data/def/QuestData.java @@ -15,6 +15,9 @@ public class QuestData extends GameResource { private int Order; private long DescTextMapHash; + private boolean FinishParent; + private boolean IsRewind; + private LogicType AcceptCondComb; private QuestCondition[] acceptConditons; private LogicType FinishCondComb; @@ -45,6 +48,14 @@ public class QuestData extends GameResource { return DescTextMapHash; } + public boolean finishParent() { + return FinishParent; + } + + public boolean isRewind() { + return IsRewind; + } + public LogicType getAcceptCondComb() { return AcceptCondComb; } diff --git a/src/main/java/emu/grasscutter/game/quest/GameMainQuest.java b/src/main/java/emu/grasscutter/game/quest/GameMainQuest.java index bf88b8efe..613819d0b 100644 --- a/src/main/java/emu/grasscutter/game/quest/GameMainQuest.java +++ b/src/main/java/emu/grasscutter/game/quest/GameMainQuest.java @@ -91,6 +91,7 @@ public class GameMainQuest { this.isFinished = true; this.state = ParentQuestState.PARENT_QUEST_STATE_FINISHED; this.getOwner().getSession().send(new PacketFinishedParentQuestUpdateNotify(this)); + this.save(); } public void save() { diff --git a/src/main/java/emu/grasscutter/game/quest/GameQuest.java b/src/main/java/emu/grasscutter/game/quest/GameQuest.java index b242166eb..5e1126fcb 100644 --- a/src/main/java/emu/grasscutter/game/quest/GameQuest.java +++ b/src/main/java/emu/grasscutter/game/quest/GameQuest.java @@ -143,21 +143,28 @@ public class GameQuest { this.getOwner().getSession().send(new PacketQuestProgressUpdateNotify(this)); this.getOwner().getSession().send(new PacketQuestListUpdateNotify(this)); - this.save(); - this.tryAcceptQuestLine(); + if (this.getData().finishParent()) { + // This quest finishes the questline - the main quest will also save the quest to db so we dont have to call save() here + this.getMainQuest().finish(); + } else { + // Try and accept other quests if possible + this.tryAcceptQuestLine(); + this.save(); + } } public boolean tryAcceptQuestLine() { try { MainQuestData questConfig = GameData.getMainQuestDataMap().get(this.getMainQuestId()); + for (SubQuestData subQuest : questConfig.getSubQuests()) { GameQuest quest = getMainQuest().getChildQuestById(subQuest.getSubId()); if (quest == null) { QuestData questData = GameData.getQuestDataMap().get(subQuest.getSubId()); - if (questData == null) { + if (questData == null || questData.getAcceptCond() == null) { continue; } diff --git a/src/main/java/emu/grasscutter/game/quest/QuestManager.java b/src/main/java/emu/grasscutter/game/quest/QuestManager.java index 548e8241a..745ce9ef8 100644 --- a/src/main/java/emu/grasscutter/game/quest/QuestManager.java +++ b/src/main/java/emu/grasscutter/game/quest/QuestManager.java @@ -128,7 +128,7 @@ public class QuestManager { QuestData data = quest.getData(); for (int i = 0; i < data.getFinishCond().length; i++) { - if (quest.getFinishProgressList()[i] == 1) { + if (quest.getFinishProgressList() == null || quest.getFinishProgressList()[i] == 1) { continue; }