Progress APIs
This page documents the committed source. Treat revision-sensitive RuneLite UI, packet, or in-game outcomes as pending live-client verification unless the page records direct evidence.
com.n3plugins.sdk.progress owns reference coverage for quest and achievement diary reads. You can find usage examples in SDK Examples And Best Practices; this page serves as the API reference.
Progress APIs read eligibility/progress state. They do not perform quest steps, claim diary rewards, or click Quest Helper targets.
QuestProgressApi
QuestProgressApi wraps RuneLite Quest state reads and adapts walker QuestRequirement checks.
QuestState state = QuestProgressApi.state(Quest.COOKS_ASSISTANT);
InteractionResult complete = QuestProgressApi.isComplete(Quest.COOKS_ASSISTANT);
Optional<Quest> quest = QuestProgressApi.findQuest("Cook's Assistant");
Optional<QuestProgress> progress = QuestProgressApi.progress("COOKS_ASSISTANT");
InteractionResult allowed = QuestProgressApi.satisfies(requirement);
Methods:
state(quest)- current quest state, orQuestState.NOT_STARTEDwhen the quest is null or unavailable.isStarted(quest)- true when the quest state is notNOT_STARTED.isComplete(quest)- true when the quest state isFINISHED.progress(quest)- immutableQuestProgress, or empty for null quests.all()- progress for every RuneLiteQuestenum value.started()- started or completed quest snapshots.completed()- completed quest snapshots.findQuest(name)- finds by enum name or player-facing quest name using normalized case/punctuation-insensitive matching.progress(name)- resolves a name withfindQuest(...)and returns progress.satisfies(requirement)- evaluates a walkerQuestRequirementagainst the current quest state.setStateReaderForTesting(reader)andresetStateReaderForTesting()- test hooks for quest-state reads.
QuestProgress contains the Quest, display name, QuestState, started flag, and complete flag.
DiaryProgressApi
DiaryProgressApi exposes mapped achievement diary task progress backed by stable RuneLite varbits or varplayers.
Optional<DiaryProgress> lumbridgeEasy =
DiaryProgressApi.progress(DiaryRegion.LUMBRIDGE, DiaryTier.EASY);
List<DiaryProgress> varrock = DiaryProgressApi.forRegion(DiaryRegion.VARROCK);
InteractionResult taskDone = DiaryProgressApi.isComplete(task);
Methods:
progress(region, tier)- progress for a mapped diary tier, or empty when no stable mapping exists.all()- every mapped diary tier.forRegion(region)- all mapped tiers in one diary region.tasks(region, tier)- immutable mapped task list for a diary tier.isComplete(task)- true when a mapped task's completion mask is set.progress(task)-DiaryTaskProgressfor one mapped task.setReadersForTesting(varbitReader, varPlayerReader)- test hook for raw variable reads.setTasksForTesting(tasks)- test hook for mapped task coverage.resetForTesting()- restores live readers and default mappings.
DiaryProgress contains region, tier, mapped task progress, completed task count, total mapped task count, and an isComplete() flag. DiaryTask stores region, tier, display name, source kind (VARBIT or VARPLAYER), variable id, and completion mask. DiaryTaskProgress stores the mapped task, raw variable value, and complete flag.
Diary coverage is intentionally partial. The API exposes only explicitly mapped varbit/varplayer-backed tasks; it does not guess unmapped tasks.