diff --git a/Server/src/main/content/global/dialogue/TownCrierDialogue.java b/Server/src/main/content/global/dialogue/TownCrierDialogue.java
index e740fbfa2..f330bda86 100644
--- a/Server/src/main/content/global/dialogue/TownCrierDialogue.java
+++ b/Server/src/main/content/global/dialogue/TownCrierDialogue.java
@@ -2,6 +2,7 @@ package content.global.dialogue;
import content.global.handlers.item.book.GeneralRuleBook;
import core.game.dialogue.DialoguePlugin;
+import core.game.diary.DiaryLevel;
import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.diary.DiaryType;
@@ -10,6 +11,10 @@ import core.game.world.GameWorld;
import core.game.world.update.flag.context.Animation;
import core.plugin.Initializable;
import core.tools.RandomFunction;
+import org.rs09.consts.NPCs;
+
+import static content.region.misthalin.lumbridge.diary.LumbridgeAchivementDiary.Companion.BeginnerTasks.DRAYNOR_TALK_TO_TOWNCRIER_ABOUT_RULES;
+import static core.api.ContentAPIKt.finishTask;
/**
* Represents the town crier dialogue plugin.
@@ -127,9 +132,8 @@ public final class TownCrierDialogue extends DialoguePlugin {
return true;
}
});
- // Find out about the Rules of Conduct from the Draynor
Town Crier
- if (npc.getId() == 6136) {
- player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 10);
+ if (npc.getId() == NPCs.TOWN_CRIER_6136) {
+ finishTask(player, DiaryType.LUMBRIDGE, DiaryLevel.BEGINNER, DRAYNOR_TALK_TO_TOWNCRIER_ABOUT_RULES);
}
stage = 71;
break;
diff --git a/Server/src/main/core/api/ContentAPI.kt b/Server/src/main/core/api/ContentAPI.kt
index 71eb72f91..2acac9bea 100644
--- a/Server/src/main/core/api/ContentAPI.kt
+++ b/Server/src/main/core/api/ContentAPI.kt
@@ -25,6 +25,7 @@ import core.game.consumable.*
import core.game.container.impl.EquipmentContainer
import core.game.dialogue.DialogueFile
import core.game.dialogue.SkillDialogueHandler
+import core.game.diary.DiaryLevel
import core.game.ge.GrandExchangeRecords
import core.game.interaction.*
import core.game.node.Node
@@ -42,6 +43,7 @@ import core.game.node.entity.player.link.HintIconManager
import core.game.node.entity.player.link.IronmanMode
import core.game.node.entity.player.link.TeleportManager
import core.game.node.entity.player.link.audio.Audio
+import core.game.node.entity.player.link.diary.DiaryType
import core.game.node.entity.player.link.emote.Emotes
import core.game.node.entity.player.link.prayer.PrayerType
import core.game.node.entity.player.link.quest.Quest
@@ -3335,4 +3337,33 @@ fun openSingleTab(player: Player, component: Int) {
player.interfaceManager.openSingleTab(Component(component))
}
+/**
+ * Finish an achievement diary task for the player.
+ * @param player the player who just finished the task.
+ * @param diary the diary the task belongs to.
+ * @param level the level of the task.
+ * @param task The task that was just finished.
+ */
+fun finishTask(player: Player, diary: DiaryType, level: DiaryLevel, task: Int) {
+ player.achievementDiaryManager.finishTask(player, diary, getDiaryLevelIndex(diary, level), task)
+}
+
+/**
+ * Resolves a [DiaryLevel] to an index for a specific diary.
+ * @param diary The diary the task belongs to.
+ * @param level The task level in the diary.
+ * @throws IllegalArgumentException if the level is not present in the diary.
+ * @return the index of the level that can be used with [core.game.node.entity.player.link.diary.AchievementDiaryManager.finishTask].
+ */
+fun getDiaryLevelIndex(diary: DiaryType, level: DiaryLevel): Int {
+ val levelName = level.name.lowercase().replaceFirstChar { c -> c.uppercase() }
+ val levelIndex = diary.levelNames.indexOf(levelName)
+
+ if (levelIndex < 0) {
+ throw IllegalArgumentException("'$levelName' was not found in diary '$diary'.")
+ }
+
+ return levelIndex
+}
+
private class ContentAPI
diff --git a/Server/src/main/core/game/diary/DiaryEventHookBase.kt b/Server/src/main/core/game/diary/DiaryEventHookBase.kt
index 4fb85b0cd..692759fd9 100644
--- a/Server/src/main/core/game/diary/DiaryEventHookBase.kt
+++ b/Server/src/main/core/game/diary/DiaryEventHookBase.kt
@@ -180,16 +180,7 @@ abstract class DiaryEventHookBase(private val diaryType: DiaryType) : MapArea, L
)
}
- private fun findIndexFor(level: DiaryLevel): Int {
- val levelName = level.name.lowercase().replaceFirstChar { c -> c.uppercase() }
- val levelIndex = diaryType.levelNames.indexOf(levelName)
-
- if (levelIndex < 0) {
- throw IllegalArgumentException("'$levelName' was not found in diary '$diaryType'.")
- }
-
- return levelIndex
- }
+ private fun findIndexFor(level: DiaryLevel): Int = getDiaryLevelIndex(diaryType, level)
protected open fun onAreaVisited(player: Player) {
areaTasks.forEach {