Game: RF 4.55 (Dragonborn), server v0.1.2 (also v0.1.1), Windows build.
Client: the supported Taiwan build, RF_Online.bin SHA-256 46528aac…2bbc558 (2025-07-16), Language=Taiwan.
This is a feature gap, not a crash.
Summary
- The client supports premium status: it keeps a premium flag, opens its premium window and adds a buff-bar icon when it receives 39/0C
cash_premiumitem_have. The server never sends 39/0C, so the flag stays off. accounts.premium_level is stored and read with the account, but it changes nothing in game. The only place a premium value reaches game logic is the PvP-cash temp-point cap, and there it's always passed as false.
The client: one flag, set by 39/0C
The premium flag is [0x1028ab4]+0x6a73c (getter 0x442440, setter 0x5977e0). What writes it:
- 39/0C
cash_premiumitem_have (cash_msg; receive handler 0x5975c0, log string cash_premiumitem_have(%d) @0xac25f0):- body (57 bytes):
u8 state, then 12 floats as 6 pairs at offsets 1, 9, 0x11, 0x19, 0x21, 0x29, then 2 floats at 0x31 and 0x35; - state 1 or 2: sets the flag, opens
CGUIPCBangWindow (the window shows only while the flag is set), adds record 0x1e1 of client table 0x11 to the buff bar (CGUISkillForceQueue), stores the 14 floats on the player object (negatives become 0), and refreshes it; - state 0: closes the window, clears the flag, removes the icon;
- any other state does nothing.
Nothing in the client reads the 14 floats. In a full disassembly, the only instructions touching those player
fields (+0x6028–+0x608c) are the two setters (0x40bb50, 0x40bcb0) and a whole-object copy. So
01 followed by 56 zero bytes is enough to turn premium on, with no side effects. (Static reading; not
live-tested.)
- The launcher data loader (
.\System\DefaultSet.tmp, logs Premium = %d @0xaf9da0) forces the field to 0, so the launcher can't turn premium on. PremiumSVRAction (premium y / premium n) toggles the flag locally and sends the text. It looks like a GM/debug command.
What reads it: 17 call sites, including the overlay (1-1000-1 Add Premium Img @0xaf9d30 is logged when the flag
is set), the cash-shop UI, and the 3B/06–3B/09 coupon / play-time notify handlers.
Related client pieces: 3B/10 notify_not_use_premium_cashitem_zocl (handler 0x5b9840) and
DataTable\ItemPremium.edf (@0xad9398).
The server never sends it
In gameserver.exe v0.1.2 (and v0.1.1):
- No code writes the header 39/0C or 3B/10. The same search finds the cash/notify headers the server does send (39/07, 3B/05, 3B/11).
- No function name contains "premium". The cash code (
(*Server).deliverCashItems 0x1407765c0, (*Server).cashItemDurPoint 0x140776c60) is cash-shop delivery only.
premium_level does nothing in game
gamedata.(*Data).PvpTempCashBounds(level, premium) (0x14050afe0) picks the "premium" or "normal" rows of
cfg_pvp_point_limit. The premium rows are 1.5× normal at every level from 40 to 66 (e.g. L45 1200→1800,
L66 13000→19500).
Its only caller is (*Server).tempCashBounds (0x140893c60), and it passes premium as a constant false:
140893c90: movzx ebx, al ; level
140893c93: mov rax, rcx ; *Data
140893c96: xor ecx, ecx ; premium = false
140893c98: call 0x14050afe0 ; gamedata.(*Data).PvpTempCashBounds
So the premium rows are loaded but never used. We found no other code that uses a premium value, including
awardExp (0x1407ac200) and dropLoot (0x1407d43a0).
About PC-bang
In this client, "premium" and PC-bang look like the same feature: the window 39/0C opens is CGUIPCBangWindow, and
the English names of the items with pc in their codes say "Premium" (iicpc01 "Premium Ring", iabpc01 "Premium
Amulet", umbpc01 "Premium Advanced UMT").
Seen the schema note that PC rooms will never be run. This request needs none of that: no play-time
tracking, no billing, no new columns. It only asks the server to send one existing message for accounts that
already have premium_level > 0.
Request
- For accounts with
premium_level > 0, send 39/0C cash_premiumitem_have at login, with state 1 and the rest of the 57-byte body zeroed, so the client's premium window and icon turn on. - Pass the account's premium state to
tempCashBounds → PvpTempCashBounds, so the existing premium PvP-cash rows take effect. - If other premium perks are intended (an EXP or drop bonus, for example), document what
premium_level should do.