Old School Ops

RF455-059 RF 4.55: a guild's emblem, grade and Honor Guild rank can never be set (1B/7B type 3 refused, grade fixed at 1, 1B/6F always empty)

Game server RF Online: Dragonborn v0.2.0 low · filed by cybercyber
Fixed

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

Summary

The guild tables and the client support guild emblems, guild grades and Honor Guilds, but nothing on the server sets them:

  • Emblem: a guild master who picks an emblem in the guild window gets an error. The server answers the request with "verb not implemented in this slice". Every guild keeps emblem_back / emblem_mark = 0xFFFFFFFF forever, so no guild ever shows an emblem.
  • Grade: guilds.grade is written once, as 1, when the guild is founded, and no code changes it afterwards.
  • Honor Guild: the honor list request always gets an empty list, and there is no handler for setting honor guilds. No player ever shows the "1st"…"5th" honor tag.
  • Guild-master aura: the client draws the master's aura only when the guild's grade is 3 or more, so with the grade stuck at 1 it never appears.

found this by reading gameserver.exe and the client, after looking for why no guild ever shows an emblem. Haven't reproduced the in-game refusal live yet. Every address below is from the stock v0.2.0 binaries.

1. Emblem: 1B/7B type 3 is refused

What the client sends. The guild window's emblem board sends 1B/7B guild_manage_request_clzo, 0x1D bytes (Send_1B_7B, client 0x5b6bb0):

OffsetField
0x00u8 type = 3
0x01u32 the master's avatar serial
0x05u64 emblem back: cell << 16 | RGB565 colour (sign-extended u32)
0x0Du64 emblem mark: the same
0x15padding

The cells index SpriteImage\common\emblem.spr: page 0 holds the backgrounds (cells 1–22) and page 1 the marks (cells 1–77), in 64×64 cells. The colour is packed by client 0x5e6660 from the board's ARGB. This is the same u32 pair the server already stores in guilds.emblem_back / emblem_mark and sends in 1B/03 and 1B/22.

What the server does. (*Server).handleGuildManage (0x14082aa60) handles only type 1 (expel, guildManageExpulse) and type 4 (committee, guildManageCommittee). Types 0, 2, 3 and 5 log guild manage: verb not implemented in this slice and reply 1B/7C with error 0xCA, which the client shows as an error.

The other gap. No SQL in the binary ever writes the emblem. The only statement naming emblem_back / emblem_mark is the founding INSERT INTO guilds (serial, name, race, grade, emblem_back, emblem_mark, …). The only guild UPDATEs are master_serial, possible_elect_master and disbanded_at.

Expected: type 3 checks the sender is the master (as the client only offers the board to the master), then:

  • stores the pair in the guild record and in guilds;
  • replies 1B/7C 0;
  • tells every member online with 1B/28 guild_info_update_inform_zocl: u32 serial, u8 grade, u32 back, u32 mark, u32 ×3. The client already handles 1B/28 (0x5af660): it updates its guild cache and every member in view (0x51ff90).

Players who see the guild later get it from the 1B/22 reply the server already sends.

2. Grade never changes

grade is written only by the founding INSERT, with the default 1 (guildLifeRecordFrom 0x14081c0e0). No UPDATE guilds SET grade exists. The client reads the grade from 1B/22 +0x15 into its guild cache (+0x2c). Two things depend on it:

  • the guild window shows it;
  • the guild-master aura (0x7dde30, at 0x7deb91–0x7decc5) plays only when the cached grade is ≥ 3.

So no guild master ever has the aura. Expected: the grade rises by whatever the server's guild-grade rule is, and a change goes out in 1B/28.

3. Honor Guild is a stub

  • 1B/6F handleGuildHonorList (0x1407aef20) always calls protocol.GuildHonorListResult (0x14064ca80) with a nil list and count 0, so 1B/70 is always empty. The source file gommo/games/rf455/protocol/guildhonor.go is in the binary.
  • These have no handler and are never sent:
    • 1B/71 honor set (the client sends 0x6F bytes: 5 × 0x16 entries) → 1B/72;
    • 1B/75 patriarch honor set inform;
    • 1B/76 → 1B/77 next list;
    • 1B/7A guild_honorguild_mark_zocl {u8 rank, u32 avatar serial, u8 kind};
    • 1B/78 guild_master_info.
  • The client takes the honor rank (0–4 = "1st".."5th", 0xFF none) from 1B/7A, from 03/1F +0x3D, 03/22 +0x23 and 03/04 +0x1AD (0x44d860 sets the tag). The 62-byte 03/1F has no byte there (RF455-029), and 1B/7A is never sent.

Expected: the patriarch (Archon) can choose the race's honor guilds with 1B/71, as in the original game. The server then sends 1B/7A to their members and keeps the rank in the 03/1F and 03/04 it sends.

Where to look

  • Server: handleGuildManage 0x14082aa60, guildManageGateLocked 0x14082b1c0, handleGuildHonorList 0x1407aef20, guild.(*Repository).LoadAll 0x140709920, guildDownloadInfo 0x140819220, guildQueryInfoReply 0x1408197a0.
  • Client: 1B/7B sender 0x5b6bb0, 1B/7C 0x5b6d90, 1B/22 0x5af570, 1B/28 0x5af660, 1B/7A 0x5b6ac0, honor tag 0x44d860, aura 0x7deb91.
Reported on version 0.2.0

Replies 1

OSO AI Staff
2h ago

Reported: In RF 4.55 a guild master cannot set a guild emblem, a guild's grade never moves from 1 (so the guild master's aura never shows), and the Honor Guild list is always empty.

Found: The report is correct on all three. The server answered the emblem request from the guild window with a refusal instead of saving it, and nothing ever changed a guild's stored emblem after founding. It also read the 4.55 emblem request at the wrong size, so the mark would have been read from the wrong place. A guild's grade was set to 1 at founding and no rule ever raised it. The Honor Guild list is answered empty every time.

In the original game the emblem is paid for from the guild treasury, and the treasury could not be filled here: guild deposits and the guild master's withdrawals were not handled either.

Fix: in the next RF 4.55 update, following the original game's rules:

  • Guild treasury: any member can deposit dalant and gold, and the guild master can withdraw to any guild member who is online. Every deposit, withdrawal and purchase reaches all online members and is kept in the guild's money history. The original limits apply: up to 3,000,000,000 per transfer, a treasury of at most 1,000,000,000 dalant and 500,000 gold, and no withdrawal that would take a character past 2,000,000,000 dalant or 500,000 gold.
  • Emblem: the guild master of a grade 2 or higher guild picks a background and a mark in the guild window; it costs 3,000,000 dalant from the guild treasury, a combination another guild already uses is refused, and the new emblem is shown to everyone at once.
  • Grade: once a day guilds are ranked by the combined level and PvP points of their members, and stronger guilds move up, from grade 1 to grade 7. Members online see the new grade at once, so the guild master's aura can appear once a guild reaches grade 3. A guild alone on its server stays at grade 1.

Also affected: the Golden Age and Age of Patron servers get the same treasury, emblem and grade changes. Their Honor Guild list is empty too.

Please file separately:

  • Honor Guild: the race leader choosing the honor guilds, the "1st" to "5th" honor tag on members, and the honor list. It is a system of its own that needs its own decision, so its own id is what that change will cite.

Sign in to comment.

Top xp sources

How xp works
Loading…

Open the full search page