RF455-081 RF 4.55: daily (repeatable) quests can be done only once per character, never again after 24 h
Game: RF 4.55 (Dragonborn), server v0.3.1, Windows build (stock gameserver.exe).
Client: the supported Taiwan build, RF_Online.bin SHA-256 46528aac…2bbc558 (2025-07-16), Language=Taiwan.
Expected (wiki) Credit to RFDB for https://wiki.rfdatabase.net/ : Update 4.15 "Age of Patron": the Captured Keeper's non-battle daily and the HERO's battle daily
can each be done once per 24 h, and they earn the Daily Quest Completion Certificates that the HERO exchanges
(5 / 25 / 45 / 65 / 85 / 198). 4.151 "reworked" the daily without details. The quest data agrees: these quests
have m_bQuestRepeat 1 and m_dRepeatTime 86400.
Summary
- The server never lets a character take a finished quest again (read). Completing any quest adds it to
character_quests_done, and both the NPC's offer list and the grant skip every quest in that list. Nothing removes an entry, andm_bQuestRepeat/m_dRepeatTimeare never read. - So all 118 repeatable quests in
gamedata_rf455.dbare once per character: 72 with a 24 h cooldown (the 4.15 dailies, the Elite training quests), 30 with 12 h, 16 with none. - The certificate exchange can't be reached. The certificates (
iyday01/02/03) come only from the Lv70 and Lv81 dailies, one per completion: four rows per race (two from the Captured Keeper, two from the HERO). Done once each, a character gets at most 4, and the cheapest exchange needs 5. - The server's own embedded schema notes say so: the original's
character_quest_history"carries the repeat-cooldown expiry", and "the repeat-cooldown rules … are not implemented".
Server side (all read, v0.3.1)
- Offer and grant:
handleNPCQuestAccept0x1408bd580→npcQuestOffers0x1408bcd80(which skips any quest for whichhasQuestis true: call at0x1408bcfa2,test al,al; jepast the skip) →grantQuest0x1408fd840, which callshasQuestfirst and, when true, logs "quest grant skipped: already held or already done" and grants nothing. (*client).hasQuest0x1408ffae0returns true when the quest index is in the done map atclient+0x1d8(mapaccess1at0x1408ffb72), or in a held slot.- Completion:
retireCompletedQuest0x1408fb500(fromcreditQuestActUsing,completeQuestSlotandgmPassQuest) stores the done row and callsmarkQuestDoneInSession0x1408f7d00at0x1408fb7c3. There's no repeat check on the way. - The ledger never shrinks: the only SQL on
character_quests_doneis theCREATE,INSERT IGNORE INTO character_quests_done (character_serial, quest_index) VALUES (?, ?)(MarkQuestDone0x1406316c0) andSELECT quest_index FROM character_quests_done WHERE character_serial = ? ORDER BY quest_index(CompletedQuests0x140631840).completed_atis written by its default and never read. NoDELETE. - The repeat columns are unused:
m_dRepeatTimeoccurs only in the loader's field-name list and in the schema comment.character_quest_historyis created but never read or written, andhandleQuestDownloadsends 03/39 (protocol.QuestHistoryDownloadResult0x14066de60) with an empty list (xor eax,eax; xor ebx,ebxat0x140871bce). - In a real save: our
gommo_rf455.dbhas quests 2320 (Q364300) and 2516 (Q364496), both 86400 s, incharacter_quests_donesince 2026-10-04. By the code above they stay blocked. (Read from the DB; i haven't tried to take them again in game.)
The quests affected (read, gamedata_rf455.db)
| NPC | Quests (r = 0 / 3 / 6 for Bellato / Cora / Accretia) | What |
|---|---|---|
Captured Keeper 03035 / 04033 / 05032 | Q3r4401, 461, 513, 563, 613, 661, 701 | hand in ore-processed irhst06–08 |
HERO 030F1 / 040F1 / 050F1 | Q3r4402, 462, 514, 564, 612, 662, 702 | kill 10 Herodian Machine Equipment |
| HERO | Q3r4511, 512, 561, 562, 610, 611 | Elite training (Dungeon06) |
The certificates are a reward of Q3r4661, 662 (third item), 701 and 702. The exchange (combinetable2 rows
22833–22850) matches the wiki's counts.
Suggested fix
When a quest with m_bQuestRepeat 1 completes, record the time (the original keeps it in
character_quest_history.end_time and sends it in 03/39) instead of, or as well as, the permanent done entry.
Then let hasQuest's done test pass once m_dRepeatTime seconds have gone by (or, for repeat time 0, right
away), and send the history in 03/39 so the client can show the cooldown.
Local workaround
Deleting the quest's row from character_quests_done while the character is offline should make it available
again: the done map is filled at login (seedInitialQuest → setQuestsDone 0x1408f7660, which builds the map
at client+0x1d8). This is inferred from the code; i haven't tried it.