Custom Quests

The Custom Quests system adds server-defined quests with objectives and rewards, shown in an in-game quest log. It is free and always on. Players open the quest window with the O hotkey.

File Location#

Data/Plugins/Quests/

Each quest is its own .xml file in this folder. An optional Settings.xml in the same folder controls global limits. A _TEMPLATE - Quest Format Reference.xml reference file ships one level up, in Data/Plugins/, and is never loaded as a quest (see below).

Dependencies#

Depends OnPurpose
Item configurationItem identity for CollectItem objectives and Item rewards (ItemType / ItemIndex)
common.datMaxLevelUpQuest caps Experience rewards; AccountLevel tiers matched by requirement fields

How Files Are Loaded#

The folder is scanned for *.xml in alphabetical order at startup.

  • The quest id comes from the leading number of the filename, not from anything inside the XML. 015 - The Kundun Contract.xml becomes quest id 15. 7 - Foo.xml becomes quest id 7.
  • Valid id range: 0 to 1023.
  • A file whose name does not start with a number is skipped. The shipped _TEMPLATE ... reference file lives outside this folder anyway, and its leading _ would keep it from loading even if copied in. To turn it into a quest, copy it into Data/Plugins/Quests/ and rename it to NNN - Some Name.xml.
  • Settings.xml is reserved and is never treated as a quest.
  • If two files resolve to the same id, the first one loaded wins and later duplicates are skipped.

Quest Structure#

<Quest>
  <General .../>
  <Requirements .../>
  <Text>
    <Summary>...</Summary>
    <Description>...</Description>
  </Text>
  <Objectives>
    <Objective .../>
  </Objectives>
  <Rewards>
    <Reward .../>
  </Rewards>
</Quest>

The root <Quest> element is required or the file is ignored. Every child section is optional; a missing section uses the defaults below.

General#

Quest identity and repeat policy.

AttributeTypeDefaultEffect
Namestring""Display name in the quest log
CategorystringMainTab / grouping label in the quest log
Orderint0Sort order within the category, ascending
RepeatenumOneTimeOneTime, Daily, Weekly, or Cooldown (case-insensitive; unknown falls back to OneTime). Weekly resets for everyone at the same time (WeeklyResetDay + DailyResetHour in Settings.xml); Cooldown with CooldownHours="168" is a rolling 7 days from each player's own turn-in
CooldownHoursint0Hours between completions; only used when Repeat="Cooldown"
PrerequisiteQuestIdint-1Quest id that must be completed first. -1 = no prerequisite
Enabledint (0/1)10 = quest still loads but cannot be accepted
HideWhenCompletedint (0/1)00 = a finished quest stays in the quest window, listed in the green "completed" colour. 1 = it disappears from the list once the player completes it. Only affects Repeat="OneTime" quests
AutoAcceptint (0/1)01 = this quest is accepted on its own the moment its PrerequisiteQuestId quest is turned in (chain quests). Normal checks still apply (level, class, resets, free quest slot). If one fails, the player accepts it by hand later

Requirements#

Level, reset, and class gating. All optional. A range bound of -1 means "no limit" for the reset and account-level fields.

AttributeTypeDefaultEffect
MinLevelint0Minimum character level, inclusive
MaxLevelint400Maximum character level, inclusive. The client treats 400 or higher as "no cap"
MinResetint-1Minimum resets. -1 = ignore
MaxResetint-1Maximum resets. -1 = ignore
MinMasterResetint-1Minimum master resets. -1 = ignore
MaxMasterResetint-1Maximum master resets. -1 = ignore
MinGrandResetint-1Minimum grand resets. -1 = ignore
MaxGrandResetint-1Maximum grand resets. -1 = ignore
MinAccountLevelint-1Minimum VIP / premium account tier. 0 = non-VIP, higher = paid tiers. -1 = ignore
MaxAccountLevelint-1Maximum VIP / premium account tier. -1 = ignore
ClassesstringallComma list of class tokens (substring-matched). Empty or unmatched = all classes

Class tokens map to the base race, so each covers its evolutions:

TokenCovers
DWDark Wizard / Soul Master / Grand Master
DKDark Knight / Blade Knight / Blade Master
ELFFairy Elf / Muse Elf / High Elf
MGMagic Gladiator / Duel Master
DLDark Lord / Lord Emperor
SUMSummoner / Dimension Master / Narcissist Master
RFRage Fighter / Fist Master

Text#

Player-facing strings held as element text (not attributes). <Summary> is the short line in the list; <Description> is the detail-pane body and may wrap over multiple lines. Both default to empty.

Objectives#

Up to 8 objectives per quest. A 9th and beyond are ignored. Each <Objective> takes an optional Text attribute (the log line for that step). The other attributes depend on Type. Type is case-insensitive; an unrecognized value falls back to VisitMap.

TypeAttributesBehavior
KillMonsterMonsterClass (0), Count (1), Map (-1)Kill Count of a monster class. Map restricts to a map number; -1 = any map
CollectItemItemType (0), ItemIndex (0), Count (1), Consume (1), Level (-1)Have or turn in items. Consume=1 takes the items on turn-in; Consume=0 is a "have it" check only. Level sets which item level counts and is taken (-1 = any level). Live-counted as you gain or lose the item. A quest may list each item and each currency only once; a quest that lists one twice is not loaded
ReachLevelLevel (0)Reach a character level. Seeded on accept, so an already-high-level player completes it immediately
TalkNpcNpcClass (0)Talk to an NPC by class index
WinEventEventIndex (0), EventLevel (-1), Count (1)Win event runs. Wired event ids in this build: 0 = Blood Castle, 2 = Chaos Castle. EventLevel restricts to a level; -1 = any
CurrencyCurrencyType (Zen), Amount (0)Reach or spend a currency balance. Types: Zen, WCoin, Goblin. Spent on turn-in. Live-counted from the current balance
VisitMapMap (0), X1 (0), Y1 (0), X2 (255), Y2 (255)Stand within a map rectangle in tile coordinates. The default rectangle covers the whole map

Rewards#

Granted on turn-in. No hard cap on count. Type is case-insensitive; an unrecognized value falls back to UnlockQuest.

TypeAttributesBehavior
ZenAmount (0)Zen added
ExperienceAmount (0)Quest experience, capped by the server's MaxLevelUpQuest
ItemItemType (0), ItemIndex (0), Level (0), Skill (0), Luck (0), Option (0), Excellent (0), Count (1)Gives an item. Needs a free inventory slot per item reward. Excellent is a bitmask. Ancient, Durability, and Duration are parsed but not applied in this build
PointsPointType (Normal), Amount (0)Normal = level-up stat points; Master = master-level points
CurrencyCurrencyType (Zen), Amount (0)Gives currency. Types: Zen, WCoin, Goblin (Ruud = no-op)
BuffBuffIndex (0), Value1 (0), Value2 (0), DurationMin (0)Applies a server effect. DurationMin is in minutes
ItemBagBagIndex (0)Drops an item bag at the player's feet. Not inventory-room checked
UnlockQuestQuestId (0)Documents intent only. Chaining is driven by PrerequisiteQuestId on the next quest, not by this reward

Settings.xml#

Optional file in the same folder. Absent = defaults.

<?xml version="1.0" encoding="utf-8"?>
<CustomQuest ActiveCap="5" DailyResetHour="0" WeeklyResetDay="1" RewardToInventory="0" />
AttributeTypeRangeDefaultEffect
ActiveCapint1-55Maximum simultaneously-active quests. Values outside 1-5 are clamped
DailyResetHourint0-230Server local hour at which Daily quests become available again. Weekly quests reset at this hour too
WeeklyResetDayint0-61Day Weekly quests become available again: 0 = Sunday, 1 = Monday ... 6 = Saturday. Out of range = Monday
RewardToInventoryint0-101 = Item and ItemBag rewards go straight into the inventory. If the inventory is full at that moment, the item drops at the player's feet (only they can pick it up). In this mode an ItemBag gives items only: its zen roll, random set-item roll and firework are skipped. 0 = drop at the player's feet

Gameplay Event Hooks#

Quest objectives are driven by the GameServer's shared gameplay-event bus. The same bus feeds the paid Achievements plugin, so both systems see identical events and stay in sync.

EventQuest objective todayAlso available to achievements
Monster killKillMonsteryes
Level upReachLevelyes
NPC talkTalkNpcyes
Map changeVisitMapyes
Event win (Blood Castle 0, Chaos Castle 2)WinEventyes
Item / zen balanceCollectItem, Currency- (live counted, not an event)
Boss kill, PvP kill, reset, chaos mix result, item upgrade (+N), ground pickup, lucky spin, trade, personal store sale, rare drop, play timenot yet a quest objectiveyes
Quest turn-in-yes: turning in any custom quest fires QuestComplete, so an achievement can reward "complete 10 quests" or "complete quest 15"

Important Behavior#

  • The quest id is the filename number, not any XML field. Renaming a file changes the quest identity and its stored progress binding.
  • Item rewards do not yet apply Ancient, Durability, or Duration even though those attributes parse without error.
  • After editing any file in this folder, reload the plugin or restart the GameServer for changes to take effect.

Examples#

Save as 010 - Spider Cull.xml.

<?xml version="1.0" encoding="utf-8"?>
<Quest>
  <General Name="Spider Cull" Category="Lorencia" Repeat="Daily" Enabled="1" />
  <Requirements MinLevel="6" MaxLevel="50" Classes="DW,DK,ELF,MG,DL,SUM,RF" />
  <Text>
    <Summary>Thin out the spiders near town.</Summary>
    <Description>The roads out of Lorencia are crawling with spiders. Clear eight of them.</Description>
  </Text>
  <Objectives>
    <Objective Type="KillMonster" MonsterClass="3" Count="8" Map="0"
               Text="Kill 8 Spiders in Lorencia" />
  </Objectives>
  <Rewards>
    <Reward Type="Zen" Amount="50000" />
    <Reward Type="Experience" Amount="10000" />
  </Rewards>
</Quest>

Common Issues#

Last updated October 28, 2026