Shaiya Core V9 ships six GM notice commands that let privileged users push messages to individual players, specific maps, entire factions, or the whole world. All commands are parsed on the client inDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/ThalissonTMora/shaiya-chat-native-re/llms.txt
Use this file to discover all available pages before exploring further.
GmCommand_Dispatch @ 0x0047FFD0 after a GM-privilege check, then packaged into 0xF90x-series opcodes and forwarded to ps_game.exe, which routes them through a dedicated jump table at 0x004833F4. Understanding the full chain — command syntax, wire layout, server handler addresses, and scope — is required for any emulator aiming at native client compatibility.
Command Overview
| Command | Native alias (KR) | Syntax | Scope / effect |
|---|---|---|---|
/gmnotice | /운영자공지 | /gmnotice <msg> | Global admin notice — orange text banner, all online players |
/cnotice | /챗공지 | /cnotice <mapId> <msg> | Chat-box notice to a specific map |
/wnotice | /귓공지 | /wnotice <player> <msg> | Whisper notice to a single named player |
/notice | /공지 | /notice <mapId> <msg> | System notice type 0 to a specific map |
/znotice | /맵공지 | /znotice <mapId> <msg> | Zone/map broadcast notice |
/bnotice | /종족공지 | /bnotice <빛|어둠> <mapId> <msg> | Faction-specific notice (Light or Dark only) |
<mapId> is an optional integer parameter. The client extracts it via FUN_0047AAF0, which parses a leading decimal integer from the argument string. If omitted, it defaults to 0.Packet Wire Layouts
All packets below are C→S (clientGame.exe → world server ps_game.exe).
/wnotice — Whisper Notice (0xF908)
Targets a single named player. The target name occupies a fixed 21-byte field (Pattern B/H layout), with an uninitialized tail after the null terminator (see Padding Simulation).
0x1A + msg_len
/bnotice — Faction Notice (0xF90A)
Broadcasts to all players whose faction matches faction_id.
0x0E + msg_len
/gmnotice — Global Admin Notice (0xF906)
No map scope; broadcast is server-wide. The map_id field is absent.
0x03 + msg_len
Standard Map-Scoped Notices (0xF907, 0xF909, 0xF90B)
/cnotice (0xF907), /znotice (0xF909), and /notice (0xF90B) share the same layout:
0x0D + msg_len
The /bnotice Parser Constraint
The/bnotice command will only accept literal Korean faction strings hardcoded in Game.exe .rdata:
.rdata VA | String | Faction ID |
|---|---|---|
0x0074D6F8 | 빛 | 0 (Light) |
0x0074D6F0 | 어둠 | 1 (Dark) |
/bnotice light ... or /bnotice dark ... causes the client to call error handler FUN_00423150 and no packet is sent.
Server-Side Dispatch
Entry Point
Packets with opcodes in the0xF900 series are recognized at 0x0047509F (cmp eax, 0xF900) in the main packet loop of ps_game.exe, then forwarded to router function 0x00482630.
Jump Table @ 0x004833F4
At 0x004826BA, the router indexes into the jump table to select a per-opcode sub-handler:
| Opcode | Handler VA | Server behavior |
|---|---|---|
0xF901 | 0x004826C1 | Target case |
0xF902 | 0x004833BE | Default stub (ret 4) |
0xF903 | 0x004833BE | Default stub (ret 4) |
0xF904 | 0x004828D9 | Admin-level action |
0xF905 | 0x00482A37 | Admin-level action |
0xF906 | 0x00482E53 | Global /gmnotice broadcast |
0xF907 | 0x00482EC0 | Map-based /cnotice relay |
0xF908 | 0x00482FB1 | Whisper /wnotice — player lookup + target send |
0xF909 | 0x004830C7 | Zone /znotice broadcast |
0xF90A | 0x004831BD | Faction-specific /bnotice broadcast |
0xF90B | 0x004832C2 | System /notice handler |
0xF90C | 0x00482BAA | Final sub-case |
Opcodes
0xF902 and 0xF903 map to a ret 4 stub — they are recognized by the jump table but perform no action. Any emulator should silently discard packets for these opcodes.Validation Rules and Length Limits
| Command | Field | Constraint | Enforcement |
|---|---|---|---|
| All | msg_len | Server enforces maximum; client-side strlen used at send time | Sub-handler validation |
/wnotice | target_player_name | 21-byte fixed field, null-terminated | Client copies up to 20 chars + NUL |
/bnotice | faction_id | Must be 0 or 1 | Client parser; server broadcasts to matching faction |
/bnotice | faction string | Must be Korean 빛 or 어둠 | FUN_00423150 error on mismatch |
/cnotice, /znotice, /notice | map_id | Optional; defaults to 0 if omitted | FUN_0047AAF0 decimal parser |
Client Send Functions
| Command | C→S Opcode | Client send function |
|---|---|---|
/gmnotice | 0xF906 | FUN_005EE240 |
/cnotice | 0xF907 | FUN_005EDF70 |
/wnotice | 0xF908 | FUN_005EDE90 |
/znotice | 0xF909 | FUN_005EE020 |
/bnotice | 0xF90A | FUN_005EE0D0 |
/notice | 0xF90B | FUN_005EE190 |
Emulator Implementation Notes
Mapping these opcodes enables emulators to support fully-native client-side admin notifications without custom hook overlays.Implement /wnotice (0xF908) — targeted send
Intercept
0xF908, extract target_player_name from +0x02, look up the connection, and forward the notice packet directly to that player’s session.Implement /bnotice (0xF90A) — faction filter
Read
faction_id from +0x02. Iterate all active sessions and send the notice only to players whose faction byte matches.Implement map-scoped notices (0xF907, 0xF909, 0xF90B)
Read
map_id from +0x03. Broadcast the message only to sessions whose current map matches.