Game: RF 4.55 (Dragonborn), server v0.2.0, Windows build (stock gameserver.exe).
Client: the supported Taiwan build, RF_Online.bin SHA-256 46528aac…2bbc558 (2025-07-16), Language=Taiwan.
Summary
Equipment and set items can carry the equip effect codes 17, 22 and 31. The server routes these into combat-stat
slots that no server code reads, so they do nothing. The client still shows them in the tooltip.
| Code | Client tooltip (0x64c070, original zh-tw / our English) | Server route | Gear rows (values) | Sets |
|---|
| 17 | 攻擊傷害值的 %.2f%% 轉換成HP, "converts x% of attack damage into HP" | rate[12] | 4,521 (0.005–0.5) | 108 |
| 31 | 減益效果持續時間 %s, "duration of negative effects" | rate[8] | 3,766 (−0.2 to −0.1) | 6 |
| 22 | 持續損害輔助時間 %s, "duration of continuous harmful effects" | rate[8] | 496 (−0.32 to 0.15) | 0 |
- 45 sets do nothing at all, because code 17 is their only effect: every Ancient accessory set (2 amulets + 2 rings, grades A–O).
- 69 sets lose one effect: the Vampiric Butcher's / Chilling Butcher and Queen's Ring sets, the 2020 Happy New Year sets, the Ultimate / Legendary Black Dragon sets, and the Empire's / Union's / Decem's armour sets.
- Worn gear is hit as well. For example, the 吸血 "Vampire Intense" armour (
iuaww50 and others, code 17 at 0.04) and the 守護 "Guardian Intense" armour (iuawx50 and others, code 31 at −0.1).
Read statically from gameserver.exe v0.2.0, gamedata_rf455.db and the client. Not measured in game.
How equip and set effects reach combat (v0.2.0)
recomputeCombatStats calls applyWornItemEffects (worn gear) and applySetItemEffects (0x1408ddc80, active sets, effects 1..N of the active tier). Both pass each effect to applyEquipEff (0x1407c2b00).applyEquipEff looks the code up in the route table built by gameserver.map.init.4 (map at 0x141429b40): kind 0 → rate[i], 1 → plus[i], 2 → state[i]. The entries in question:- code 17:
{kind 0, index 12}, at 0x1407430b4–0x1407430e2; - code 31:
{kind 0, index 8}, at 0x14074374a–0x140743778; - code 22:
{kind 0, index 8}.
setCombatStats stores the result at client+0x208, a 0x368-byte rate/plus/state block. combatEPLocked (0x1407c4da0) starts from a copy of that block and adds the timed buffs to it.
Nothing reads rate[8] or rate[12]
Checked in v0.2.0:
- Direct field reads.
gosyms.py gameserver.exe struct-reads ").combatEP" 0x368 lists every field the combatEP callers read. Struct offsets 0x40 (rate[8]) and 0x60 (rate[12]) aren't among them. - Indexed reads in
combatEP callers. Each of these has one, and none can reach index 8 or 12:genRateIndex (0x1408a1c60) returns 0, 1 or 29;skillHitPoint uses that index + 2, or 29;weaponGenericAF always returns index 0 (xor eax, eax at 0x1407b8dfd); skillDamage and attackDamage use it;attackFCOf reads rate[2t] / rate[2t+1], and its callers (animusMasterBonus, unitEPBonus) pass t = 0, 1 or 2;elementTol reads plus[15+e] and rate[25+e], with e < 4;effRateBonus is called with 34, 36, 37 and 38.
- Readers of the gear block itself (
client+0x208):gearRate (0x1407c52e0), called only by maxPointsWithGear with 9, 10 and 11;moveSpeedBonus, which reads only plus[20] (block offset 0x290);combatEPLocked (the copy above) and setCombatStats (the writer).- No instruction reads
client+0x248 or client+0x268.
- No other mechanism. There's no life-drain or debuff-duration code under any other name.
drainDP is the defence-point loss on being hit, and it doesn't read the block.
RF455-052Review (unread buff slots, in Review) listed rate[12..13] for the forces Blood Capture and Absorption, and it
called rate[12] "damage → FP". That was my mistake. The client's tooltip for equip code 17, which routes to
rate[12], and Blood Capture's original text (轉值HP) both say HP; rate[13] is the FP one.
If the RF455-052Review fix reads rate[12] from the summed combatEP, worn gear and sets will work too, because that
struct starts from the gear block. Please check that the fix also covers:
- gear and sets, not only timed buffs;
rate[8] (codes 31 and 22), which RF455-052Review didn't list. No skill, force or potion writes rate[8], so only gear and sets would use it.
Questions
- Code 17: should it heal the attacker by x% of the damage dealt? That's how the client's text and the "Vampire" item names read.
- Codes 31 and 22: does a negative value shorten debuffs received? Gear with code 31 carries −0.1 to −0.2 (the "Guardian Intense" armour is −0.1), and code 22 is on rings, amulets and cloaks at −0.32 to +0.15. And what should the +0.5 on the Accretia Empire's sets (
setfa06/09/12/15, setwa19, setfa32) do?
How to reproduce
Expected from the code above; not yet tried live.
- Equip "Vampire Intense" armour (for example
iuaww50, which has code 17 at 0.04) and hit a monster: your HP shouldn't rise with the hits. - Or wear a full Ancient accessory set (for example Ancient Mind Appendix A
iadab03 ×2 + Ancient Mind Wristlet A iidab03 ×2, set setaa02, +6% damage → HP). The set turns on (07/2E result 0), but nothing heals.
Affected sets (server item codes)
- Every effect dead (45 sets): each set is two amulets and two rings of one grade. Grades A–O use the codes
…03, …08 … …73, a step of 5.- Ancient Mind Appendix
iadab03–iadab73 + Ancient Mind Wristlet iidab03–iidab73; - Ancient Cursed Earring
iadac03–iadac73 + Ancient Cursed Armlet iidac03–iidac73; - Ancient Hue Headset
iadaa03–iadaa73 + Ancient Hue Bracer iidaa03–iidaa73.
- One dead effect, code 17 (63 sets):
- Vampiric Butcher's Necklace
iaahb / iabhb / iachb 01–05 + DarkHall Queen's Ring iiahq / iibhq / iichq 01–05; - Chilling Butcher Necklace
iahal17–21, 37–41, 57–61 + Chilling Queen Ring iihal (the same numbers); - 2020 Happy New Year Charm and Ring
iaetw11–13 / iietw11–13; - Ultimate / Legendary Black Dragon armour (
?ht??10–16) + Wing (ikt?020–025); - Empire's Executor / Will / Unity / Mission / Blessing (suffix
ac[rf]50–70); - Bellato Victory Leader, Union's (
bcf50–70) and Decem's (ccf50–70) armour; - the Holy Soul Scream Mask [Event] sets (
?avr55, ?avf55, ?bvf55, ?cvf55).
- One dead effect, code 31 (6 sets): Empire's Executor / Will / Unity / Mission / Blessing with suffix
acw50–70, and Holy Soul Scream Mask ihavw55.