Old School Ops

RF455-042 # RF 4.55: party window shows a squashed icon sheet for every member (10/07 and 10/08 send no class)

Game server RF Online: Dragonborn v0.2.0 normal · filed by cybercyber 14h ago
New

Game: RF 4.55 (Dragonborn), server v0.2.0, Windows build (gameserver.exe SHA-256 96452fbd…d70cec7). Client: the supported Taiwan build, RF_Online.bin SHA-256 46528aac…2bbc558 (8,430,808 bytes, 2025-07-16), Language=Taiwan

Symptom

  1. Form a party.
  2. Every member's row in the party window shows, left of the name, a squashed sheet of class icons with a white box under it, where the member's class logo should be.

It's the same for every member, whatever their race or class.

Cause

The last u32 of each party-member entry is the member's class index:

  • in 10/07 party_join_joiner_result_zocl it's at +0x19 of each 28-byte member entry;
  • in 10/08 party_join_member_result_zocl it's at +0x18.

The server always writes 0xFFFFFFFF there:

  • protocol.PartyJoinerResult (0x1406538a0, the store at 0x140653be5);
  • protocol.PartyMemberResult (0x140653d20, the store at 0x140653f5a);
  • both called from (*Server).completeJoin (0x14089aae0).

What the client does with it (RF_Online.bin addresses):

  1. The 10/07 and 10/08 handlers (0x57f210, 0x57f2e0) pass the value to the party window's add-member (0x6edb50).
  2. Unless it's -1, the window looks the value up in the client's class table (Character.edf, record +4). That's the same lookup it does for your own class from the base download (03/04). It then shows that class's icon from class.spr and the class name.
  3. For -1 it skips that whole branch (0x6edd8c cmp [ebp+0xc],-1; je 0x6ede7d). The picture is left on the bare class.spr page, drawn squashed into the 45×45 slot.

Nothing else tells the client another player's class. 03/1F (another player's look) carries none.

Suggested fix

Send the member's class index in that u32. It's the same value the base download (03/04) gives for the character's own class, class.m_dwIndex, which equals the client's Character.edf record +4 for all 165 classes (BWB0 = 0, BRB0 = 15).

If there's no class to send, use a value that matches no class (for example 0xFFFFFFFE) rather than -1. The client then shows its own "no class" picture ({EtcUI.spr, 0, 2}) instead of the raw sheet.

Related, client-side: the four base classes share one logo

Once the server sends the class, members in a job class (grade 1 and up) get their own icon. Members still in a base class (Warrior, Ranger, Spiritualist, Specialist, grade 0) all get the same orange logo.

  • In 0x6edb50, after the lookup, the client reads the class grade (Character.edf record byte 1, gamedata m_nGrade): 0x6eddb5 call 0x41ea70; test; jne 0x6eddf9.
  • Grade 1+ gets the class's own icon (record +0x4c, gamedata m_nIconIDX).
  • Grade 0 gets {EtcUI.spr, 0, 2} regardless.

The base classes do have their own icons in class.spr (m_nIconIDX: Bellato Warrior 1, Ranger 8, Spiritualist 15, Specialist 22; Cora 29, 36, 43, …).

Reported on version 0.2.0

History

  • cybercyber filed it · 14h ago
  • cybercyber edited: the body · 13h ago

Replies

Nobody has replied yet.

Sign in to comment.

Loading…
Open the full search page