Table of Contents

Struct GuildAddEntry

Namespace
FishMMO.Shared
Assembly
FishMMO.Shared.dll

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

long

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

long

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

int

Location

Location of the member (may be used for online status or region).

public string Location

Field Value

string

OfficerNote

Note about this member visible only to ranks holding ViewOfficerNotes.

public string OfficerNote

Field Value

string

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

string

RaceID

The member's race identifier, for the roster's class column.

public int RaceID

Field Value

int

RankOrder

The member's rank ORDER — the position on the guild's ladder, not a fixed enum value.

public byte RankOrder

Field Value

byte

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.