Struct GuildAddEntry
One guild roster row on the wire: everything about a member EXCEPT which guild they are in.
public struct GuildAddEntry
- Inherited Members
Remarks
The guild identity lives on the message, not on the row. A roster payload describes exactly one guild, so repeating its id against every member spent eight or nine bytes per row to restate a value the reader already had. Carrying it once on GuildAddMultipleBroadcast — and once on the single-member GuildAddBroadcast — says the same thing without paying per member.
Fields
CharacterID
Character ID of the member being added.
public long CharacterID
Field Value
LastOnlineUnixSeconds
Unix time in SECONDS (UTC) of the member's last character save, used as a last-seen figure for members who are not connected. Zero or less means unknown.
public long LastOnlineUnixSeconds
Field Value
Remarks
Seconds, not ticks. The only consumer is the roster's last-seen column, which renders
"Just now / 12m ago / 3h ago / 5d ago" — whole minutes at its finest — so sub-second
precision is deliberately not carried. A tick count is around 6.4e17 and costs nine
bytes as a packed varint; a Unix second is around 1.8e9 and costs five, per member, on
every roster refresh. Use DateTimeOffset.ToUnixTimeSeconds and
DateTimeOffset.FromUnixTimeSeconds to convert; the value stays a plain 64-bit
integer so the serializer has nothing to infer about DateTimeKind.
Level
The member's character level, for the roster's level column.
public int Level
Field Value
Location
Location of the member (may be used for online status or region).
public string Location
Field Value
OfficerNote
Note about this member visible only to ranks holding ViewOfficerNotes.
public string OfficerNote
Field Value
Remarks
EMPTY unless the recipient's own rank holds the permission. The filter is applied on the server, where the roster payload is built, and the column simply is not written into the message for anybody else. Sending it and hiding it in the panel would put the text one packet capture away from every member of the guild, which is the opposite of what an officer-only note is for.
PublicNote
Note about this member visible to every member of the guild.
public string PublicNote
Field Value
RaceID
The member's race identifier, for the roster's class column.
public int RaceID
Field Value
RankOrder
The member's rank ORDER — the position on the guild's ladder, not a fixed enum value.
public byte RankOrder
Field Value
Remarks
This was GuildRank. It is now the raw ordering byte, because a guild's ranks are
rows it owns and their names are whatever it called them; the client resolves the name
from GuildRankListBroadcast and renders that. The VALUE is unchanged —
a member who was an Officer sent 2 before and sends 2 now.