QuestObjective.txt

Objectives for each quest: how many of which monster to kill, which items to collect (with drop-rate override and monster filter), or how much money the player must surrender. A quest can have multiple objectives keyed by Number.

File Location#

Data/Quest/QuestObjective.txt

Loaded once at GameServer startup. Changes require a restart.

Format#

//Number Type Index Quantity Level Option1 Option2 Option3 NewOption DropMinLevel DropMaxLevel ItemDropRate RequireIndex RequireState DW DK FE MG DL SU RF
0 2 0 10000 0 0 0 0 0 * * * 0 0 1 1 1 0 0 1 0
end

Terminated by end.

Columns#

ColumnTypeEffect
NumberintObjective slot within the quest (0-4). Kill-count objectives use this slot to track progress per monster
Type0, 1, 2, 4Objective kind. See Type values
IndexintTarget ID - meaning depends on Type
QuantityintTarget amount. For items the required count in inventory, for money the zen amount, for monsters the kill count
LevelintRequired item +level (item objectives only)
Option1 / Option2 / Option3intRequired item options (item objectives only)
NewOptionintRequired excellent option bitmask (item objectives only)
DropMinLevelint or *Lower bound of the monster-level range that drops the target item, or -1 to switch to exact monster-class matching
DropMaxLevelint or *Upper bound of the monster-level range. When DropMinLevel is -1, this column is instead read as a monster Class ID and only that class drops the item
ItemDropRateint or *Drop-rate override out of 10000 (1 = 0.01%). Rolled on every kill that passes the monster filter
RequireIndexintQuest this objective belongs to. Must match a Quest.txt Index
RequireState0-3Required quest state for this objective row to be active. 1 means the objective applies while the quest is accepted
DW ... RF0-2Per-class gate. 0 hides the objective for that class, 1 requires base class, 2 requires first class change or higher

* is stored as -1 and disables the corresponding check.

Type Values#

ValueMeaning
0Empty slot. Skipped entirely
1Collect items. Index = item ID, Quantity = count required in inventory, Level = required +level, Option1/2/3 and NewOption filter specific item variants. The drop filter (DropMinLevel, DropMaxLevel, ItemDropRate) governs when matching monsters drop the quest item while this objective is active
2Surrender money. Index is ignored, Quantity = zen amount. Deducted from the character when the quest advances
4Kill monsters. Index = monster Class ID, Quantity = kill count. Progress is tracked per Number slot and persisted through DataServer

Kill-Count Tracking#

Kill counts are stored in a per-character array of five slots. When the player accepts a quest, the server initialises one slot per Type == 4 objective using the objective's Number as the slot index. The server also remembers a single QuestKillCountIndex - the quest whose kill counts are currently loaded - so only one kill-count quest can be active at a time.

Item Drop Filter#

For item objectives, a monster drops the quest item only if:

  • DropMinLevel == -1 and the monster's Class ID equals DropMaxLevel, or
  • DropMinLevel != -1 and the monster's level is within DropMinLevel..DropMaxLevel inclusive

When the filter passes, the server rolls against ItemDropRate out of 10000. In party play the server iterates party members and uses the first eligible one.

Cross-File Dependencies#

AttributeRelated in
RequireIndexQuest.txt
Index for Type 1Item.xml
Index for Type 4 and DropMaxLevel when DropMinLevel == -1Monster.xml
Monster-level filter sourceMonster.xml Level column
Drop-rate scalingCommon.dat ItemDropRate_AL0-3
Map context for kill objectivesMapManager

Common Issues#

  • Item never drops for the quest - ItemDropRate is 0, the monster is outside the level range, or the monster Class ID does not match when DropMinLevel == -1
  • Kill count does not advance - Index is not the monster's Class ID, or the quest state is not 1, or Number collides with another objective of the same quest
  • Money deducted but quest not advancing - other objectives on the same quest are still short, or a Type 2 row is missing for that class column
  • Objectives visible for the wrong class - per-class column is non-zero for a class that should not see the objective; 0 hides it completely
  • Kill count resets unexpectedly - the player accepted another kill-count quest, overwriting QuestKillCountIndex (only one kill-count quest can be tracked at a time)

Last updated April 21, 2026