How the online functions work
A reference for everyone building on this server: every online function of eFootball PES 2021 (1.01.00, Steam), worked out from the game itself. It covers what each command is for, how the game uses the reply, and what a private server has to send. It continues the technical write-up, which covers the wire format, login and Quick Match. Static analysis of the game binary and our own test logs, 2026-11-05.
What changes for our server
The findings that change server behaviour, most important first. Each one links to its section.
- No relay fallback exists today. The game only uses TURN when
GET_TURN_SERVER_LISTreturns servers; we return none. Run coturn (TURN over TLS), answer the list with credentials and certificate, and forwardSEND_TURN_ADDRESS_DATAto the opponent as aWATCH_TURN_ADDRESS_DATApush. The UDP 7600 "game relay" isn't a fallback and can go. Connecting the players → DONE Built, on by default since 2026-11-06 (TURN=0turns it off): a small TURN server inside our program (TLS 5349, UDP relay 49160–49179 opened with UPnP, RFC 8016 mobility, which the game asks for), a self-signed certificate naming the server's addresses, TURN REST credentials, and byte-exact address forwarding. Traffic between two players' relays is handed over inside the program, so no router loopback is needed. First live run (against coturn): the game accepts our list and certificate and allocates over TLS; it needs mobility, which coturn refused by default (mobility alone is not enough: see the next sentence). coturn's own test client works against our relay with no loss. Tested with the game (2026-11-05): allocation over TLS works, but the game also needs aSOFTWARE"dual route" directiveHOST:PORT,<text>,0(otherwise it restarts every second) and then a second relay leg over DTLS/UDP before it publishes its relay address. Live tests → OPEN - The host's own address is wrong for remote friends. When the server runs in a player's home, that player's reflexive address is their LAN IP, so a friend in another home is told to connect to an unreachable address. Rewrite it to the public IP when the opponent is remote. This alone may explain "Failed to connect with opponent". → DONE Confirmed in our logs (the host's game reported 192.168.1.100); the server now swaps in the address the remote friend uses to reach the server, port unchanged. Not yet tested between two homes.
- Deliver peer notices exactly once, in order.
pid_listgrows by one copy per match; a duplicate START/END notice at the head of the queue blocks the P2P rendezvous for 30 s. Dedupe and exclude the sender. → DONE Confirmed in our logs:[1],[1, 1],[1, 1, 1]… was delivered that many times. The sender is never in its own list. - Push the verdict
WATCH_GAMEADDPOINT. Without it, one player stalls 20 s after every match (Quick Match never shows the rating screen anyway, see results). AnswerREQ_GAMEADDPOINTand push ratings, win streak and winner;gameend_reasonmust beNORMAL_END. → DONE Our logs show both games sending REQ, also after aborted matches. The server answers REQ with the verdict when the match reached END (Elo from 1000, K 32, win streak), and sends nothing after an abort, since any other end reason shows OLXH186. It also pushes the verdict to every player at the final whistle (default;PESSERVER_VERDICT_AT_END=0turns it off). Live: this ends Quick Match, Divisions, Matchday, Tournament and co-op matches cleanly, with no DISCONN_P2P from the slower player. - Live scores never update: goals arrive as
CMD_ADD_SCORE;CMD_ADD_GOALdoesn't exist. Dedupe by gtimer (both clients report). → DONE Both games sent the same goal with gtimer 2996; each (gtimer, side) now counts once. - Reconcile both
SEND_GAME_RESULTreports (one says NOERR, the other DISCONN_P2P with the same score), and keepSET_PLAYDATA_MATCH(scorers, player ratings), STATS_DATA and the line-ups. → - Pair only players whose
CHECK_CHEATsums match, or they fail with "DATAPACK error" after connecting.JOIN_ONLINE_MODE→ERR_MODE_BLOCKEDis a clean version gate. RecordSEND_TAMPER_DATAas a cheat flag. → DONE Matchmaking pairs only games with the same param_check_sum, patch and DLC version, and the admin feed says once why two searching players aren't matched. Games that never send the sum pair with anyone. Tamper reports go to the admin feed. No version gate yet (pairing already keeps versions apart). - The game database is decoded (players, teams, rosters, shirt numbers), and the login checksums reproduce exactly from the files: both test clients ran the stock update pack. Delivering live data would change every player's checksum. →
- The Live Update channel is mapped: the server can give every player the same data (rosters, form) through the game's own downloader: an HTTP GET of one CPK, checked only by a server-supplied SHA-256. Same data → same checksums → no DATAPACK errors. →
- The server can tune the player-to-player link: all connect timeouts and direct/TURN switching thresholds come from JSON the server sends in
GET_SERVER_ENV.proto_opt(we send none → defaults; direct connect gives up after 15 s, twice). → - Use the game's own texts: replies like
ERR_INVALID_ACCOUNT(ban),ERR_FREE_TO_PLAY_FULL(server full) orERR_COMMAND_BLOCKEDshow clear messages instead of a bare code. → - Live tests (2026-11-05/06): our own Live Update works end to end (checksums exactly as predicted, as long as the server keeps listing the update); the relay works end to end once it handles the game's ktc DTLS framing and port changes, and a match can be played over it alone (DONE in the server:
turndtls.py, UDP 5350, relay on by default); reconnect survives a ~7 s outage; a whole lobby match and the return to the room work. → - Never push a
RELOADlist into a game that already holds entries: it ends the game (uncaught C++ exception in the watch-list merger, confirmed live). RELOAD only as the reply to a newREQWATCHL_*request; pushes are ADD/UPDATE/DEL. → - Send each player's
reflexive_addrexactly as that player reported it. The game picks the side that opens the match link by comparing two address strings: its own reported reflexive address and the peer'sreflexive_addrthe server sent. Only the "lower" side opens; if the server rewrites one side's address so both think they are higher, both wait and the match fails with MXNV_0013 after 10 s (seen live with test addresses). Our reflexive rewrite for the host's LAN (_visible_addr) can do this for friends whose public IP sorts between the host's public and LAN addresses. Put the public IP intohost_addrinstead, which is never compared (gncx_labels.md). STATIC → - Split large replies into 0x70 / 0x71 / 0x72 fragment frames; the client rejects any frame body over 0x410 bytes. → DONE Both ways, with the layout from the send path 0x1418537d0 (chunks 0x3f3, then 0x3fc; 0x2x for pushes). Tested on every size around the boundaries, not yet against the game, so the admin page still refuses a news message that needs more than one frame.
- Never reply
ERR_CHEATto in-match commands, and keepkey_size16 (32 switches the whole game to AES until restart). GET_MATCHIDupload:"YES"is safe: it is how match replays are recorded (see spectating). → CMD_RECONNECTis unimplemented: after a gate drop it needs a session key like SET_CURRENTPLAYER. → DONE A new 16-byte key; the new connection takes over the player's place (unknown pid: ERR_LOGIN_FAILED). Live: after a 7-second server outage mid-match both games reconnected and played on; after 15 seconds they show APLR_0002, and in the menus VNBP_0002 with no reconnect attempt.- Rooms for "play a chosen friend" are specified: blocks, room list and player lists (replies, then UPDATE pushes; never a RELOAD push), ENTRY_GAME, owner start via SET_GAMEMEMBER, room states. → Live: creating a room works (own room in the room list first, player list sent only as the reply, nested
psn_user_idblob); with the realgame_envechoed into the room list (limitTime NOSET hides a room), a friend sees the room, joins, and both reach team selection (2026-11-06). DONE Built into the server (pesrooms.py) and tested live on the real server code: create, join, ready, start, team selection. → - Online Co-op works, one player per side (mod 0.5.0 +
pescoop.py, live 2026-11-06): the game's own co-op never handed the opponent to its P2P layer; the mod adds that step and the server does force_alone matching, one WATCH_COOP_MATCHING push, real teams,game_sycom "P2P"and the SYNC_PROGRESS echo. The P2P layer takes exactly one peer, so 2v2/3v3 with more humans can't run. Spectating is switched on byupload:"YES"and served as AES chunks over HTTP. → - The server can put its own text on screen: an urgent announcement, a news list, and a "maintenance soon" warning. Done: all three tested in the game and on the admin page. →
- Tooling:
schemas.jsonmisses 1,907 reply fields in 108 commands (extractor bug, fixed in the notes, not yet applied to the server).notes/re/errcode.py's default game path broke when the repo moved. →
Connecting the two players: NAT traversal, TURN relay, game relay
How a match connection is set up
- Network test at mode entry: the NTL library ("NTL 1.11.11-Windows64") tests the NAT against the STUN server (UDP 3478) and GateInfo.php, tries UPnP, then reports its addresses with
CMD_SEND_IPANDPORT_NTL{host_addr, reflexive_addr, relayed_addr, ntl_nat_type}. LIVE - Pairing:
CMD_WATCH_MATCHINGmember blobs carry each peer's NTL addresses. LIVE - Match session task (
OnlineModeTaskMatchSession.cpp, fn 0x1411430b0, state in[task+0x70]): GET_SERVER_ENV → GET_TURN_SERVER_LIST (states 9/0xa) →SetConfig()(state 0xb) → CreateMultiplaySession (state 0x11; also startsConnectTurnTaskand theWATCH_TURN_ADDRESS_DATAwatch) → wait for the link (state 0x15) → revision check → connected (0x1a). Errors go to state 0x17. STATIC - Connection strategy (factory 0x1411aa730) depends only on whether the TURN list is empty. The NAT type is not consulted: STATIC
- empty list (our server today) →
P2pFullMesh: NTL hole punching only, no relay; - non-empty list →
P2pFullMeshWithTurnwithP2pTurnIoFailover: direct path plus a TURN path, switching between them. (Debug tunablesturn_mode/direct_online_turn_modedefault to this.)
- empty list (our server today) →
- When the link doesn't come up in about 30 s, both games report
CMD_SET_GAMERELAY_CHECK_RES {error_code ER_MATCHING_RETRY, failed_reason 2}. LIVE The match task retries once after 15 s (cmp rax,0x3a98at 0x141143ccd). Link results: 1 ok, 2 "Revison check TIMEOUT", 3 "Revision error", 4 "DATAPACK error", 5 "Other user disconnected". STATIC
client A our server TURN server (coturn) client B
GET_TURN_SERVER_LIST ──► {turn_server_list, id, pw, cert}
TLS over TCP to tls_port ──────────────────────────────────► Allocate (401 → auth) → relayed address A
SEND_TURN_ADDRESS_DATA{A} ──► push WATCH_TURN_ADDRESS_DATA{A} ────────────────────────────────────► B
WATCH_TURN_ADDRESS_DATA{B} ◄── ◄── SEND_TURN_ADDRESS_DATA{B} ◄──────────────────────────────────── B
CreatePermission / ChannelBind (B) ────────────────────────► relays A ⇄ B ◄────────────── B does the sameCMD_GET_TURN_SERVER_LIST: TURN servers and credentials
- Transport: HTTP (URL type
GET_TURN_SERVER_LIST). Requested every match, twice per client, once by the match task and once byConnectTurnTask. Not at login. LIVE - Request:
pid,turn_account_param(= the pid as text),turn_time_limit(always 60). The game never uses either value itself. They look like hints for time-limited TURN credentials. STATIC INFERRED - Reply (parser 0x141e4e650, stored in
onlinesystem::ParameterTurn): STATICturn_server_list: an array of inline maps (not nested blobs){zone NUM, address STR, port NUM, tls_port NUM}. Entries withportortls_port= 0 are dropped. Onlytls_portis used to connect;portonly has to be non-zero. Anyzoneworks: servers are grouped by zone, and failed ones are skipped for a while.id/pw(STR): TURN long-term username and password. If either is empty, TURN is silently skipped.server_certificate(STR): base64 of a DER X.509 certificate (a PEM body without its BEGIN/END lines works), added to the TLS trust store.server_certificate_data_size(NUM) = number of DER bytes. Invalid DER aborts the TLS session.origin(STR, optional): passed to the TURN client config (ORIGIN attribute, RFC 7635 style).
- Bare
{result:NOERR}(today): empty list → no relay; nothing errors. LIVE
The TURN client: Konami "ktc-0.0.0"
- A standard RFC 5766/8656 client (namespaces
ktc::session,ktc::socket,ktc::lib::TlsSession, OpenSSL 1.1.0i): Allocate / Refresh / CreatePermission / ChannelBind, 401+nonce long-term auth, 438 stale nonce, 437 allocation mismatch, 405 mobility forbidden. Defaults: lifetime 60, 10 retries. STATIC - Transport: TURN over TLS on TCP (RFC 5766 §2.1) to
address:tls_port. After allocating, the game requires the relay'sSOFTWAREattribute to be a Konami "dual route" directiveHOST:PORT,<text>,0; without it, the session restarts every second. With it, the game also opens a second leg over DTLS/UDP to that address and only publishes its relay address once that leg works. STATIC LIVE (live tests) - The switch-over thresholds (
ChangeoverToTurnReceiveIdleTimeMsThreshold,TurnNetworkIoConnectionTimeoutMs,TcpFallbackEnable, …) come from the game's local multiplay parameter data, not from the server. STATIC - The NTL library has its own, separate TURN client (
ntl::TurnClient), which would fillrelayed_addr. That field is all zeros in every log, and no code path configures it, so treat it as unused. INFERRED m_TurnQuality*/TURN_QUALITY_*/TURN_CHANGEOVER_*/ROUTE_TCP_MSstrings are keys of the post-match network statistics record. They are telemetry, not settings, but useful later to see whether a match used TURN. STATIC
CMD_SEND_TURN_ADDRESS_DATA → push CMD_WATCH_TURN_ADDRESS_DATA
- After its TURN allocation succeeds, each client sends
{pid, address, address_data_size}(gate, svrtype MENU). Theaddressblob is the serialized relayed address; its byte format isn't decoded, so treat it as opaque. A non-NOERR reply makes ConnectTurnTask fail. STATIC - The server must push
CMD_WATCH_TURN_ADDRESS_DATA {result:"NOERR", address, address_data_size}to the opponent with the bytes unchanged (msgpack str, likesa_data). The push has no pid field. The client then creates a permission and channel to that address. STATIC CMD_WATCH_PUNCHING_DATA{host_addr, reflexive_addr, ntl_nat_type} is used only by lobby/room flows, not Quick Match. STATIC
CMD_SEND_IPANDPORT_NTL and a likely cause of cross-home failures
sa_data= 14 bytes: port (big-endian), 2 zero bytes, IPv4, 6 zero bytes.address_family1 = IPv4, 0 = empty.ntl_nat_typeis a packed descriptor (seen1before the test,0x10307533after a good test); its bits aren't decoded. LIVEreflexive_addris whatever our STUN server sees. When the server runs in one player's home, that player's game reaches it over the LAN, so its "public" address is its LAN IP (logs: host == reflexive == 192.168.1.100). The friend in another home is then given an address it cannot reach. This alone can explain "Failed to connect with opponent" between homes, even when both routers would allow a direct path. LIVE INFERRED- Cheap fix without TURN: when a LAN-side player is paired with an internet player, rewrite the LAN player's reflexive IP to the server's public IP and keep the port. This works on routers that preserve source ports. TURN is the robust fix.
CMD_GET_GAMERELAY and the "game relay"
game_sycomselects the transport:"P2P"→ mode 1,"SC"→ mode 2 (server/client through Konami's game relay), anything else → 0. Only with "SC" areip_addr/portkept; otherwise they're cleared. That is why the client's CHECK_RES shows an empty gamerelay. STATIC LIVE- "SC" uses
MultiplaySessionStrategyCsClient, a full client/server relay with Konami's own protocol (kps msp over dlcp, see transport layers). It is not a TURN-style fallback. Our UDP 7600 has never received a packet. LIVE GET_GAMERELAY_QUALITYCHECKLIST,SET_GAMERELAY_QUALITY,SET_GAMERELAY_MATCH_QUALITYand theLOCAL_GAMERELAYcommands measure or select relays for SC mode and the lobby's "LocalGamerelayDialog". A bare NOERR is fine for all of them. STATICCMD_SET_GAMERELAY_CHECK_RES{pid, game_sycom, error_code, gamerelay{…}, failed_reason, is_special_match_confirm} is each client's verdict on the connection. PushCMD_WATCH_GAMERELAY_CHECK_RES{error_code}:NOERRonly if both sides reported NOERR, otherwiseER_MATCHING_RETRY, so both go back to searching. INFERRED
What our server should do
- Superseded: our program now has its own relay (on by default), and live tests showed that a plain TURN server isn't enough. The relay must also send the
SOFTWAREdual-route directive and serve a DTLS/UDP leg (live tests). The original advice was to run coturn on an internet-reachable address:tls-listening-port=5349; a non-zero but unusedlistening-port(3478 is our STUN); a self-signed cert whose IP SAN is the advertised address;lt-cred-mech;user=pes:<password>;realm=pes2021;external-ip; a UDP relay port range forwarded on the router. Behind a home router, coturn relaying between its own two allocations needs NAT hairpinning; a VPS avoids that. INFERRED - Reply only when TURN is configured:
{result:"NOERR", turn_server_list:[{zone:1, address:"<public IP>", port:3479, tls_port:5349}], id:"pes", pw:"<password>", server_certificate:"<base64 DER>", server_certificate_data_size:<len>}. For time-limited credentials:id = "<expiry>:<pid>",pw = base64(HMAC-SHA1(secret, id))with coturnuse-auth-secret, and an expiry of hours (refreshes happen during a 90-minute match). - Forward
SEND_TURN_ADDRESS_DATAto the opponent as aWATCH_TURN_ADDRESS_DATApush, and queue it if the room isn't ready. - Keep
game_sycom:"P2P". The UDP 7600 placeholder can go. - Rewrite the host player's reflexive address when the opponent is remote (see above).
Tested live (2026-11-05): REQUESTED-TRANSPORT is UDP; the game asks for mobility; it needs a SOFTWARE directive HOST:PORT,<text>,0 and then a DTLS/UDP second leg before it publishes its address (details). 2026-11-06: with a DTLS leg that handles the ktc framing, the games publish their address (20-byte blob: 00, port big-endian, IPv4 little-endian) and relay ChannelData; the TLS leg is closed once the DTLS allocation exists; the whole session restarts every 21.4 s (open). Still unknown: whether the certificate is verified when none is sent, and whether a dead TURN server breaks the match. Our test showed the match running fine over P2P while TURN failed.
Match flow: setup, in-match reports, end of match
ERR_CHEAT.The real sequence of a full match LIVE
WATCH_MATCHING (push) → GET_GAMERELAY (HTTP) → GET_MATCHID → SEND_SYNC_NOTICE "1,"/"2," → WATCH_SYNC_NOTICE → GET_SERVER_ENV → GET_TURN_SERVER_LIST (HTTP) → SEND_SYSTEM_NOTICE "START:pid=…;time=…;" (both) → push → SEND_SYSTEM_NOTICE "END:pid=…;time=…;" (both) → push → P2P link check (10–25 s) → SET_GAMERELAY_CHECK_RES → WATCH_GAMERELAY_CHECK_RES (push) → SEND_MATCHING_RESULT (both) → SET_GAMEMEMBER (owner) → CHANGE_GAMEPHASE DATASYNC → SET_GAMEMEMBERENV (owner) → GET_PLAYER_PARAMETERLIST → SET_GAMETEAM + GET_MATCHID → TEAMSELECT → MATCHMENU → GAMELOAD → SEND_MATCH_TEAM_INFO → ENTRY → 1ST … ADD_FOUL / ADD_SCORE … BREAK1 → 2ND … → SET_GAMEPLAYER_PLAYTIME → CHANGE_GAMEPHASE END → SET_PLAYDATA_MATCH (HTTP) → SEND_ABNORMALEND DISCONN_P2P (second to leave) → SEND_STATS_DATA → SEND_GAME_RESULT → REQ_GAMEADDPOINT → LEAVE_ROOM
The match session task (OnlineModeTaskMatchSession.cpp, on-screen MXNV_00NN)
Update fn 0x1411430b0, state at task+0x70, result at +0x74 (1 ok, 2 peer gone / revision timeout, 3 multiplay failure, 4 ping out of range, 5 server command error, 6 internal error). Every tick first checks the gate connection; if it's lost, the task fails with MXNV_0002 "DISCONNECT PES SERVER". STATIC
| State | What it does | Error if it fails |
|---|---|---|
| 1–2 | GET_MATCHID (skipped in direct/LAN online). A reply error is fatal. Then SEND_SYNC_NOTICE. | MXNV_0003 / 0004 / 0023 |
| 3–4 | Sync barrier: waits for one WATCH_SYNC_NOTICE, at most 10 s. A timeout is not an error. | MXNV_0024 (reply error) |
| 5–6 | Only if GET_MATCHID said upload:"YES": START_SEND_GAME_SEQUENCE_DATA (replay upload) | MXNV_0005 / 0006 |
| 7–8 | GET_SERVER_ENV. A reply error is fatal. | MXNV_0007 / 0008 |
| 9–10 | GET_TURN_SERVER_LIST (see TURN); result ignored here | — |
| 11 | SetConfig(): builds the P2P/TURN config | MXNV_0009 "Error SetConfig()" |
| 14–17 | Multiplay init; one 15 s retry wait; CreateMultiplaySession | MXNV_0010 "Error CreateMultiplaySession" |
| 18–19 | Wait for the session to reach "connected". Normally no retry. | MXNV_0013: session never connected (seen in our failed tests) LIVE |
| 20–21 | Init online multiplay; P2P revision check (60 s) | MXNV_0015 timeout, 0017 DATAPACK error (any revision/data mismatch; status 3 "revision error" is dead code in 1.01), 0018 other user disconnected, 0019 unknown. is_revision_check:"NO" turns the compare off (0x140fff5b3). |
| 22 | Ping check against the ping limit | MXNV_0022 "Ping range over" |
| 23–26 | Error teardown / finish |
Peer notices relayed by the server
All three SEND commands carry {pid_list_num, pid_list[int], data STR}; the pushes carry {data}. The client never checks who sent a notice except through what's inside data. STATIC
- SYNC_NOTICE = match-session barrier.
data="<pid>,"for each other member. The receiver pops one entry and ignores its contents.pid_listgrows by one copy per match: the game never clears the vector it's built from ([2],[2,2]…[2,2,2,2,2,2]in our logs). If the server relays every copy, stale entries make the next match's barrier pass instantly. Harmless, but not real synchronisation. LIVE STATIC - SYSTEM_NOTICE = P2P connect rendezvous (thread 0x1411d9620).
data="START:pid=<sender>;time=<unix s>;"or"END:…". Each handshake waits up to 30 s for a matching entry at the head of the queue, and the parser doesn't drop a non-matching head. One duplicate or stray notice therefore blocks the handshake and the P2P connect fails. Relaydatabyte for byte: each side builds the session tag "pid-pid-…-min(own time, peer time)" fromtime=and passes it to the NTL connect (0x1411d81d0), so altered times make the tags differ. STATIC - NOTICE = JSON notices for rooms (not Quick Match):
{"notice_key": …}withMOMROOM_START_COUNTDOWN {from_pid, reason, count_zero},MOMROOM_RESULT_TIMEOUT,MOMROOM_REQ_RESULT_TIMEOUT {from_pid, roomid},ROOM_SHARE_INFO {from_pid, has_team_data, team_power, chemistry, team_id, team_name},SYNC_PROGRESS {pid_list}. Keys exist with no builder found: MOMROOM_CANCEL/REQUEST_COUNTDOWN, MOMROOM_SEND_XSESSION_INFO, MOMROOM_CONNECT_COMPLETE, QUICK_PING_RES. STATIC - Server rule for all three: take
set(pid_list) − {sender}, deliver each push exactly once per target, keep the order (START before END), never inject extra notices.
CMD_GET_MATCHID and CMD_GET_SERVER_ENV
- GET_MATCHID reply:
match_id(any type, converted to a string) andupload."YES"(what the server sends since 2026-11-07) makes the client stream its replay (CMD_SEND_GAME_SEQUENCE_DATA {pid, match_id, game_seq_data[{type, fromId, channelId, sequenceNumber, data, data_len}]}), which the server keeps as a replay (pesreplay.py). It's sent twice per match, so both times must return the same id for both players. LIVE - GET_SERVER_ENV is copied into the game's environment every time; missing keys keep the client defaults. All timeouts are in seconds: STATIC
Our 180/120/240/180 are the client defaults. Raise
Key Default Effect match_client_timeout_load_timeout180 load-screen limit (× fps frames) → LOAD_TIMEOUT, QVHE1459 match_client_timeout_long_outofplay120 ball out of play too long → OUTPLAY_LONG match_client_timeout_init_not_end240 match init not finished → LOAD_TIMEOUT (0 = instant abort, which we hit early on) match_client_timeout_cmd_lack180 no peer commands → CMD_LACK trigger_keep_alive,matchrejectpid_max,quality_check_wait_sec(3600)keep-alive switch, reject-list size, relay quality re-check is_revision_check"YES",is_check_myclub_level"YES",max_division"D12"revision check switch; myClub; highest division teamlobby_game_rating_border_normal/hard(600/700),lobby_ping_good/normal,quick_ping_good/normal,log_update_level,konamiid_api_retry_sec,proto_optteam lobby, ping bars, telemetry long_outofplay/cmd_lackfor more pause tolerance.
In-match reports (the "game queue")
- During the match, CHANGE_GAMEPHASE, ADD_FOUL, ADD_SCORE, SET_GAMEPLAYER_PLAYTIME, SEND_MATCH_TEAM_INFO, SEND_ABNORMALEND, SEND_ALIVE and others go through a queue (TaskGameQueueProcessor 0x141124df0). The only reply value it reacts to is
result:"ERR_CHEAT", which makes the client end the match with reason CHEAT (FAMY242). Other errors just mark the entry failed. STATIC - CHANGE_GAMEPHASE
{phase, gtimer}:DATASYNC, TEAMSELECT, MATCHMENU, GAMELOAD, ENTRY, 1ST, 1ST_15MIN, 1ST_30MIN, BREAK1, 2ND, 2ND_15MIN, 2ND_30MIN, BREAK2, EX1ST, BREAK3, EX2ND, BREAK4, PK, END. Both clients report every phase. STATIC LIVE - ADD_SCORE
{goal_side, goal_gameplayer_id_info (blob), goal_player_side, goal_player_pid, assist_side, assist_gameplayer_id_info, assist_player_side, assist_player_pid, gtimer}. There is no CMD_ADD_GOAL in the game: ourevents.pywaits for ADD_GOAL, so live scores never update. Both clients send each goal; dedupe by (room, gtimer). An own goal is probablygoal_side ≠ goal_player_side. LIVE STATIC - ADD_FOUL
{card_pid, card_side, card_gameplayer_id_info, card_kind, injury_pid, injury_side, injury_gameplayer_id, injury_data {part, symptom, level, mcount_left}, injury_all, injury_one, gtimer}. LIVE - SET_GAMEPLAYER_PLAYTIME: both teams' players with minutes played and final position, sent just before END. SET_GAMETEAM
{home_team_id, away_team_id}at team select; 262143 = no team. LIVE - SET_GAMEMEMBER / SET_GAMEMEMBERENV are sent only by the room owner:
envlist[blob{pid, side HOME/AWAY, sideLeader YES/NO}], the authoritative sides. Unlike the queue, these replies are checked: an error aborts match setup. STATIC - SEND_MATCHING_RESULT (both, after the session):
member/vs_memberblobs with each side's NTL addresses, anderror_code("" = connected, otherwise e.g. MXNV_0013). It's the best per-match record of whether connection setup worked. The reply isn't checked. LIVE - LEAVE_ROOM
{error_code}: "" after a normal match, otherwise the last on-screen code. LIVE
Abnormal ends and the match watchdog
CMD_SEND_ABNORMALEND {reason, error_code}. error_code = <last on-screen code>_0x<8 hex>. Reasons (enum 0x1437f3d20): STATIC
0 CHEAT · 1 INJURY · 2 GIVEUP · 3 EXIT · 4 SLOWDOWN · 5 NO_OPERATION · 6 COMPE_TIMELIMIT · 7 CMD_ERR · 8 MODE_ERR · 9 SYNC_FAILED · 10 CONFLICT · 11 LOAD_TIMEOUT · 12 GAMERELAY · 13 BUFFER_OVER · 14 DEGRADE_SC · 15 DISCONN_SC · 16 CMD_SENDFAILED · 17 OUTPLAY_LONG · 18 CMD_LACK · 19 TIME_ERR · 20 NOTRUN · 21 READY_TIMEOUT · 22 DISCONN_NTL · 23 DISCONN_P2P · 24 DEGRADE_P2P · 25 NOERR
- The per-match watchdog (MatchOnline.cpp 0x14213dab0) uses the GET_SERVER_ENV limits plus fixed ones: DISCONN_P2P (10 s / 300 s / 30 s depending on state), NOTRUN (60/90 s), SYNC_FAILED (180 s), BUFFER_OVER, NO_OPERATION (the AFK rule: (setting+30)×2 s or (setting+60)×1 s without input; about 70 s in our live test). STATIC
- Seen in our logs: DISCONN_P2P/GNCX_0003 (always the second player leaving after the match), NO_OPERATION/VIXT2253, LOAD_TIMEOUT/QVHE1459 and /MMGC_0002_0_262143, GAMERELAY/EYRH1530, DEGRADE_SC/EYRH1530. LIVE
- Server: store {room, pid, reason, error_code, phase}. Ignore DISCONN_P2P that arrives after both sent END. Mid-match, the reporter usually stayed and the other player left.
Liveness probe and reconnect
CMD_WATCH_CHECK_ALIVE_PLAYERis a server push ("are you still there?"). The client answers withSEND_ALIVE {pid, reason}(NOERR, DISCONN_SC = P2P link down, DEGRADE_SC = server path degraded) andSEND_ALIVEPLAYER {pid, pid_list}listing the peers it still hears. We never push it. It could decide who disconnected. Optional. STATICCMD_RECONNECT {pid, platform, patch_version, dlc_version, online_mode}is sent after a gate connection drop. It expects{key, key_size}like SET_CURRENTPLAYER. Today it gets a bare NOERR with no key, so a reconnect probably fails. It should be handled like SET_CURRENTPLAYER (new 16-byte key, rebind to the existing session and room). STATIC Needs a live test.
Server error table inside the client
The game carries a 765-row table (0x1428a1170) of (command, ERR_* code the server may return, message id). That's the list of error replies Konami's server could send per command, e.g. ERR_ROOMNOTFOUND, ERR_NOTROOMOWNER, ERR_PLAYERISNOTENOUGH, ERR_DATABASE. Every room or lobby handler should pick its errors from it. STATIC
After the match: results, statistics, rating, divisions
CHANGE_GAMEPHASE END (both) → highlights / full-time screens TaskWatchGame (OnlineModeTaskWatchGame.cpp, 0x141120730) runs through the match: watches push CMD_WATCH_GAMEADDPOINT + push CMD_WATCH_CHECK_ALIVE_PLAYER on a dropped peer link: wait for the verdict → REQ_GAMEADDPOINT at +10 s → give up at +20 s OnlineMatchEnd (0x14137e390): SET_PLAYDATA_MATCH (HTTP) → SEND_STATS_DATA → SEND_GAME_RESULT → LEAVE_ROOM OnlineMatchRatingPre (0x141379220): "normal" → rating screen (menu::RatingChange) | "skip" Online Divisions only (gamemode 24): GET_DIVISION_INFO → division-points screen
The verdict: CMD_REQ_GAMEADDPOINT / push CMD_WATCH_GAMEADDPOINT
- Now (2026-11-07): the server pushes the verdict to both players when both reported
CHANGE_GAMEPHASE END, in every one-on-one match. Both games then end cleanly (no "match abandoned" dialog) LIVE. A match left early has no verdict (anything but NORMAL_END shows OLXH186); the server instead counts it as a 3-0 loss for the one player who left early (own GIVEUP/EXIT/NO_OPERATION report or a dropped connection) and a win for the other, in ratings, Online Divisions and Matchday LIVE. - Before: the client whose P2P link closed first waits for the push, sends REQ_GAMEADDPOINT after 10 s, and gives up after 20 s. Logs: ABNORMALEND 16:23:39 → REQ 16:23:49 → GAME_RESULT 16:24:01; also 20:06:53 → 20:07:04 → 20:07:14. Nothing breaks, but there's a 20 s stall and no rating screen. LIVE STATIC
- Push layout (parser 0x141d7f540, handler 0x141100010). Nested objects are msgpack blobs. STATIC
{ result:"NOERR", player_count: NUM, player_list: [ blob{ pid, pes_pname: blob{name, xuid_one, psn_user_id: blob{account_id, online_id, is_valid_cache}, is_deleted}, rating_type RANKMATCH | LEAGUE_A | LEAGUE_A_COACH | LEAGUE_B | … | LEAGUE_PREMIERE(_COACH) rating (new), oldrating, rating_compe, rating_boost_type NONE | ROOKIE | CONTWIN, rating_boost_rate, team_id, side HOME|AWAY, contWin_num (win streak), skill_rank SKILL_RANK_12 … SKILL_RANK_1, is_rankup_skill_rank YES|NO, is_first_skillrank YES|NO } ], winner_side WINNER_HOME | WINNER_AWAY | WINNER_NONE, gameend_reason NORMAL_END | DISCONN | OWNGOAL | CHEAT | INJURY | GIVEUP | … | DISCONN_P2P | DEGRADE_P2P, is_pk YES|NO } - The entry whose
pidequals the player's own pid is "me".gameend_reasonmust beNORMAL_END(or INJURY). Anything else, or a missing value, shows OLXH186. The rating screen shows oldrating → rating (gain = rating − rating_compe when rating > rating_compe), the boost and the win streak. STATIC - Server should: keep a rating per player (e.g. Elo from 1000) and a win streak. Answer REQ_GAMEADDPOINT with NOERR and push the verdict immediately. Also try pushing it to both players once both sent CHANGE_GAMEPHASE END. Quick Match never shows the rating screen: it only runs for mode groups 13, 19, 28 and 29 (bit mask 0x30082000 at 0x141379270, static table 0x1434fc9c0), and Quick Match (gamemode 25) is group 14. The push still matters: it ends the 20 s wait. Send
rating_compe0 (gain shown = rating − rating_compe). STATIC
What each game reports
CMD_SEND_GAME_RESULT(one per client; reply never checked):pid, side, game_phase, home_score, away_score, home_team_id, away_team_id, is_cheat, error_code, abnormalend_reason, andgameend_reason, which is always "NotImplement": the client leaves the outcome to the server. Also network diagnostics:communication_time, link_type, rtt_*, transport_rtt_*, rx_packet_loss_rate_*, match_time, match_hz_*, per-controllercursor_data_list(input delay), network-quality flags, server ping samples. Unset values are all-ones (4294967295/65535/255) or "NotImplement". LIVE STATIC
Both reports: without a verdict at full time, the second game reports END/DISCONN_P2P when the first leaves the result screens. Since the server pushes the verdict at END in every one-on-one match, both report END/NOERR withgameend_reason "NORMAL_END"LIVE (2026-11-07).CMD_SEND_STATS_DATA:pid, match_id, stats[2 blobs {side, inframe_shoot_num (shots on target), freekick_num, cornerkick_num, tackle_success_num, save_num, pass_success_num, cut_num (interceptions), possesion}]. LIVECMD_SEND_MATCH_TEAM_INFO(about 20 s before kick-off): per teampid, team_spirit, cpu_level, chemistry[11], player_role_list, starting_order[23 × {gameplayer_id_info, level, condition (form arrow 0–4), stamina}]. LIVECMD_SET_PLAYDATA_MATCH(HTTPPLAYDATA_MATCH, form fieldplay_data= JSON). The best stats source.gamemode(25 = Quick Match, 24 = Online Divisions),stadium_id,weather,match_time(match-length setting),main_pad_side,opponent_pid,scorer[player ids],win_lose(2 = draw), and for both teamsteam_id, team_power, uniform, member[29 × {player_id, play_time, rating (5.0–7.0), player_overall, strength}]. LIVECMD_SEND_DOWNLOAD_STATS_DATAis download telemetry (file, hash, time, bps), not a match result. STATIC
Divisions and rankings (Online Divisions mode)
- Divisions belong to Online Divisions (gamemode 24, matching type OC_RANK), not Quick Match (25). LIVE STATIC
- How a season works (modes2.md, live 2026-11-06): the game has no season calendar.
other_match_numis the number of matches left (10 per season, the history holds ten), and the current points are the sum ofmatch_history_list[].division_point, not a field. Whenother_match_numis 0 the game shows its season-end screens and sendsCMD_FINISH_SEASON; the server then moves the player up or down. A bare reply therefore runs the season end on every visit.max_divisionin GET_SERVER_ENV sets the bottom division. The search is Quick Match withmatching_type "OC_RANK"plusGET_OFTEN_USED_TEAM_LIST, and the found opponent is shown on a "View Opponent" screen (Find Another / Proceed). LIVE CMD_GET_DIVISION_INFO{pid, is_season_end} is called on entering the mode, at season end (withCMD_FINISH_SEASON) and after every division match, before the division-points screen. Reply:pnameblob anddivision_infoblob {division, promotion_point, demotion_point, doublerank_promotion_point, other_match_num, match_record {win_count, draw_count, lose_count, win_s_max, rating}, match_history_list [{division_point, enemy_team_id, home_score, away_score, enemy_side, enemy_name, is_finished_match, win_lose, enemy_cpu_level}]}. The server sets the thresholds; the client has no threshold table. Icons go from division_12 (lowest) to division_1. STATICCMD_GET_DIVISION_POINT_INFO→server_num, division_list[{division_type, point, rank}](division records screen).GET_DIVISION_RANKING(_BYID)andGET_RANKING(_BYID)are HTTP (DIVISION_RANK,RANK, …). Form:start_index, view_num, divisionorsort, order; BYID uses the requester's ids. Reply:date, total_rank_num, rank_list[{user {pid, pname, division, favoriteTeam, favoritePlayer, intro, manner, match_record}, rank, point}]. In these HTTP replies nested maps are inline, not blobs. STATICCMD_GET_GAMERESULTS(match history):rlist[blob{date, ex_type, pk_flag, no_match, player[…], team, score[{score_1st, score_2nd, score_ex1st, score_ex2nd, score_pk}], match_category, gameend_reason}].GET_HEROSTATS(career totals) has no caller in 1.01.GET_MATCH_ANALYZE_ENV(play-style screen thresholds),GET_PLAYER_PARAMETERLIST(server-side player abilities for myClub cards) andGET_GP_ACHIEVEMENT(wallet and achievement bits) are login or pre-match queries; a bare NOERR works. STATIC LIVE
Built and checked in the game (2026-11-07) LIVE
- Season end: the game decides promotion / stay / relegation itself from the season's points and the thresholds of the reply before
FINISH_SEASON(FINISH_SEASON comes before theis_season_end "YES"request). Rules: ≥ double-promotion points → up 2, ≥ promotion → up 1, < demotion → down 1; the server applies the same.match_recordis this season's record (Season Results screen). - A full Online Divisions match: SEND_MATCH_ANALYZE from both before END, the verdict at END, "Changes in rating" screen, then the season chart with the new result.
- Profile pages (GET_PLAYERINFO):
favoriteTeam,favoritePlayer,introat the top level;mannermust be a blob {manner C..AAA, disconnect_rate LOW_RATE | SEMI_HIGH_RATE | HIGH_RATE} (a string crashes the game);rankmatch_statsa blob (division, rating, match/win/draw/lose numbers, streaks, goals);rankmatch_teamLoga plain list of team ids ("Teams Chosen in Last 5 Matches");matchday_stats_singlea blob. - Play Analysis (GET_MATCH_ANALYZE):
analyze_data_listmust be a list of blobs (inline maps crashed the game); the server returns what the games uploaded. - Rankings (HTTP, inline maps): overall (Online Stats → Overall Ranked Match Rankings) and per division. In
rank_list[].user,manneris a plain string. - Match history (GET_GAMERESULTS): Online Stats → Last 20 results;
match_categoryfrom the game's 25-name enum (RANK_MATCH = "Online Divisions", MATCHDAY = "Matchday"; no name gives a Quick Match label). "Participating Users" → "Add to Match Block List" is the only way to block (needsmatchrejectpid_max> 0 in GET_SERVER_ENV). - Frequently Selected Teams (GET_OFTEN_USED_TEAM_LIST): a plain int list.
- Matchday: a full match adds points per side; the points screen breakdown (
gameplay_quality,squad_rating) is in tenths; Side Ranking entries are blob{pname: blob{pid, pname: blob{…}}, team_id, rank, matchday_point}. - Online Co-op (2026-11-08): co-op needs the full-time push WATCH_GAMEADDPOINT too (without it both games report the link lost ~36 s after full time); the server sends it without changing 1v1 ratings. "Changes in CO-OP Level" reads GET_COOP_LEVEL_RESULT:
evalution= Points earned,reference= To level-up,point= Rating +N; the server gives 30/20/10 points for a win/draw/loss and a level every 100. - Online Tournament (2026-11-08): PES League rankings are blobs {pid, entry_name, team_id, clan_owner_name: blob{name, …}, point, rank, win/draw/lose_count, match_num, get_score, lose_score, diff_score, continuous_win, is_mydata, …} plus a top-level
update_date; "Current Match Results" is GET_GAMERESULTSgame_res_type "PESLEAGUE"withpesleague_compe_id(category PESLEAGUE_MATCH = "eFootball League"); the end-of-competition notice is GET_PESLEAGUE_COMPE_RESULT_LISTis_unconfirm_list "YES", reached when MAINMENU_INFO saysnew_result "YES".
Suggested storage
Tables for: match (ids, teams, final score, winner, end reason, status final/disputed/aborted, play_data JSON); match_report (both clients' GAME_RESULT); match_team_stats (STATS_DATA); match_player (line-up, minutes, rating, goals); player_rating (rating, W/D/L, streak); rating_change (source for the verdict push); division_state, division_rule (promotion/demotion thresholds), division_history. Rankings are just ordered queries over these.
Value sets STATIC: division = "D1" (top) … "D12", or "NONE" (GET_SERVER_ENV max_division "D12"). Ranking sort = RATING, WIN_NUM, MATCH_NUM, WIN_STRAIGHT, WIN_RATE (or absent), order always "ASC", view_num 100. GET_GAMERESULTS request = pid, game_res_type (ALL/RANK/MYCLUB/COOP_ALL/PESLEAGUE/COOP_PESLEAGUE), pesleague_compe_id. gtimer ≈ 50 ticks per real second (950 at kick-off, ~94,000 for a full match); use it only for de-duplication.
Still unknown: whether a verdict push to the client that isn't waiting is used; the units of the STATS counters (all 0 in our 0–0 test matches).
Lobbies and rooms: playing a chosen friend
Where it is: Kick Off → Friendly Match Lobby, the 8th item of a scrolling list just below "Cup" (then Team Play Lobby, then Training). The menu is a hard-coded table in the exe (built by 0x1401c7fb0) with no server or platform filter. Live, with test handlers following this spec, the game reached the Match Room List and created a room. It then quit about 2 s after the room player list, before ENTRY_GAME; the cause is being investigated (live tests).
Two lobby products STATIC
- Free lobby (menu
freelobby, game modeLOBBY1VS1, taskTaskLobbyRoomMainFree): 1 vs 1 rooms.max_players = 2is hard-coded (0x1410e86bb). This is the one we need. - Multi / MOM lobby (
multilobby,MOMLOBBY): several humans per side, 11-a-side room screen, countdown notices, best player, position rating. It shares about 90 % of the protocol. - Hierarchy: menu "Server" = lobby (
GET_LOBBYLIST/JOIN_LOBBY) → menu "Lobby" = block (GET_BLOCKLIST/JOIN_BLOCK, a sub-area with its own room list and player cap) → room.
Three kinds of commands
- Plain request/reply (
CREATEJOIN_ROOM,ENTRY_GAME, …). WATCH_*= pure server pushes. The client registers a local watch and never sends a request (no RX of any WATCH_* in our logs). Push with kind 0x60, rqid 0. LIVE STATICREQWATCHL_*= request + list subscription. The request carries arguments (room_id) and is answered; later pushes with the same msgid update the list. Safe behaviour: answer and also push. INFERRED (strong)
The list protocol for all REQWATCHL_* STATIC
Merger 0x1411c1340. Every list reply or push has list_key_name, list_type and list_data (an array of msgpack blobs):
RELOADclears the cached map and inserts every element, but only safely when the cache is empty: its clearing loop throws (uncaught, the game exits) once the cache holds entries, so a server may send RELOAD only as the reply to a new request (confirmed live 2026-11-06).ADD/UPDATE(re)insert;DELremoves. An empty or missinglist_datachanges nothing, even with RELOAD, so to clear a list you DEL each element.- The key is the field named by
list_key_nameinside each element (room_idfor room lists,pidfor player lists). It must be a msgpack int; a string or double key becomes 0 and the elements collide.
Flow: owner A creates, friend B joins (confirmed live 2026-11-06)
both: JOIN_ONLINE_MODE FREE → GET_LOBBYLIST → JOIN_LOBBY → GET_LOBBYINFO → GET_BLOCKLIST → JOIN_BLOCK
→ REQWATCHL_ROOMLIST (request; reply RELOAD = the block's rooms, the only safe RELOAD)
A: CHECK_STRING {room name} → CREATEJOIN_ROOM {name, match_type OC_FREE, lang, max_players 2, …} → {room_id}
server → subscribers incl. A: room list ADD (A looks for its own pid in the room list)
A: SET_GAMEENV {game_env: blob of the 9 settings} → server stores it, echoes it as the room's gameenv,
pushes room list UPDATE (limitTime NOSET would hide the room from everyone)
A: REQWATCHL_ROOMPLAYERLIST_NTL {room_id} → reply = the player list (no push before A's ENTRY_GAME)
then ENTRY_GAME {entry FALSE, side HOME} → room screen
B: (row selected) REQWATCHL_ROOMPLAYERLIST_NTL {room_id} → reply → "Match Room Details" screen
B: JOIN_ROOM_NTL {room_id, is_invited NO, password} → {room_owner blob (pid, pname, NTL addresses), room_stat}
ERR_PASSWDINCORRECT → password prompt · ERR_ROOMNOTFOUND → "no room" dialog
server → room list UPDATE; player-list UPDATE to A
B: REQWATCHL_ROOMPLAYERLIST_NTL {room_id} → reply, then ENTRY_GAME {entry FALSE, side AWAY}
A: SEND_NOTICE ROOM_SHARE_INFO {team id/name/power, chemistry} to both; SET_GAMEMEMBER (nobody entered: ignore)
room: "Start Match" = ENTRY_GAME {entry TRUE, side}
server → room: WATCH_ENTRY_GAME {entry_count, entrygame[blob{pid, entryNum, gameNum}]} + player-list UPDATE
owner, when all entered → SET_GAMEMEMBER (empty body)
server → room: WATCH_DECIDE_GAMEENV {game_env}, WATCH_ROOMSTATE {event StateChanged, state SETENV}
match: GET_MATCHID, SEND_SYNC_NOTICE, GET_SERVER_ENV, P2P START/END, DATASYNC, SET_GAMEMEMBERENV, TEAMSELECT …
after: SET_PLAYDATA_MATCH (HTTP), SEND_STATS_DATA, SEND_GAME_RESULT, REQWATCHL_ROOMLIST, LEAVE_GAME {pid}
server, when all left → WATCH_ROOMSTATE StateChanged WAITING (both back in the room, rematch possible)
never: a RELOAD push into a game that already holds list entries (uncaught C++ exception, the game exits)Command reference (Free lobby)
| Command | Request | Reply / push body | Server should |
|---|---|---|---|
GET_BLOCKLIST | — | count, bklist[blob{name, player_num, max_player_num, block_id}]; empty → "no data" | must implement: one block, e.g. "Friendly Rooms" |
JOIN_BLOCK / LEAVE_BLOCK | block_id / pid | bare | track block; leaving unsubscribes |
GET_LOBBYINFO | lobby_id | has_info, title, sentence_info, sentence_intro | has_info:"NO", or a server message of the day |
REQWATCHL_ROOMLIST | — | list keyed room_id of rooms: room_id, status, game_phase, name, gameenv{…}, gamer_num, gamer[{pid, is_room_owner, side, enter_no, game_no}], is_passwd, max_players, is_invite_limit, vs_com, owner_pname, owner_lang, room_user_count, is_anyplayers, is_select_gk, auto_start_num, room_number, game_rating_limit, … | reply RELOAD; push ADD/UPDATE/DEL to the block's subscribers |
CREATEJOIN_ROOM | name, match_type (OC_RANKING/OC_FREE/MULTI/MYCLUB_FREE/PESLEAGUE), lang, max_players, is_invite_limit, password, enable_guest, vs_com (PL_VS_PL/PL_VS_COM), use_original_player, is_anyplayers, is_select_gk, auto_start_num, game_rating_limit (NONE/NORMAL/HARD) | room_id | create; push player list to owner; room list ADD |
JOIN_ROOM_NTL | room_id, is_invited, password | room_owner blob {pid, pname, host_addr, reflexive_addr, relayed_addr, ntl_nat_type}, room_stat | check ERR_ROOMNOTFOUND / ERR_ROOMISFULL / ERR_ROOMSTATNOTMATCH / ERR_PASSWDINCORRECT; the joiner then asks for the player list itself and must get it within 10 s (the reply is enough, live); push an UPDATE to the others |
REQWATCHL_ROOMPLAYERLIST_NTL | room_id | list keyed pid: host_addr, reflexive_addr, relayed_addr, ntl_nat_type, pid, room_player_id, room_entry_no, game_entry_no, pname, lang, is_owner, side, is_quality_bad, has_guest, guest_info | reply RELOAD; push on every change; DEL {pid} on leave |
ENTRY_GAME | entry TRUE/FALSE, side | entryflag, gameNum | then push WATCH_ENTRY_GAME + player-list UPDATE |
SET_GAMEMEMBER | — | bare | owner of a WAITING room with everyone entered → start (DECIDE_GAMEENV, ROOMSTATE SETENV); otherwise bare NOERR as in Quick Match |
SET_GAMEENV / push WATCH_DECIDE_GAMEENV | cpuLevel (VERYEASY…LEGEND), gametime, injury, ball_type, exGame, pkOnOff, substitution, exSubstitution, limitTime (NOSET/SHORT/MIDDLE/LONG) | game_env blob with the same fields (live: the request also carries them only inside its game_env blob) | store on the room and echo it as the room-list gameenv (limitTime NOSET hides the room); push DECIDE right before SETENV |
push WATCH_ROOMSTATE | — | event OwnerChanged/AppointOwner/Kicked/StateChanged, owner_pid, state NA/WAITING/SETENV/GAME/RESULT/DISCONWAIT/RESULTWAIT/FORFEITEDGAME/RESULTRETURNWAIT, password | SETENV on start, WAITING after; AppointOwner (with password) to a new owner, which then re-sends SET_ROOM_OPTION |
SET_ROOM_OPTION | pid, name, password, is_anyplayers, auto_start_num, game_rating_limit | bare | owner only (ERR_NOTROOMOWNER); room list UPDATE |
LEAVE_ROOM / LEAVE_GAME | error_code / pid | bare | remove member / back to WAITING when all left the game; hand over owner; delete empty rooms |
SEND_TEXTCHAT / push WATCH_TEXTCHAT | channel (BLOCK/ROOM/TEAM/…/COOP_ROOM), statement, list_flg CHAT_SEND/CHAT_BAN, list_pid | channel, from_pid, name, statement | push to the room (or block) members |
REQWATCHL_BLOCK_MATCH_LIST | pid | list keyed room_id of running matches (home/away pname, team, score, game_phase) | optional; empty RELOAD |
SET/GET_PLATFORM_SESSION | pid, data_size, session / pid, room_id | data_size, session | store/return; Steam overlay invites probably don't work in our setup |
- Follow list (
FOLLOW_USER,GET_FOLLOW_LIST→follow_list[blob{user_id{pid, pname}, is_locked, is_clan_member}],LOCK_FOLLOW_USER) lives with the co-op code: CO-OP Settings → Follow List, and after a co-op match the screen that offers to follow your human team-mates. No path leads from a followed player into a Free room. DONE The server stores each player's follow list; the co-op card's follow flag and follower count come from it (unit-tested, not tried in the game yet). - Mode names STATIC:
lobby_type= FREE, MULTI, MYCLUB, PESLEAGUE;JOIN_ONLINE_MODE online_mode= QUICK, RANKMATCH, FREE, MULTI, MYCLUB, PESLEAGUE, MATCHDAY, COOP, EDIT_DATA_LIVE_UPDATE. SET_GAMEENVgame_envis a packed blob holding the 9-key settings map. Co-oproom_phaseuses the game-phase names (DATASYNC…END). SET_MATCHREJECTPID/GET_MATCHREJECTLIST(a player's block list for matchmaking): bare or empty is fine.
What our server can reuse
The NTL address store, _pname, _send_later, the notice relay, GET_GAMERELAY, SET_GAMERELAY_CHECK_RES, GET_MATCHID and the events code all work as they are, if at match start the server inserts the usual st["rooms"][id] = {owner, members, t}. Only the lobby / block / room-list layer is new (a pesrooms.py). The full per-handler spec is in notes/re/functions/rooms.md.
Still unknown (two-client test): whether REQWATCHL requests really go on the wire; the order of SET_GAMEENV vs CREATEJOIN_ROOM; the commands between SETENV and GAMELOAD (the menu flow is data-driven); whether a Free-lobby client also sends LEAVE_ROOM after a match; whether chat should echo to the sender.
Co-op (2v2, 3v3) and spectating
Live (2026-11-06): what this section predicted from the code was only partly right. In 1.01.00 co-op never connects: it builds its peer list but never hands it to the P2P layer, and that layer takes exactly one peer. With mod 0.5.0 (two hooks that add the missing step) and pescoop.py, an Online Co-op Casual Match with one human per side (CPU teammates) connects and kicks off. Matches with two or three humans on a side can't run. The server must echo each player's own SYNC_PROGRESS notice, answer GET_GAMERELAY with "P2P" and give each side a real team. Details: coop2.md, livetests.md. LIVE
How co-op works STATIC
[menu] GET_COOP_MAINMENU_INFO, GET/SET_COOP_QUICKMATCHOPTION, GET_COOP_PROFILE, GET_IS_JOIN_COOP_ROOM, reject lists
[party] optional co-op room (CREATEJOIN/JOIN/LEAVE_COOP_ROOM, REQWATCHL_COOP_ROOM_MEMBER, …)
TaskCoopMatchingManager (0x141079280):
1 every human: START_COOP_GROUP_MATCHING → push WATCH_COOP_GROUP_MATCHING FINISH ("your side is formed")
4 vs-COM: START_COOP_VSCOM_OPPONENT → push WATCH_COOP_VSCOM_OPPONENT (CPU squad)
6 group owner only: START_COOP_MATCHING → push WATCH_COOP_MATCHING FINISH to all ("opponent side found")
9 TaskCoopSession: GET_GAMERELAY → the same 1v1 TaskMatchSession (match id, notices, TURN, P2P)
→ SET_GAMERELAY_CHECK_RES → WATCH_GAMERELAY_CHECK_RES → SEND_MATCHING_RESULT
11 TaskCoopStartGame: SET_GAMEMEMBER → SET_GAMEMEMBERENV → team sync → SET_GAMETEAM → GET_MATCHID (must be non-empty)
→ GET_COOP_MATCH_DATA → match as in 1v1
after: SEND_GAME_RESULT … + SET_COOP_MATCH_DATA, SET_COOP_PLAYER_GRADE, GET_COOP_LEVEL_RESULT, RETURN/LEAVE_COOP_ROOM- The co-op session creates the 1v1
TaskMatchSession(0x141133d5d) with the members of both sides. The link isP2pFullMeshSession: 2v2 = 4 peers (6 links), 3v3 = 6 peers (15 links). A group (one side's humans) is capped at 3 (0x14111072f); nothing forbids a group of 1. matching_stateenum:CHECKALIVE, SEARCHING, FOUND, FINISH, CANCEL, TIMEOUT, FAILED. Only FINISH moves the client on; CANCEL/TIMEOUT/FAILED fail the step and the manager retries.- Pushes are sent exactly like WATCH_MATCHING (kind 0x60, rqid 0). Every WATCH/REQWATCH handler is slot 27 of its CommandObject vtable.
The matching commands
START_COOP_GROUP_MATCHING(every human){pid, matching_type, is_good_reputation, com_level_min, com_level_max, retry_num}.matching_type∈ ONLINE_COOP, MYCLUB_COOP, ONLINE_VSCOM_COOP, MYCLUB_VSCOM_COOP, MATCHDAY; com levels VERYEASY…LEGEND.CANCEL_COOP_GROUP_MATCHING {pid}dequeues.- Push
WATCH_COOP_GROUP_MATCHING{matching_state:"FINISH", member_list:[blob{member: blob{the 1v1 WATCH_MATCHING member: pid, pname, is_owner, matching_order, host/reflexive/relayed_addr, ntl_nat_type, side, …}, guest_kind GUEST_NONE|GUEST|PLATFORM_GUEST, is_follow, coop_level, coop_manner C|B|A|AA|AAA}], member_list_num, com_level_min, com_level_max}. Exactly one member per group hasis_owner:"YES"; that player becomes the group owner. START_COOP_MATCHINGis sent only by the group owner (my pid == owner, 0x141133717):{matching_type, coop_player_info_list[{pid, is_good_reputation, guest_kind, user_id}], owner_pid, use_team_id, retry_num}.CANCEL_COOP_MATCHING {pid}.- Push
WATCH_COOP_MATCHINGto all 4–6 players:{matching_state:"FINISH", group_list:[2 × blob{member_list[…], member_list_num, use_team_id, owner_pid, group_id}], group_list_num:2}. The client finds its own group and reads its member'sside, so one group must be all HOME and the other all AWAY. Send a singleis_owner:"YES"in the whole push, the HOME owner, which takes the 1v1 host role. INFERREDmatching_state:"CHECKALIVE"makes the client answerSEND_COOP_ALIVE {pid, group_id}(optional). - vs-COM co-op: push
WATCH_COOP_VSCOM_OPPONENT {my_team{…team_data{squad member_list[{gameplayer_unique_id, gameplayer_id, uniform_number, player_level, parameters, default_rarity}], gameplan_data, …}}, com_team{side, com_level, …}, owner_pid}: a whole squad, the hard part. - Server: after WATCH_COOP_MATCHING, register one room holding all pids. GET_MATCHID, the relay check and the notice relay then work unchanged, because they already key on the room members.
Menus, post-match and party rooms
| Command | Reply | Safe server reply |
|---|---|---|
GET_COOP_MAINMENU_INFO | is_coop_banned, is_season_end, division, pre_season_rank, … | flags "NO", ranks 0 |
GET/SET_COOP_QUICKMATCHOPTION | is_vscom, force_alone, cpu_level_min/max | "NO", "NO", "NORMAL", "NORMAL"; store SET |
GET_COOP_PROFILE | user_info{pid, pname} and, beside it, coop_profile_data{coop_level, coop_level_point, follower, coop_manner, online_match, vscom_match, match_data} (checked on the game's parser) | level 1, the real courtesy rating, zeros |
GET_IS_JOIN_COOP_ROOM | is_join_coop_room | "NO" |
GET_COOP_REJECT_LIST / SET_COOP_REJECT | reject_list[{pid, pname}] (entries 0xb0 bytes in the client) | stored per player; blocked pairs are never matched |
SET_COOP_MATCH_DATA / GET_COOP_MATCH_DATA | per-player performance blob {match_stats, grade, match_data_size, match_data} | store; return the last one (or size 0) |
SET_COOP_PLAYER_GRADE | players rate team-mates and opponents grade_list[{pid, grade}] | NOERR (could feed coop_manner) |
GET_COOP_LEVEL_RESULT | coop_level_user_list[{status, user_id, point, before/after_point, before/after_level, …}] | one entry per member, unchanged values |
Party rooms: CREATEJOIN_COOP_ROOM {basic_settings{room_name, password, is_com_match, coop_level, coop_manner, …}, match_settings{user_team_id, enemy_team_id, cpu_level}, kind}, GET_COOP_ROOMLIST, JOIN/LEAVE/RETURN_COOP_ROOM, GET/SET_COOP_ROOM_OPTION + push WATCH_COOP_ROOM_OPTION {…, room_phase, countdown…}, member list REQWATCHL_COOP_ROOM_MEMBER (same list protocol, key player_index), SET_COOP_MATCH_READY, SET_COOP_ROOM_GUEST, SET_COOP_ROOM_TO_MATCHING {to_match_pid_list} → push WATCH_COOP_ROOM_TO_MATCHING_MEMBER {player_index_list}, REQWATCH_ERROR_COOP_ROOM_TO_MATCHING {is_error, error_kind NOERR|NOT_ENOUGH_PLAYER|INCLUDES_RENTAL|RED_CARD|CONTRACT}, push WATCH_BREAKUP_COOP_ROOM when the owner leaves. The room's members then send START_COOP_GROUP_MATCHING, and the server must put them in one group. STATIC INFERRED
Effort
- Quick co-op (solo players, no rooms, no vs-COM): about 1.5–2 days. A first test can use 2 clients with each player in their own group ("1v1 co-op").
- Party rooms: about 2–3 more days. vs-COM, myClub and Matchday co-op: 3+ days (squad synthesis).
- Main risk: whether all 6–15 player-to-player links come up. TURN helps here.
Spectating
PLAYERS SERVER VIEWER
GET_MATCHID → {match_id, upload:"YES"} decides which matches are recorded
START_SEND_GAME_SEQUENCE_DATA {pid} opens a recording for the match
every ≤5 s / 16 KB: SEND_GAME_SEQUENCE_DATA stores the records
{match_id, game_seq_data[blob{type, fromId, re-encodes, chunks, [zlib], AES-256-CBC
channelId, sequenceNumber, data, data_len}]} GET <WATCHING_GAME url>/<id>/1.enc, 2.enc …
◄── GET_WATCHING_MATCH_LIST
◄── SEND_WATCHING_RESULT (at the end)- The server turns recording on with
upload:"YES"in GET_MATCHID (0x140ff7cd0). Since 2026-11-07 the server sends "YES" and records every match (pesreplay.py). An error reply to START_SEND_GAME_SEQUENCE_DATA aborts the match (MXNV264). STATIC - The recorder taps the session layer of
P2pFullMeshSession/CsClientSession(hook 0x1412561c0). The first record is a header with the revision triple, build string and match id.datais probably base64. STATIC INFERRED - The viewer only uses HTTP and never talks to the players. It fetches
<WATCHING_GAME url>/<id>/<N>.enc(N = 1, 2, …). Each chunk is a 16-byte IV + AES-256-CBC with a key built into the game (0x142897bd0:35a11067 5829e368 45dc7751 62cca1bb 69b786ed 1e73d82e a9fe7e61 76743881). Plaintext =[flag][body], flag 1 = zlib. The last chunk ends withEND_OF_DATA. A chunk that isn't ready yet must return 404; the viewer retries for 30 s on chunk 1 and 330 s later (DZWO960). Stream items: 0 header (revision must match the viewer's), 1 member list, 2[2][fromId][channelId][seq BE32][len BE16][data], 3 end. STATIC GET_WATCHING_MATCH_LIST {match_category, compe_id, index}→match_list[blob{match_id, game_phase, game_result{…}}];SEND_WATCHING_RESULT {match_id, is_connect, phase, error_code, reason}→ NOERR.- Tested live (2026-11-06), it works with server replies only: both players upload once
upload:"YES"is sent (keep one stream; each record'sdatais base64 of 256 bytes, keepdata_len; each record is already a viewer item, no re-encoding). The viewer gets there through eFootball → Online Tournament → a competition → team → PES League lobby → X "Match List" → Spectate Match: GET_PESLEAGUE_COMPE_INFO must carrymatch_type "PES_LEAGUE_MATCH_1VS1_LOBBY"inside acompe_datablob, otherwise the 1v1 menu opens. In GET_WATCHING_MATCH_LIST,teamandscoresit at the game_result level, two each. The viewer then downloads/<match_id>/1.enc,2.enc… every 0.2 s and replays the recorded match from storage, so two copies are enough (live watching needs a third). Test add-on:notes/re/functions/tools/testserver/spectest.py; recipe:spectate2.md. LIVE - Built into the server (2026-11-07) LIVE: every online match is recorded; the newest 20 are listed in a "Match Replays" PES League competition (Online Tournament → Match Replays → any team → lobby → X Match List, the keyboard's
akey) and served at/r/<match_id>/<N>.enc. A whole 90-minute replay played to the full-time result screen. A full unattended match is about 200 chunks / 800 KB; a played one about 450 chunks. - Effort: about 1.5–2 days plus a 3-client test (2 players, 1 viewer). Error tags: DZWO (HttpStreamWatchingData), PWTV (ObserveSession), OBMB (PES League watching), NNAB (observer menu), JCND (MatchOnlineObserverForPesServer).
Still unknown: how Konami grouped solo players; which is_owner the session host needs when both groups have owners; whether 6-peer full mesh connects through our setup; the contents of match_data; room_phase values; the minimum vs-COM squad push. (The spectating URL id is the listed match_id, and data is base64: both settled live.)
Fair play, news and the online menus
Order at online login LIVE
SEND_LOG, GET_GAME_TEAM_LIST, GET_MATCH_ANALYZE_ENV, GET_MANNER_WARN, GET_DMM_NOTIFICATION, GET_PRIVATEINFOTITLELIST, GET_DMM_PLAYERINFO, SEND_LOG, JOIN_ONLINE_MODE, CHECK_CHEAT, GET_URGENT_ANNOUNCEMENT (PRE_MAIN), GET_MANNER_WARN, GET_PRIVATEINFOTITLELIST, GET_QUICKMATCHOPTION, (GET_MAINTENANCE_INFO), START_MATCHING. Login errors here carry the tag CCWR (OnlineLoginTaskConnectMenu2.cpp).
CMD_CHECK_CHEAT: checksums of the player database
- Request:
pid, dlc_version, dlc_type("NotImplement"),param_check_sum, entry_check_sum. Sent after JOIN_ONLINE_MODE. LIVE param_check_sum(0x141128e90) is not MD5. For every player in the database: low 16 bits of the id + the 108 parameters + height + weight + the weekly condition (a constant 5 unless live data is applied), added into four u32 accumulators (by id & 3). Reproduced exactly from the game files, see the database. The accumulators are XOR'd with{29bda03d, 0593fbe2, 298015ab, 9fbead21}and printed as 32 uppercase hex characters. STATICentry_check_sum(0x141129240): the same idea over the team rosters (team id + each player's id + shirt number), with no XOR. STATIC- What changes them: stat edits, transfers, roster or number changes, live-update data. What doesn't: names, kits, faces, emblems, stadiums and other cosmetic option-file content. STATIC INFERRED All 48 logged requests (both players) had the same two values. LIVE
- Reply: only
resultis read.ERR_PARAMCHECK_FAILEDaborts online login (CCWR_0014); any other error also aborts (CCWR_0015). There's no "warn and continue". STATIC - Where the sums are really enforced: in the P2P revision check after connecting, the peers exchange
revision, param_check_sum, entry_check_sum. A mismatch ends the match with "DATAPACK error" (MXNV533). Only param_check_sum, then entry_check_sum are compared, as exact strings;revisionis never compared, and DLC/live-data/patch versions are not in the exchange. The switch isGET_SERVER_ENV.is_revision_check: exactly "YES" (or absent) compares, anything else skips the compare (the 60 s exchange still runs) (notes/re/functions/datacheck.md). STATIC - Server should: store both sums (and the versions from JOIN_ONLINE_MODE) per session and only pair players whose sums match. Optional strict mode: whitelist the accepted sums and reply ERR_PARAMCHECK_FAILED to the rest.
CMD_JOIN_ONLINE_MODE: a natural version gate
Request online_mode (QUICK…), patch_version "1.01.00", dlc_version, livedata_version, extradata_version. Replying ERR_MODE_BLOCKED blocks entry with its own message (CCWR_0003), which is a clearer failure than a DATAPACK error after connecting. Other errors (including ERR_DIFFERENT_PATCHVERSION / LIVEDATA / DCVERSION) end in the generic login error CCWR216, possibly after the command's own text. STATIC LIVE
CMD_SEND_TAMPER_DATA: the game reports its own tampering
After a Quick Match or a vs-COM match start, the game recomputes param_check_sum. If it differs from the login value (stats changed in memory, e.g. by a trainer), or the squad has "Unregister:" / "Doping:" / "costover" entries, it sends {pid, match_category, data, error_code} (TaskWatchCheat 0x1411263a0). Never seen in our logs. Reply NOERR and record a cheat flag for the admin page. STATIC
Fair-play rating and word filter
CMD_GET_MANNER_WARN→warn_kindopens one of four built-in courtesy-rating dialogs; the names don't match the texts:DOWN_B"The number of times you have failed to properly complete matches is increasing…",A_TO_B"Your courtesy rating has fallen to "B"…",DOWN_C"…failed to properly complete matches remains high…",STILL_C"Your courtesy rating has fallen to "C"…". Anything else shows nothing. Asked at the online login and on entering an online mode. LIVE (all four, 2026-11-07). The server rates players on their last 10 matches (pesmanner.py): an early exit is the player's own game reportingGIVEUP/EXIT/NO_OPERATIONinSEND_ABNORMALEND, or their connection dropping mid-match; A ≤ 1, B 2–3, C ≥ 4; one warning per early exit.CMD_CHECK_STRING{str}is the bad-word filter for profile, clan, team, room and squad names. Any non-NOERR rejects the text (ERR_NGWORDand variants): "Includes unusable letters or phrases." LIVE. The server refuses whole words from the host'sblocked_words.txt, and player names at CREATE_PLAYER (ERR_NGWORDINPNAME).
Showing our own text in the game
- Urgent announcement (simplest):
CMD_GET_URGENT_ANNOUNCEMENT(requestonline_mode, announcement_type PRE_MAIN, lang, region). Reply{is_announcement:"YES", announcement_data: blob{online_mode, announcement_type, announcement_id, read_check, title, body}}to get a dialog before Quick Match. Echo the request's online_mode and announcement_type. LIVE It shows every time, so our server sends each message once per player. - Maintenance warning:
CMD_GET_MAINTENANCE_INFO→{maintenance_warn:"YES", maintenance_time: <unix seconds>}shows a Yes/No "maintenance soon" dialog (in local time) before matchmaking. No goes back to the menu. LIVE ("TRUE"shows nothing.) - News list:
CMD_GET_GLOBALINFOTITLELIST(gate, svrtype GATE or MENU) andCMD_GET_PRIVATEINFOTITLELIST→announce_info_list= list of blobs{announce_type NO_BANNER_INFO|BANNER_INFO|WEEKLY_INFO|COMPE_INFO|PERSONAL_INFO, title, announce_id, priority, popup_type ONCE|DAILY|EVERYTIME, weekly_info_type, event_id, date (u32), evoked_text, list_banner_file_info{filename, hash_str}, …}. The count key is spelledannnounce_info_list_num(three n's); the list drives the iteration. LIVE: the title is listed on "Online Information" at sign-in and, withpopup_type EVERYTIME, opens as a pop-up at the main menu. The private list works the same way for one player (announce_type PERSONAL_INFO, body throughCMD_GET_INFOBODY {is_private "YES"}): the game asks for it at login and on entering an online mode, pops up each newONCEitem, and remembers closed items across restarts LIVE. The server uses it for the host's messages to one player and the kick note.
The body LIVE comes fromCMD_GET_INFOBODY {pid, announce_id, is_private, lang, region}→announce_info: blob{announce_basic_info: blob{…}, body, link_url, direct_move, use_template, template_id, banner_file_info, compe_name, compe_start_time}. UseNO_BANNER_INFO, UTF-8 text, nolink_url(it opens a browser).CMD_SET_WEEKLY_INFORMATION_ACTIONacknowledges a weekly pop-up. - Images (banners, ad boards, thumbnails) are plain
GET <url>?fname=<name>downloads of raw bytes from the URL-list types TOPINFO, BANNER, WEEKLY_INFO_BANNER (keyannounce_id), ONLINE_AD, DMM_TOP (banners up to 409,600 B).CMD_GET_ONLINE_AD_FILE {ad_match_kind, compe_id}→ad_banner_file_name, ad_signage_file_namefor stadium ad boards. The image format is UNKNOWN. No code path for ADFILE was found. - "DMM" is not Japan-only.
CMD_GET_DMM_NOTIFICATIONis the top-menu Notifications feed (info_listof FEATURED_PLAYER, LEGEND_PLAYER, STORE_LINK, WEB_LINK, ICONIC_MOMENT items with title, body, thumbnails, players).CMD_GET_DMM_PLAYERINFO {is_present_inbox}is the gift-inbox badge. Both are sent every session on Steam. A bare NOERR is fine; avoid WEB_LINK/STORE_LINK. LIVE STATIC
Profile, account and store
| Command | What it is | Server should |
|---|---|---|
GET_GP_ACHIEVEMENT | GP balance all_gp, coins pes_point, all_achievement_bit_array | bare NOERR shows 0 GP; only myClub uses them |
GET_PLAYER_PARAMETERLIST | server override of player stats (108 values each) for myClub squads, matched by position in the list | bare NOERR (an empty list changes nothing) |
GET_AVATAR_HTTP / SET_AVATAR | profile picture: avatar_data base64, avatar_data_size ≤ 48 KiB, avatar_md5 lowercase hex MD5 of the decoded bytes | the server stores SET_AVATAR (128×128, 3 bytes a pixel: R,G,B,A at 6 bits each, 49152 bytes) and returns it; other players see it, e.g. in matchmaking LIVE |
SEND_LOG | live-update log; log is always "NotImplement" in retail | NOERR |
SET_LANGUAGE | lang; result ignored | NOERR; store for localized news |
LEAVE_ONLINE_MODE, JOIN/LEAVE_OFFLINE_MODE | presence: online_mode / offline_mode ("EXHIBITION"); results ignored | NOERR; could drive a presence status |
GET_STORE_PRODUCT_LIST, GET_STORE_TRANSACTION_STATE, *_STEAM_STORE* (HTTP) | myClub coin store; Steam microtransactions | empty / no pending transaction; reply an error to START_STEAM_STORE |
Live (2026-11-06): different data → GNCX_0006 "Unable to connect." 2 s after the match start (the sums do block the match); is_revision_check:"NO" → team selection reached. GNCX_0006 is the same param/entry compare as MXNV_0017: the multiplay object reports it one tick before the match task would (gncx_labels.md). Live: with the check off, a match with different player stats stayed in sync past minute 15 (identical minimaps), so a mismatch is unfair rather than fatal. Still unknown: whether a no-banner news item shows and how priority sorts; the image format for banners, ads and avatars.
Transport layers: large messages, the AES tier, dlcp, and the player-to-player link
(A) Server link (gate / ACCOUNT / MENU, TCP 10000)
onlinesystem::Client → fox::ncl NclMio (Blowfish tier) or NclEnhancedMio (AES-256 tier) → msgpack
(B) Player ↔ player match link (UDP, direct or through TURN)
onlinesystem::P2pFullMeshSession / CsClientSession / ObserveSession
→ kps::msp (multi-session protocol) → kps::domain::LlDomain + Clltcp (connections)
→ kps::lltcp FastTcp / ScalableTcp (reliability, pacing) → kps::dlcp (key exchange + RC4 records)
→ onlinesystem::NtlNetworkIo / P2pTurnIo* → ntl → UDP socket
(C) NAT traversal (ntl, cobra\NatTraversal\NTL): STUN-format messages with Konami methods/attributesFrame kinds and fragmentation
| Kind | Role | Body after decryption |
|---|---|---|
0x60 | whole message | u32 data_len, u32 original_size, u8 zlib, data |
0x70 | first fragment | u32 total_len, u32 chunk_len, u32 original_size, u8 zlib, chunk |
0x71 | middle fragment | u32 chunk_len, chunk |
0x72 | last fragment, then inflate and parse | u32 chunk_len, chunk |
0x10, 0x20–0x22 | same four roles, "no crypto" variant; the client never sends them and treats a received 0x10 like 0x60 | same |
0x1060, 0x1070–0x1072 | same four roles in the AES tier; the kind is not XOR-masked | same |
- Receive peek 0x141854f10 accepts exactly these kinds. Bit 0x1000 of the raw kind selects the AES parser. STATIC
- Send path 0x1418537d0: a payload goes in one frame if it is ≤ 0x3f7 bytes (AES: 0x3d7). Otherwise the first chunk is 0x3f3 (0x3d3) and later chunks 0x3fc (0x3dc). The client rejects any frame body over 0x410 (0x141854a49). STATIC
- Server action: send replies over ~1015 bytes as 0x70 + 0x71… + 0x72 with this layout, never as one oversize 0x60 frame, and reassemble incoming fragments the same way. Our URL list was trimmed to fit one frame because of this limit.
The "enhanced" AES tier (NclEnhancedMio / NclCryptAes)
- Not tied to a server type. It's a global tier: every send uses AES once the client holds a 32-byte key (
cmp [daemon+0x144],0at 0x141216c75). STATIC - Only two replies install that key, and only with
key_size == 32:CMD_SET_CURRENTPLAYER(handler 0x1410f9ca0:cmp r8d,0x20→ 0x14184f8a0 AES, otherwise 0x14184f8d0 Blowfish) andCMD_RECONNECT(0x141233ee0). We send 16, which is why we've never seen AES. STATIC - The key is cleared only when the game starts. Once AES is on, it stays on for every later connection until the game restarts. STATIC
- Crypto: AES-256-CBC via Windows BCrypt, manual PKCS#7 padding, SHA-256 integrity, no MD5, no XOR. Frame layout: STATIC
off len field encrypted? 0 2 kind 0x1060/0x1070–72 (big-endian, no XOR) no 2 2 body_len (incl. padding) ≤ 0x410 no 4 16 IV no 20 4 random nonce ("seq") AES-CBC ┐ 24 32 SHA-256(bytes[0:24] ‖ body) AES-CBC │ one CBC stream, 56 n body = data_len|orig|zlib|data + PKCS#7 AES-CBC ┘ (36+n) % 16 == 0 - The "COMPOUND" check in the send path is dead code left over from MGSV. Recommendation: keep 16-byte keys; AES gains us nothing.
kps::dlcp: security of the player-to-player link
- Every Clltcp connection in an LlDomain owns a dlcp link (vtable 0x142bc53a8 slots 13/19 → LinkController 0x14203c730). LlDomain is created by CreateMultiplaySession (0x1411aa730), which also picks the session type: 0 CsClient (game relay, "SC"), 1 P2P full mesh, 3 Observe. So dlcp protects the UDP match link between the players, and would also protect an SC relay or observer link. STATIC
- Key exchange (SimpleExchangeKeyExchanger): a ≤4-byte token and a 16-byte reply, both RC4 under the static key
a977d392 db0e55b9 9d1641c2 d4f82739(.rdata 0x142bcaf10). The 16 bytes become the session key. Direction is INFERRED. - Record:
[hdr u8][checksum u16 BE][payload], RC4 with the session key. hdr bit 7 = link flag, bit 6 = zlib (compress2 level 9), bits 0–5 random. The checksum covers the record with the checksum field zeroed. STATIC - Sequence and ack live one layer up, in
kps::lltcp(FastTcp/ScalableTcp congestion classes, pacing, loss/dup/reorder counters). UNKNOWN - Our server never needs dlcp for P2P matches. A TURN relay carries it opaquely. Only an "SC" relay endpoint or an observer would have to speak it.
NAT traversal messages (ntl)
- Everything is RFC 5389 STUN framing (magic 0x2112A442), with Konami extensions. STATIC
- Methods: 0x801 RT_ACK, 0x802–0x809 RP_HEARTBEAT / ENTRY / INFO / APPROVAL / EXIT / DATA_CAST / SYNC / P2P_SYNC, and the hole-punching set 0x80a UHP_FINALIZE, 0x80b UHP_CONNECT, 0x80c UHP_KEEPALIVE.
- Attributes: 0x9090 RP_P2P_HEADER, 0x9091 RP_RELIABILITY, 0x9092 RP_AMF_DATA, 0x9093 RP_JSON_DATA, 0x9094–0x9096 RP_HOST / REFLEXIVE / RELAYED_ADDRESS, 0x9097 RP_NAT_TYPE, 0x9098 RP_SYNC_POINT, 0x9099 RP_ENTRY_IDX, 0x909a RP_PEER_STATUS, 0x909b RP_RAND_SEED, 0x909c RP_RELIABILITY_ECHO, 0x909d UHP_FINALIZE_RET, 0x9999 TERM, 0xf000 ATTR_EXTENSION.
- NAT tests: MappingTest IA…IV, FilteringTest I/II, Hairpin test. We answer the 0xF000 MappingTestIA. LIVE
- The 5-second keepalive to the STUN server is a Binding request carrying 0x9090 and 0x9091, with a counter that increases per answered keepalive. LIVE
- Hole punching (inferred from event names): UHP_CONNECT to the peer's host, reflexive and relayed addresses from WATCH_MATCHING, then UHP_KEEPALIVE, then UHP_FINALIZE / UHP_FINALIZE_RET. After that, dlcp/lltcp datagrams share the same UDP socket. Peers exchanged 48-byte and 256-byte packets in our captures. INFERRED
VDPCHAT and voice chat
VDPCHAT is one of four server types (with GATE, ACCOUNT, MENU). Entries of that type are stored in their own list (+0x4070 of the server list), but nothing reads that list. Voice chat (onlinesystem::VoiceChatImpl, ktVoice codec, TaskVoiceChat in the MOM lobby) appears to ride the match session. Don't advertise VDPCHAT. STATIC INFERRED
Still unknown: the lltcp header (sequence/ack/window), the contents of UHP_* messages, and the match-layer packet format (MatchOnline*.cpp messages inside msp). A hex dump of the first ~64 bytes of each UDP send during matchmaking and kick-off would settle all three.
The big modes: myClub, clans, PES League, Matchday, events
Survey level: request and reply fields are extracted for every command (see the catalogue), but the flows below haven't been traced state by state. STATIC fields, INFERRED meaning.
myClub (125 commands)
- Everything is server-owned: the club (
CREATE_MYCLUB_TEAM {team_name, base_team_id, coach_id, rental_gameplayer_id}), squads (CREATE/COPY/SET_MYCLUB_SQUAD_*withgameplan_datablobs), owned players (GET_MYCLUB_GAMEPLAYERLIST:gameplayer_id= the game's own player id,gameplayer_unique_id= the owned card, plus level, exp,contract_term, rating, tiredness andparameters), coaches, items, trainers and staff. - Signing players: agents with draw rates (
GET_MYCLUB_MARKET_AGENTLIST,GET_MYCLUB_AGENT_DRAW_RATE {rate_table},USE_MYCLUB_AGENT), scouts and about 18 auction commands with live bidding (pushWATCH_MYCLUB_AUCTION_SCOUT_DETAIL). - Economy: GP and myClub coins (
pes_point), contract renewals (EXTEND_MYCLUB_GAMEPLAYER), selling, presents, login bonus, achievements, weekly rankings (HTTP). - Matches: VS COM (
GET_MYCLUB_VSCOM_OPPONENTreturns a wholeteam_data;SET_MYCLUB_VSCOM_GAMERESULTreturns a rating), Sim, co-op squads,SEND_MYCLUB_MATCH_RATING. - What's missing: Konami's card data. Featured and Iconic players have boosted stats sent by the server (
parameters,enhanced_parameters), plus agent pools, prices and the event calendar. None of it is in the client. - Feasible subset ("myClub lite"): cards from the local player database at base stats, a fixed coach list, our own agent pools, VS COM and PvP with our own rating. Large effort; a project of its own.
Clans (17)
Create, search, request to join, accept or reject, expel, settings, members' current online mode, and an HTTP clan ranking with divisions (GET_CLAN_RANKING {division}). Mostly records and lists of player blobs (pid, pname, online ids). Moderate effort; useful as a "friends group" feature.
PES League (17) and events / competitions (12)
DONE Online Tournament is in the server (pestourney.py, live 2026-11-08): friends' 1v1 competitions in the game's own eFootball League screens. A monthly "Friends Cup" runs by itself; hosts can add their own through /admin/api/tourneys (name, dates, team list, match length, outline text). The player enters with a team, presses Start Match (it uses Quick Match matchmaking with matching_type "PES_LEAGUE", and only players of the same competition are paired), and gets 3 points for a win, 1 for a draw. The after-match "Changes in rating" screen shows the points; the 1v1 menu, Rankings (5 pages), Current Match Results, Competition Outline and, after the end, the "Competition Results" notice with the final position all show real data.
- Match length and rules LIVE: a top-level
compe_regulationblob in GET_PESLEAGUE_COMPE_INFO (match_time NUM in real minutes, condition STR, ranking_match_num, trade_num, extra_time STR, guest STR, is_equalization / is_3member_coop / is_ex_substitution YES/NO). Without it the game plays a match of about 2 minutes.is_equalization "YES"promises evened-out ratings and makes the game ask the server for them (GET_PLAYER_PARAMETERLIST); the server sends "NO", so teams play at their real strength. - The path: list → "Enter this Competition. Proceed?" → COMPE_INFO (fields also inside a
compe_datablob;match_typethere picks 1v1 menu, co-op or lobby) → TEAM_LIST → JOIN_PESLEAGUE_COMPE {team_id} → 1VS1_MAINMENU_INFO (the matchmaking window ends atmatching_first_date + matching_time). Layouts:tourney.md. - PES League (eSports): competitions with entry windows and matching times (
GET_PESLEAGUE_COMPE_LIST {entry_limit_date, entry_user_limit, match_end_date…},…_1VS1_MAINMENU_INFO {matching_first_date, matching_interval, matching_time, point, rank…}), rankings, result lists and rewards. Needs a scheduler and standings. - Events (COMPEV): event categories with banners (
GET_EVENT_CATEGORY_LIST), VS COM or online competitions with progress counters (GET_COMPEV_MAINMENU_INFO {clear_count, progress_game_count, win_point}), join, leave and re-entry.
Matchday (20)
DONE Matchday is in the server (pesmatchday.py, live 2026-11-06): one standing event, Home and Away sides with four teams each, ordinary 1v1 matches (win 3, draw 1), points per player and per side. Needed: the event map inside compe_info.info_overview, a future end_group_match_date, and the player's own squad (sent with JOIN_MATCHDAY) returned by GET_MATCHDAY_SP_GAMEPLAN, or the match crashes while loading. Only the group stage: the pick-up stage and the watched final are not built (matchday2.md).
2026-11-06 (modes2.md, static): the group stage looks possible with one fake Matchday: JOIN_MATCHDAY_MODE → GET_MATCHDAY_LIST → GET_MATCHDAY_INFO → pick a side and a team → JOIN_MATCHDAY → GET_MATCHDAY_MAINMENU_INFO (progress "GROUP_MATCH") → START_MATCHING matching_type "MATCHDAY". The final (watched by others) needs spectating. Events (COMPEV) have no menu entry of their own: they are reached only from myClub and co-op event rooms.
Two-sided group events: join a side, play "pickup" matches (START_MATCHDAY_PICKUP_MATCHING → push WATCH_MATCHDAY_PICKUP_MATCHING with member host_addr, like Quick Match), collect Matchday points, and a final match between the sides' representatives that others watch (SET_MATCHDAY_START_WATCH_MATCH, GET_MATCHDAY_FINAL_RESULT_INFO {is_exist_watch_match_data}). Needs spectating (see co-op and spectating).
Random Selection, social, fair play
- Random Selection Match:
GET_RANDOMSELECTION_LOTTERY_LIST {gameplayer_list, trade_num},RESULT_RANDOMSELECTION_LOTTERY/TRADE,SYNC_RANDOMSELECTION_TRADE(ProcessOnlineRsLottery.cpp, MenuOnlineRsTrade.cpp). Random squads with trades. The player pool could come from the local database. - Social: follow list, text chat and blocks (see rooms);
GET_KONAMIID_FUNCTIONAL_BLOCKADE {is_blocked}. - Fair play:
CHECK_CHEAT,GET_MANNER_WARN {warn_kind},SEND_KICK_REQUEST, andSEND_TAMPER_DATA {pid, match_category, data, error_code}, an anti-tamper report the game can send (never seen in our logs). See fair play and menus.
In-match sync messages (14)
TEAM_DATA_SYNC, USER_DATA_SYNC, BL_DATA_SYNC, SYNC_COMMENTARY, SELECT_SIDE, COMPLETE/UPDATE_TEAM_SELECT, CMD_ERR, CMD_LACK, CMD_SENDFAILED, LOST_GUEST, SET_GUEST, REVISION_CHECK have no reply parser. They look like player-to-player multiplay commands carried inside the match session (MultiplayCmdTeamDataSync.cpp), not server commands. INFERRED CMD_RECONNECT is a real server command (see match flow).
Inside the game binary
- Size (PES2021.exe 1.01.00): 37 MB of code in the
.tracesection, about 118,500 functions (158,720.pdataentries incl. chained chunks), 10,179 C++ classes with RTTI, 9,188 with recorded base classes. A further 380 MB section,.impdata, looks packed or obfuscated and was not examined. Only 68 source-file paths survive, 33 of them online code, so the rest of the game has few debug strings. STATIC - Main areas by class namespace:
Area Classes What it is fox::gr,fox::ph,fox::geo,fox::anim,fox::fx,fox::ncl…~2,100 Fox Engine: graphics, physics, geometry, animation, effects, the server-link codec menu,menusystem,menuutility,flash~1,400 menus and UI (416 classes derive from menusystem::Window)commandautomake,command,onlinesystem,onlinemode,onlinelogin~1,750 server commands and the online system (this page) cobra::*~840 Konami middleware: render, config, job graph, file I/O, NAT traversal mode::offline737 offline modes; about 205 Scenario judge/post-process pairs, likely Master League / Become a Legend story events process,process::mail~720 screen-flow steps (156 online ones) and an in-game mail/messages system match,match::player,match::ai,match::anime,match::pad,match::camera,matchPlan~600 the match engine: player control, AI, animation, controller input, camera, tactics kps::*,ntl~250 player-to-player network stack and NAT traversal (see transport layers) draw,sound,fixdemo,edit,savesystem,tmpdb,livedata~300 rendering helpers, sound, cutscenes, Edit mode, saves, the in-memory database, live data - Every server command also has a JSON form: 401 classes derive from
fox::ncl::NclJsonMessageBase/NclJsonMessageResult, next to the MessagePack parsers we use. That's the second parser on each reply class. The game accepts MessagePack, so it isn't needed. STATIC - Finding code:
notes/re/functions/tools/classmap.pyrebuilds the full class list with base classes and vtables from the game exe. Thekb.pycommands find users of a string, address or struct offset (str,refs,callers,disp), summarise a command (cmd) and dump functions (fn).
The game database: players, teams, rosters
Where it is STATIC
- Files
common/etc/pesdb/*.bininside the CPK archives: the update packdownload/dt80_100E_x64.cpkoverridesData/dt10_x64.cpk, which overridesdt00. The game reads 28 tables, including Player, Team, PlayerAssignment, Coach, Competition, CompetitionEntry, Country, Stadium, Tactics, TacticsFormation, PlayerWeekly and TeamWeekly (file table 0x1434d6630, record sizes 0x1428bb100). - Wrapper:
ff 10 81 "WESYS"+ u32 compressed size + u32 size + zlib (flag 0x00 = stored). No encryption. - In memory: up to 30,001 players (0x17c bytes each) and 750 teams (0x690 each). Player loader 0x1414f4500 → converter 0x1414f8420 → bit unpacker 0x1414c78e0 (108 setters) → clamp to MIN/MAX 0x1414f79d0. Teams and rosters: 0x1414f5120.
Player.bin: 312 bytes per player (18,452 in the update pack) STATIC
| Offset | Field |
|---|---|
+0x00 u32 | associated / legend club (e.g. Totti → Roma). Not the current team, which comes from PlayerAssignment. |
+0x04 u32 | loan parent club (0 = not on loan) |
+0x08 u32 | player id (bits 0–17; Messi = 7511) |
+0x0c, +0x10 | contract-until / loan-until dates as yyyymmdd in bits 0–26; the top 5 bits hold the free-kick motion and the playing style |
+0x1b | height − 100 |
+0x1c | nationality (bits 9–17), second nationality (bits 0–8), goal celebration, place kicking |
+0x20…+0x43 | bit fields holding the 108 parameters (value = (u32 >> shift & mask) + add) |
+0x44, +0x81, +0xbe, +0xfb | names, 61 bytes each, UTF-8: Japanese name, shirt name, second short name, main name ("L. MESSI") |
The 108 parameters (in the order the checksum uses): registered position; 13 position ratings (none / B / A); the 29 abilities (Offensive Awareness, Ball Control, Dribbling, Tight Possession, Low Pass, Lofted Pass, Finishing, Heading, Place Kicking, Curl, Speed, Acceleration, Kicking Power, Jump, Physical Contact, Balance, Stamina, Defensive Awareness, Ball Winning, Aggression, GK Awareness/Catching/Parrying/Reflexes/Reach, weak-foot usage and accuracy, form, injury resistance); height and weight; foot; age; playing style (22 values); 7 COM playing styles; 41 skills; and motion and appearance values. Names come from the game's own UI-order tables (0x142978fd0 abilities, 0x142978f90 positions, 0x142979100 skills, 0x1429790d8 COM styles). The bit map was checked against the game's real unpack code for 150 random players with zero differences. A few names are still uncertain (p43, p48–p50, the motion order). Skill names follow the game's own English labels: 74 = Long Range Drive (PES 2020's "Long Range Curler"), 106 = Long Range Shooting, 99 = Step On Ball Control, 105 = Cross Over Turn, 101 = Rising Shots. STATIC INFERRED
Team.bin and PlayerAssignment.bin STATIC
- Team.bin: 0x5fc bytes per team, 669 teams. Team id at +8, coach id at +0, rivals, stadium id (u16 at +0x3c), country (+0x44 bits 18–26), 20 language name slots (English at 0x170), short name at 0x372.
- PlayerAssignment.bin: 16 bytes per row, 18,582 rows: entry id, player id, team id, then flags with shirt number − 1 (bits 0–9), line-up order, set-piece roles and captain (bit 21). This is where current club, national team and shirt numbers come from.
- Coach, Country, Stadium, Competition, CompetitionEntry, Derby, Tactics, PlayerWeekly and TeamWeekly are described in
notes/re/functions/db.md.
What the login checksums really are LIVE STATIC
param_check_sum= for each player, (id & 0xffff) + the 108 parameters + (height & 0xff) + (weight & 0xff) + condition, summed into 4 accumulators and XOR'd with a fixed key.entry_check_sum= for each team, team id + Σ(player id + shirt number).- Recomputed from the stock update-pack files:
25D6DFBB091E75D525E090F993DBAE73/1E21A82F1DFF00C9DBE591735FF8746A, exactly what both test clients sent. So both ran the unmodified update-pack database, with no edits and no live data. A game without the update pack (dt10 only) sends25BC6828…/1E8FB88B…and would fail the revision check against an updated player. - The "condition" term is the player's weekly form from PlayerWeekly.bin, but only after a live update has been applied (DB live-data mode 1, set by LiveDataSetFlow). Otherwise it's the constant 5. So delivering live data changes every player's checksum: all players must get the same live data.
Saves and the option file
Saves live in Documents\KONAMI\eFootball PES 2021 SEASON UPDATE\save\ (types EDIT, SYSTEM, …), except the downloaded Live Update, which is C:\ProgramData\KONAMI\eFootball PES 2021 SEASON UPDATE\save\LIVE00000000 (live test). They're encrypted with an MT19937-based XOR stream (0x14140e0f0), keyed from 64 header bytes at +0x100. Where the master key comes from wasn't traced, and no save files were read. Edit data overrides the database, so an edited option file changes the checksums. STATIC
Using it
notes/re/functions/tools/pesdb.py reads the CPKs directly (update pack first): checksum (both sums, also the live-data variant), player <id>, team <id>, dump out.json. For the server, it gives names for the ids in SET_PLAYDATA_MATCH and line-ups, squads for vs-CPU co-op and a myClub-lite, and a way to name the cause when two players' checksums differ (missing update pack vs edited data).
Live Update: how the game downloads new data
Three kinds of downloadable data STATIC
All three are ordinary CRI CPK archives, loaded on top of the base data (driver livedata::LiveDataSetFlow, LiveDataSetFlow.cpp, error prefix SGJC, update fn 0x1420ac3f0):
| Kind | Reply list | Saved as | Load priority | Version file inside |
|---|---|---|---|---|
| Live Update | dlcfile_list[0] | save slot 0x1b "Live Update" | 5 | common/etc/version/version_wu.bin |
| Variation 0–15 | variation_file_list[i] | slots 0x1c–0x2b | 5 | version_vd00…15.bin |
| Extra Update | extra_file_list[0] | file ExtraUpdate.bin | 6 | version_xu.bin |
The sequence
- Data pack gate: the game's update-pack version (
version_dp.binin dt80 = "1.00" | "1.01.00" | "2396" → 100) must not be lower than the server's DLC version, which is GET_SVRVERSIONdlc_version(copied to[netmgr+0x68]by 0x1410f08c0). Otherwise ERROR_CODE_DP_VERSION_OLD (SGJC392). Our "1.00" passes. GET_SVRVERSIONlivedata_versionhas no reader. STATIC - Ask:
CMD_GET_DLC_FILELISTover HTTP to the FLOW URL:file_type=LIVEDATA®ion=REGION_ALL&pid=0. Sent at every login and again on entering an online mode, before JOIN_ONLINE_MODE and CHECK_CHEAT. LIVE - Decide: Live Update is new if
atoi(dlcfile_list[0].dlc_version)> the version of the Live Update already saved (0 if none). Version strings in the files parse as "a.bb" → a·100+bb, so "1.01" ↔"101". STATIC - Download: plain WinHTTP GET of the entry's
url(https only if the URL says so). It needs status 200, and the body must be exactlysizebytes: longer fails, shorter is zero-filled and fails the hash. The limit is 120 s for the whole transfer. STATIC - Check: SHA-256 of the downloaded bytes as 64 lowercase hex characters, compared exactly with
hash(mismatch → "wrong hash", SGJC1006). That's the only check: no signature or key. STATIC - Save and load: the raw bytes go into the save slot (save failure → SGJC1102), then get loaded as a CPK at priority 5 (load failure → SGJC1306). Afterwards the edit data (option file) is re-applied on top, so players' own edits stay. A "LiveDataSetDialog" confirms it. STATIC
CMD_GET_DLC_FILELIST reply STATIC
- Fields:
dlcfile_list_count, dlcfile_list, variation_file_list_count, variation_file_list, extra_file_list_count, extra_file_list(parser 0x141d34a90). There is no top-leveldlc_version; the one we send is ignored. - Each element is a real inline msgpack map (not a nested blob):
{name STR, size NUM, url STR, hash STR, dlc_version STR (integer string), required_program_version NUM (ignored)}. Onlydlcfile_list[0]is used.extra_file_list_countis trusted as the count, so keep it consistent with the list. - Today we send empty lists: no live data → ERROR_CODE_NOT_DELIVERED → one "No new Live Update" dialog per session and
CMD_SEND_LOG {title:"LiveUpdate"}, then login continues. Harmless. LIVE
What a Live Update file contains
common/etc/version/version_wu.bin: 30 bytes, three NUL-padded 10-byte ASCII fields (content version, required program version, build string; the same layout asversion_dp.bin; only the first field is read). Required: without it the client stays at version 0 and downloads again at every login. STATIC INFERRED- The database tables the live-data module handles (0x142bd0ec0): PlayerWeekly, Tactics, TacticsFormation, PlayerAssignment, Player, PlayerAppearance, BootsList, PlayerDeleteList, Coach, CoachDeleteList, TeamWeekly, under
common/etc/pesdb/in the usual WESYS format. A full roster update is about 1.5 MB. Team.bin is not in the list. - Persistence: the saved file stays across restarts until a higher version replaces it. The Live Update is applied per session by this flow; Variation and Extra files are loaded from boot.
Effect on matchmaking
CHECK_CHEAT is sent after the Live Update is applied, and with live data active the checksum also includes each player's weekly form. So players with the same Live Update get the same checksums (live: only while the server keeps listing the update; an empty list at mode entry makes the game fall back to its base data), and a player without it (or with an older one) would hit "DATAPACK error" against them. Players report their live-data version in JOIN_ONLINE_MODE livedata_version ("0" today), which the server can compare. There's also an ERR_DIFFERENT_LIVEDATA_VERSION error code, whose on-screen handling is unverified. STATIC LIVE
Publishing our own update (what the game expects)
- Build a CPK with
common/etc/version/version_wu.bin(e.g. "1.01" | "1.01.00" | a build string) and the changedcommon/etc/pesdb/*.bintables. Ourtools/pesmodCPK writer produces CPKs the game accepts. - Serve it with HTTP GET at a fixed URL on the server's HTTP port: status 200, exact Content-Length, raw bytes.
httpgate.pyneeds a new route for this. - Reply:
{"result":"NOERR", "dlcfile_list_count":1, "dlcfile_list":[{"name":"livedata_101.cpk", "size":<bytes>, "url":"http://<server>:8080/livedata/101.cpk", "hash":"<sha256, lowercase>", "dlc_version":"101"}], "variation_file_list_count":0, "variation_file_list":[], "extra_file_list_count":0, "extra_file_list":[]}. To publish again, raise the version in both the file and the reply. - Compare
livedata_versionat JOIN_ONLINE_MODE and pair players only when their checksums match.
Tested live: the Live Update slot is saved as C:\ProgramData\KONAMI\eFootball PES 2021 SEASON UPDATE\save\LIVE00000000 (encrypted), and the predicted checksum matched exactly (details). Still unknown: the folder for ExtraUpdate.bin; which tables are re-read after loading; how the client shows ERR_DIFFERENT_LIVEDATA_VERSION; what Variation and Extra files were used for (probably myClub card art and stadium assets).
Tuning the connection: proto_opt, failover, NAT type, NAT test
GET_SERVER_ENV. We send none, so the game uses its built-in defaults. Konami's real values are lost, but our server can now tune them. The NAT type the game reports is never used by the game itself.GET_SERVER_ENV.proto_opt: the tuning tree STATIC
- Chain: GET_SERVER_ENV handler 0x141210dd0 →
ParameterMultiplay::SetJson0x141174b20 → JSON parse. It's read again every time a match session is created (CreateMultiplaySession 0x1411aa730). Invalid or missing JSON (our "NotImplement") is harmless: all defaults stay. A hash of the text is reported back in the post-match stats (PROTO_OPT_HASH). - Shape:
{ "<profile>": { "<group>": { "<key>": value } } }. The profile is"P2P"for normal matches ("CS"for the game relay,"P2P_ADHOC"for direct online). A level profile"P2P_HIGH_LEVEL"/"_LOW_LEVEL"/"_GIVE_UP_QUICKLY_LEVEL"overrides it key by key. Which level Quick Match uses is unknown, so put values in"P2P". Integers must be JSON integers. - Groups: Network, NatTraversal, Session, Domain, ProtocolTransmission, ProtocolChannel, MatchCommandBufferingControl (input-delay buffering), Match (load/out-of-play/command-lack timeouts), MultiplayStatistics, OnlineSystem (voice chat, network testers, observe).
| Network key (selection) | Default | Meaning |
|---|---|---|
NetworkIoConnectionTimeoutUs | 15 000 000 | direct-link connect timeout. Two attempts ≈ the 30 s we see before ER_MATCHING_RETRY |
ChangeoverPeerReceiveIdleTimeMsThreshold | 7500 | silence on a route before failover |
ChangeoverToTurnBufferCriticalConditionTimeMsThreshold | 10000 | direct link congested this long → TURN |
P2pModeTurnSendEnable / …IntervalMs | true / 5000 | keep the other route alive |
TurnNetworkIoTcpConnectionTimeoutMs / ConnectionTimeoutMs | 10000 / 10000 | the TURN TLS-over-TCP connect must finish in 10 s |
TurnNetworkIoPingIntervalMs / QuickPingIntervalMs | 5000 / 1000 | RTT probing on the TURN route |
TcpFallbackEnable / TimeoutMs | false (true for CS) / 10000 | TCP fallback of the link |
MaxPayloadLength | 1196 | max UDP payload (leaves room for TURN overhead) |
DscpEnable / Dscp | true / 46 | packet priority marking (EF) |
The other two 15 s timeouts are ProtocolTransmission.ConnectionTimeoutUs and Domain.LinkTimeoutUs (key exchange: Domain.KeyExchangeTimeoutUs 20 s). Lever to test for hard-to-connect pairs: {"P2P":{"Network":{"NetworkIoConnectionTimeoutUs":30000000}}}. Keep proto_opt small so GET_SERVER_ENV stays within one frame. The full key list is in notes/re/functions/nettune.md.
When the game switches between direct and TURN STATIC
P2pTurnIoFailover (only when a TURN list is sent) starts on the direct path. It moves to TURN, while the TURN route is up, when: the direct link isn't connected (reason 1); the direct link has been congested for over 10 s (reason 3); or TURN is receiving but the direct link never received (reason 4) or has been silent for 7.5 s (reason 5). It goes back when the direct link receives within 7.5 s again (reason 6). After a congestion switch it waits 0 s, 10 s, 20 s… (at most 60 s) before going back. The reasons are reported in the post-match stats (TURN_CHANGEOVER_REASON/TIME). The TURN server must keep allocations alive for the whole match.
Possible limit: TURN setup checks that one config list has exactly one entry (0x14122eab1). If that list is the peers, TURN mode would only work 1v1 and co-op with a TURN list would fail with "Error CreateMultiplaySession". Test co-op with TURN before relying on it. UNKNOWN
The NAT type value (ntl_nat_type) STATIC
- 1 = no result yet; 2 or 3 = the NAT test failed. Otherwise a bit set: 0x10 UDP reachable, 0x20+low bits = filtering class (3 = worst/unknown), 0x100–0x2000 UPnP found / mapping / external IP, 0x4000 STUN address ≠ UPnP address, 0x10000 hairpin works, 0x20000 mapping varies (symmetric NAT), 0x100000 port preserved, 0x200000 port parity preserved, high bits = NTL config flags.
- Our clients'
0x10307533= UDP reachable, port and parity preserved, UPnP working, STUN ≠ UPnP address (our STUN sees the LAN IP), filtering class 3. The hairpin and mapping tests never ran. - The game never branches on it: no strategy change, no refusal, and no "NAT Type" text shown to the player. It's only reported to the server for matchmaking. Our matchmaker can ignore it, or use the symmetric-NAT bit as a hint to prefer TURN.
The NAT test and GateInfo.php
- 14 tests in phases (MappingTest IA…IV, FilteringTest I/II, hairpin). The extra tests only run if the first reply (IA) carries an OTHER-ADDRESS (0x802C) and a Konami 0xF000 "O573_CR_XADDR" address. Our STUN answers IA only, so the rest are marked skipped, and our logs show only the 32-byte IA probe. Nothing depends on the rest; leave
stun.pyas it is until the 0xF000 reply layout is proven. STATIC LIVE GateInfo.php: STATUS 200 and API_STATUS 0 (what we send) are fine. API_STATUS 1 + LOG_ACTIVE 1 + PUT_LOG_URL would make clients upload their NTL logs, an optional debug channel.- The "SC" game relay (Konami's own full relay) isn't worth building: it needs the undecoded link layer and session logic, with no traffic to learn from. TURN is strictly better.
Live test results (2026-11-05 and 11-06)
TURN relay LIVE
- The game accepts our list and certificate and connects over TLS to tls_port. It sends Allocate
{LIFETIME 60, REQUESTED-TRANSPORT UDP, MOBILITY-TICKET (empty), SOFTWARE "ktc-0.0.0", FINGERPRINT}, receives a 401, retries with long-term credentials, and gets the allocation. - It then needs the relay's
SOFTWAREattribute to be a "dual route" directiveHOST:PORT,<text>,0, which Turn::Impl reads after allocating. With no SOFTWARE, or any other value, the game closes the connection about 30 ms after the allocation and starts over every second, forever. With the directive, the TLS session stays up through a whole match, refreshed every 30 s. A port of 0 counts as invalid. - With the directive, the game tries a second leg over DTLS/UDP to that host:port (three 189-byte UDP packets at 0, 1 and 3 s). With nothing answering, it never publishes
SEND_TURN_ADDRESS_DATA(watched for over 3 minutes), so the relay isn't used. - Second leg against a stock DTLS server: the game completes a DTLS 1.2 handshake (cookie exchange included) with our relay's TURN certificate, cipher
ECDHE-ECDSA-AES256-GCM-SHA384(the same as the TLS leg). It then sends application-data records over and over that the stock server can't read. Later (2026-11-06): they are TURN Allocates in the ktc framing (64-byte STUN + type byte, plus a 2-byte trailer counted in the record length); with that handled, the DTLS leg works, see the second round below. LIVE
Live Update LIVE
- Our reply offered one CPK (
common/etc/version/version_wu.bin"1.01" + an editedcommon/etc/pesdb/Player.binwith Messi's Speed 81 → 82). The game fetched it with one HTTP GET, checked the SHA-256, saved it and applied it. It then showed "No Live Update changes to Condition Rating. All players' conditions will change each match…", its notice for an update without a PlayerWeekly table. JOIN_ONLINE_MODE livedata_versionbecame "1.01".CHECK_CHEAT param_check_sumwas exactly the valuepesdb.pypredicted (25D6E9E6…6094); the roster checksum was unchanged.- Saved as
C:\ProgramData\KONAMI\eFootball PES 2021 SEASON UPDATE\save\LIVE00000000: the CPK plus 990 bytes, encrypted by the save system. Deleting that file removes the update.
Reconnect, outages, AFK LIVE
- Server down about 7 s during a match: both games sent
CMD_RECONNECT {pid, platform, patch_version, dlc_version, online_mode}, got a new key and carried on. About 15 s: "Connection to server lost. CODE:APLR_0002". Outage while in the menus: "Connection to server lost. CODE:VNBP_0002", with no reconnect attempt. - AFK: 72 s without input after kick-off ends the match. The idle player gets
NO_OPERATION / VIXT2253_0x1a000000("This match will be called off, as you stopped playing for some time."); the other getsDISCONN_SC / GNCX_0003_0x20000000("Connection quality with … has significantly worsened. Canceling match."). Both still wait out REQ_GAMEADDPOINT (+10 s) before reporting results (+22 s).
Menus LIVE
The eFootball menu lists Quick Match, Online Divisions, Online Co-op, Matchday and Online Tournament. Kick Off lists Local Match, Local Match [UEFA EURO], Co-op, Random Selection Match, Versus, League and Cup. The list scrolls: after Cup come Friendly Match Lobby (the Free 1v1 room lobby), Team Play Lobby (MOM) and Training. (An earlier version of this page wrongly called the lobbies hidden; the first test stopped scrolling at Cup.)
Friendly Match Lobby, live: JOIN_ONLINE_MODE {online_mode "FREE"} → SEND_IPANDPORT_NTL, GET_SERVER_ENV, CHECK_CHEAT, GET_URGENT_ANNOUNCEMENT, GET_MANNER_WARN, GET_PRIVATEINFOTITLELIST → GET_LOBBYLIST {lobby_type "FREE"} → JOIN_LOBBY → GET_LOBBYINFO → GET_BLOCKLIST. A bare "OK" here gives "Unable to send or receive data."; with one block it continues: JOIN_BLOCK {block_id} → REQWATCHL_ROOMLIST is a real request → the "Match Room List" screen ("Set up Match Room", "Number of rooms"). Creating a room: Room Settings (name, security, password) → General Match Settings (time, injuries, ball, time limit, overtime, PK, substitutions) → CHECK_STRING {room name} → CREATEJOIN_ROOM first, then SET_GAMEENV (game_env = a blob of the 9 settings) → REQWATCHL_ROOMPLAYERLIST_NTL {room_id}. Room creation works when the server follows three rules found by code reading and a live bisection: (1) after CREATEJOIN_ROOM, push the owner's room into the room list (ADD) before the player list, because the game looks for its own pid in the room list; (2) in the player list, pname.psn_user_id is a nested blob {account_id, online_id, is_valid_cache} (an object, as in WATCH_MATCHING, exits the game; an empty list is read as garbage memory); (3) answer REQWATCHL_ROOMPLAYERLIST_NTL only with the reply and push no list before the owner's ENTRY_GAME: our test server also pushed the same list 50 ms later, and that second copy ended the game about 0.2 s later every time (an UPDATE after ENTRY_GAME was harmless). With the reply only, the owner sends ENTRY_GAME {entry FALSE, side HOME} and shows the room screen "[001]Room <name>". A bare NOERR reply without a list gives LEAVE_ROOM {error_code "VZLN_0002"} (creation failed). A second player's Match Room List showed "Number of rooms 0" although our reply listed the room. Code reading found the cause: the list builder (0x14104c730) hides every room whose gameenv.limitTime is NOSET or unknown, and also rooms with is_invite_limit YES or an empty gamer list. Our test server sent NOSET because it never unpacked the game_env blob of SET_GAMEENV (the game had sent MIDDLE). The fix: store that blob, echo it as gameenv, and push a room-list UPDATE after SET_GAMEENV (notes/re/functions/roomlist.md). An empty list as owner_pname.psn_user_id in the room list ends both games (notes/re/functions/livetests.md, roomcrash.md). LIVE
Friendly Match Lobby, whole flow (2026-11-06): with those rules, a friend picks the room and both players reach team selection.
- Room list: the second player sees "Number of rooms 1" and the row "[001]Room <owner>" with Owner, Capacity 1/2 (
gamer_num/max_players) and an EN tag (owner_lang). - Room details: selecting the row sends
REQWATCHL_ROOMPLAYERLIST_NTL {room_id}from a non-member. Our reply gives the details screen: the owner's settings fromgameenv(limitTime MIDDLE shows as "Time limit Normal"), Home = owner, Away = "Accepting Participants", Enter. - Join:
JOIN_ROOM_NTL {room_id, is_invited "NO", password}→ reply{room_owner blob, room_stat}+ room-list UPDATE. The joiner then asks for the player list (reply) and sendsENTRY_GAME {entry FALSE, side AWAY}. A player-list UPDATE goes to the owner, who sendsSEND_NOTICEROOM_SHARE_INFO(team id/name/power, chemistry) to both and an emptySET_GAMEMEMBER. Both screens show Home and Away names. - Ready: "Start Match" sends
ENTRY_GAME {entry TRUE, side}; after ourWATCH_ENTRY_GAMEpush that side's OK turns green. - Start: when both have entered, the owner sends
SET_GAMEMEMBERagain. The server pushesWATCH_DECIDE_GAMEENV {game_env}andWATCH_ROOMSTATE {StateChanged, SETENV}to both. The games then run the usual match start: GET_MATCHID, SEND_SYNC_NOTICE, GET_SERVER_ENV, P2P START/END, DATASYNC. The owner sendsSET_GAMEMEMBERENV {envlist [blob{pid, side, sideLeader}]}(default reply is enough), then TEAMSELECT. Both games showed team selection. Stopped there; from here it is the same match session as Quick Match.
Player-list UPDATE pushes after a player's ENTRY_GAME, and to the owner when someone joins, were harmless. The test handlers live outside the repo; the production server does not have the lobby yet. LIVE
Second round (2026-11-06 afternoon)
- A whole Friendly Match Lobby match, and back to the room. A 10-minute match ran through 1ST … BREAK1 … 2ND … END (about 29 real minutes with autoplay). After the "Full Time" screen each game sends HTTP
SET_PLAYDATA_MATCH(gamemode26),SEND_STATS_DATA,SEND_GAME_RESULT, a newREQWATCHL_ROOMLISTandLEAVE_GAME. Whoever confirms first leaves the match session; the other, still on the stats screen, then reportsDISCONN_P2P / GNCX_0003and sees "This match will be abandoned. There has been a connection problem…" (same pair as in Quick Match). When both have left, ourWATCH_ROOMSTATE WAITINGpush brings both back to "You can now start the match by selecting Start Match", so a rematch is possible. A room in a match stays in the list (2/2); selecting it gives "Could not enter because a match is currently being played." from the client itself. LIVE - The duplicate-list crash is confirmed: a player-list
RELOADpushed to a game whose list cache already holds entries ended it within 0.25 s, withe06d7363(C++ exception) in its Wine log; anUPDATEwas harmless. Rule: RELOAD only as the reply to a newREQWATCHL_*request, every push ADD/UPDATE/DEL. LIVE - Live Update: keep listing it. The game asks for the file list again when it enters an online mode (always
pid=0). If the update is no longer listed, it computes CHECK_CHEAT from the base data, while still reportinglivedata_version. Listed every time, the sums were exactly as pesdb.py predicts. A reboot does not download it again. LIVE - TURN relay, second leg working. The game's TURN client is stock OpenSSL 1.1.0i wrapped by Konami's ktc layer, which adds 2 bytes after the last record of every application-data datagram it sends (and counts them in the record length) and ends every plaintext with a type byte (0x00). A relay that strips the 2 bytes, strips the 0x00 and replies with
SSL_write(message + 0x00)gets the whole flow: Allocate → 401 → Allocate → Refresh, the TLS connection closed (it only bootstraps),CMD_SEND_TURN_ADDRESS_DATApublished, ChannelBind to the opponent's relayed address and ChannelData both ways. The address blob is 20 bytes:00, port big-endian, IPv4 little-endian, zeros. The 21.4 s restart cycle came from the game re-creating its DTLS socket every 10 s (DSCP on by default), which changes its UDP port; a relay that moves the session to the new port when a record decrypts with that session's keys keeps TURN up (fixed,turncycle.md). A match runs entirely over the relay (both direct paths made unreachable): kick-off and play over TURN, 10,000+ relayed packets. The key: the game sorts the two peer address labels and only the side with the lower one opens the link, so the server must hand out labels where exactly one side is "lower" (our first try had both waiting and failed with MXNV_0013).proto_optis honoured too (DscpEnable false stops the port changes; Session.ConnectionTimeoutUs moved a timeout from 10 to 30 s) (ktcdtls.md,turncycle.md,turnlinkup.md). LIVE - Data mismatch (one copy on a Live Update, one stock): with
is_revision_checkon (default) both sessions end 2 s after START with GNCX_0006 and "Unable to connect." (not the predicted MXNV_0017); withis_revision_check:"NO"both reach team selection. LIVE - Online Co-op 1 vs 1: the menu opens; matchmaking needs the server to echo each player's own SYNC_PROGRESS notice back, then START_COOP_MATCHING arrives; the session needs GET_GAMERELAY
game_sycom "P2P"(with "" it fails with MXNV_0010). It then stopped (START notice to nobody, MXNV_0013): co-op never hands its peer list to the P2P layer, which Quick Match and the lobby do. Fixed in mod 0.5.0, which hooks the two co-op functions to add that step and to keep the peers' addresses, and the server'spescoop.py: with both, an Online Co-op Casual Match connects and kicks off (one human per side, the other four players CPU). The server must give each side a real team (use_team_id); "no team" on both sides crashes the match load. 2v2/3v3 with more humans can't run: the game's P2P layer takes one peer (coop2.md). LIVE - Dialogs photographed: ERR_DIFFERENT_PATCHVERSION ("Your version of PES 2021 is out of date…"), ERR_PARAMCHECK_FAILED ("Invalid player data found." then CCWR_0014), ERR_MODE_BLOCKED, ERR_LOBBYUSERMAX ("Cannot participate due to full quota."), GET_BLOCKLIST ERR_DATABASE, ERR_ROOMCREATELIMIT, the courtesy-rating "B" warning (GET_MANNER_WARN A_TO_B) SET_GAMEMEMBER ERR_DATABASE (C_DYUN_0013; it came from a crash in our test handler, which the gate answers with ERR_DATABASE) and LOGIN ERR_INVALID_ACCOUNT (the account-suspended text; the game then stays offline). Exact texts in
livetests.md. LIVE
Third round (2026-11-06 evening)
- Spectating works: a lobby match was recorded through our server and replayed on one copy from storage, through the PES League lobby, with server replies only (details). LIVE
- Live Update team data is applied: a Team.bin edit (FC Barcelona "BAR" → "BRX") showed on the scoreboard, and the PlayerAssignment edit moved
entry_check_sumto exactly the pesdb.py prediction; a Speed edit of 11 players gave the predictedparam_check_sum. LIVE - Different player data, check off: the match stayed in sync past minute 15 (identical minimaps on both copies); no SYNC_FAILED. LIVE
- "Server full" login (LOGIN →
ERR_FREE_TO_PLAY_FULL): "Due to excessive traffic on the PES 2021 server, login is currently restricted. Please try reconnecting again later." LIVE
Online Divisions, Team Play Lobby, room counters (2026-11-06 evening)
- DONE Online Divisions is in the server (
pesdivisions.py): ten divisions, ten-match seasons, win 3 / draw 1, promotion and relegation at season end, its own matchmaking queue; a full division match was played live and both games showed the rating change and the new result on the Divisions chart. - Online Divisions is Quick Match plus a division screen. The season is just a count of matches left (
other_match_num, 10 per season); with today's bareGET_DIVISION_INFOit is 0, so every visit runs the season-end screens and then hangs. With adivision_infoblob (division, thresholds, matches left, amatch_history_listwhosedivision_pointvalues add up to the points) the Divisions screen shows the badge, the chart and each result; the search then sendsSTART_MATCHING {matching_type "OC_RANK"}and reached "View Opponent" on both copies. A spec for a 10-division server is inmodes2.md. LIVE - Team Play Lobby: two humans can start a room, but this lobby only connects through Konami's own game relay ("SC"), which we don't have; the direct path used by the Friendly Match Lobby is switched off for it in the game (
lobby2.md). STATIC - Room counters ("N Match(es)", Wins) only count the end-of-match verdict push; the server now sends it at the final whistle of every lobby match. Room chat: the game prints only lines it receives, so our echo to the sender shows once. STATIC
- Events / Matchday: events have no menu of their own (they come from myClub and co-op); Matchday's group stage looks possible with one fake event (
modes2.md). STATIC
Full details: notes/re/functions/livetests.md.
What the player sees: error texts and server replies
How a text is found STATIC
- Message id =
(group number << 16) | entry id, where the group number is the u32 at +4 of each group header in the.strstring tables (lookup 0x141497dd0 → 0x1414996f0). Example: 0x0398002f = "Press Any Button". "Failed to connect with opponent." is 0x045b0010, shown by the lobby room screen (0x1410438a0). - Server error replies: every command shows an error dialog automatically (on by default, flag at +0x74; about 40 commands switch it off). The text comes from the game's table at 0x1428a1170 (command, ERR code, message id):
- message id 0xffffffff: no dialog; the screen that sent the command decides (109 rows);
- message id 0 or 0x01fb00d2: the generic "An unexpected problem has occurred while communicating with the server." plus
CODE:= a hash of the command name + "_" + the ERR number, e.g.ZVMY_0079(163 rows); - any other id: that specific text, with no code (492 rows).
- On-screen codes from the error reporter:
TAG_%04dwhen the site has a sub-code, otherwiseTAG+ line, optionally followed by an extra value (GNCX_0003_0x20000000). Most codes players see are therefore in the sub-code form (MXNV_0013,CCWR_0014); the error table shows both forms.
Replies that give players a clear message STATIC
| Use | Reply | Text the player sees |
|---|---|---|
| Ban | CMD_LOGIN → ERR_INVALID_ACCOUNT | "…we have suspended your account in line with our policy on violations…" |
| Server full | CMD_LOGIN → ERR_FREE_TO_PLAY_FULL | "Due to excessive traffic on the server, login is currently restricted. Please try reconnecting again later." |
| Maintenance | CMD_LOGIN → ERR_SERVERNOTREADY | "The online service is currently unavailable. The server may be undergoing maintenance…" (includes Konami's website address) |
| Wrong game version | JOIN_ONLINE_MODE → ERR_DIFFERENT_PATCHVERSION | "Your version of the game is out of date. Please update to the latest version and reconnect." |
| Wrong Live Update | JOIN_ONLINE_MODE → ERR_DIFFERENT_LIVEDATA_VERSION | "Unable to log in while using outdated Live Update data." |
| Missing data pack | JOIN_ONLINE_MODE → ERR_DIFFDCVERSION | "Data Pack Incompatible. Please reboot and update the software." |
| Mode closed | JOIN_ONLINE_MODE → ERR_MODE_BLOCKED | "<mode> is currently unavailable online…" (login error dialog, CCWR_0003) |
| Feature closed | START_MATCHING → ERR_COMMAND_BLOCKED | "This feature is currently unavailable. Please refer to Online Information for further details." |
| Edited player data | CHECK_CHEAT → ERR_PARAMCHECK_FAILED | "Invalid player data found." (then the login error "Unable to load content data…", CCWR_0014) |
| Room full / in a match / wrong password | JOIN_ROOM_NTL → ERR_ROOMISFULL / ERR_ROOMSTATNOTMATCH / ERR_PASSWDINCORRECT | "Cannot participate due to full quota." / "Could not enter because a match is currently being played." / "Incorrect password." |
- Version replies: the three
JOIN_ONLINE_MODE → ERR_DIFFERENT_*rows show their text from the command layer, but the login flow then also aborts with the generic login error (line 216 of OnlineLoginTaskConnectMenu2.cpp). For a clean refusal useERR_MODE_BLOCKED(sweep.md). STATIC - Avoid: CMD_LOGIN's live-data error row, which points to a Condition Rating help text; and
ERR_JOINKICKEDROOM, which only gives the generic text plus a code. - Live-update errors (0x1420ac100): 1 "Unable to login.", 2/6 "Communication error", 3 "The downloaded file is broken.", 4/5 "Install failed.", 7 "No new Live Update available.", 8 "Data Pack Incompatible…".
{rf}/{re}in texts are macros the game fills in (probably the game title) INFERRED. The full table, with every command and ERR code and its text, isnotes/re/functions/data/server_errors.tsv.
Error codes: every place the online code reports one
EYRH763 or GNCX_0003_… points to one line of the game's source code. This table lists all 186 places in the online code that report an error, so a code a player sees can be looked up here.- The reporter is
0x1411546b0(mgr, function-name, source path, line, sub-code). The four letters are a hash of the .cpp file name (notes/re/errcode.py). STATIC - The code players see is letters + "_" + 4-digit sub-code when the site has one (most do), otherwise letters + line. Two formats share those letters: letters + line (
EYRH763= OnlineModeTaskQuickMatching.cpp line 763), and letters + "_" + 4-digit sub-code (GNCX_0003_0x20000000= OnlineModeMultiplay.cpp sub-code 3, reported at line 505; the hex tail is an extra error value). STATIC LIVE - Codes reported through other paths and seen in our logs:
EYRH763Quick Match search timed out;EYRH1530Quick Match abnormal end GAMERELAY / DEGRADE_SC;QVHE1459GameModeMatchListenerMatch.cpp, loading took longer thanload_timeout(LOAD_TIMEOUT);VIXT2253MatchOnline.cpp, no input for about a minute (NO_OPERATION, the AFK rule);OLXH152error on the CHECK_ALIVE_PLAYER watcher;FAMY242the server replied ERR_CHEAT to an in-match command;LZFP101SEND_ALIVE. LIVE STATIC - Meanings come from the message string the code stores next to the report, or from the area sections above. Rows without a meaning have no nearby text.
| Code (line form) | Code (sub-code form) | Source file | Line | Meaning |
|---|---|---|---|---|
— | | CommandObjectCmdSendAlive.cpp | ||
LZFP106 | LZFP_0001 | CommandObjectCmdSendAlive.cpp | 106 | SEND_ALIVE reported a degraded or lost link |
SGJC392 | | LiveDataSetFlow.cpp | 392 | Live update: data pack version too old |
SGJC474 | SGJC_0003 | LiveDataSetFlow.cpp | 474 | |
SGJC573 | | LiveDataSetFlow.cpp | 573 | |
SGJC729 | SGJC_0006 | LiveDataSetFlow.cpp | 729 | |
SGJC809 | SGJC_0007 | LiveDataSetFlow.cpp | 809 | |
SGJC880 | SGJC_0008 | LiveDataSetFlow.cpp | 880 | |
SGJC963 | SGJC_0010 | LiveDataSetFlow.cpp | 963 | |
SGJC1006 | SGJC_0012 | LiveDataSetFlow.cpp | 1006 | Live update: downloaded file has the wrong hash |
SGJC1102 | SGJC_0014 | LiveDataSetFlow.cpp | 1102 | |
NNAB121 | | MenuOnlineObserverTaskSync.cpp | 121 | |
NNAB162 | NNAB_0001 | MenuOnlineObserverTaskSync.cpp | 162 | |
NNAB178 | NNAB_0002 | MenuOnlineObserverTaskSync.cpp | 178 | |
NNAB187 | NNAB_0003 | MenuOnlineObserverTaskSync.cpp | 187 | |
NNAB283 | NNAB_0006 | MenuOnlineObserverTaskSync.cpp | 283 | |
MMGC118 | MMGC_0002 | MultiplayCmdTeamDataSync.cpp | 118 | MMGC_0002: team data sync between the players failed (seen with team id 262143 = no team) |
MMGC139 | MMGC_0003 | MultiplayCmdTeamDataSync.cpp | 139 | |
HAJT147 | HAJT_0001 | OnlineLoginMenuEulaChangeLog.cpp | 147 | |
HAJT192 | HAJT_0007 | OnlineLoginMenuEulaChangeLog.cpp | 192 | |
HAJT234 | HAJT_0011 | OnlineLoginMenuEulaChangeLog.cpp | 234 | |
BUMR166 | BUMR_0001 | OnlineLoginMenuSelectEulaNation.cpp | 166 | |
BUMR207 | BUMR_0002 | OnlineLoginMenuSelectEulaNation.cpp | 207 | |
BUMR226 | BUMR_0003 | OnlineLoginMenuSelectEulaNation.cpp | 226 | |
BUMR234 | BUMR_0004 | OnlineLoginMenuSelectEulaNation.cpp | 234 | |
BUMR247 | BUMR_0005 | OnlineLoginMenuSelectEulaNation.cpp | 247 | |
BUMR260 | BUMR_0006 | OnlineLoginMenuSelectEulaNation.cpp | 260 | |
BUMR518 | BUMR_0007 | OnlineLoginMenuSelectEulaNation.cpp | 518 | |
BUMR539 | BUMR_0008 | OnlineLoginMenuSelectEulaNation.cpp | 539 | |
BUMR590 | BUMR_0009 | OnlineLoginMenuSelectEulaNation.cpp | 590 | |
BUMR608 | BUMR_0010 | OnlineLoginMenuSelectEulaNation.cpp | 608 | |
BUMR616 | BUMR_0011 | OnlineLoginMenuSelectEulaNation.cpp | 616 | |
QIMJ166 | QIMJ_0001 | OnlineLoginTaskConnectAccount.cpp | 166 | |
QIMJ205 | QIMJ_0002 | OnlineLoginTaskConnectAccount.cpp | 205 | |
QIMJ531 | QIMJ_0010 | OnlineLoginTaskConnectAccount.cpp | 531 | Login: CMD_AUTH_STEAM failed |
QIMJ766 | QIMJ_0012 | OnlineLoginTaskConnectAccount.cpp | 766 | |
QIMJ796 | QIMJ_0013 | OnlineLoginTaskConnectAccount.cpp | 796 | |
QIMJ854 | QIMJ_0017 | OnlineLoginTaskConnectAccount.cpp | 854 | Login: CMD_LOGIN (account) failed |
QIMJ905 | QIMJ_0018 | OnlineLoginTaskConnectAccount.cpp | 905 | |
QIMJ953 | QIMJ_0019 | OnlineLoginTaskConnectAccount.cpp | 953 | |
QIMJ1001 | QIMJ_0020 | OnlineLoginTaskConnectAccount.cpp | 1001 | |
QULW194 | QULW_0001 | OnlineLoginTaskConnectAccount2.cpp | 194 | Create player: ERR_NGWORDINPNAME (name rejected by the word filter) |
QULW239 | QULW_0002 | OnlineLoginTaskConnectAccount2.cpp | 239 | |
QULW280 | QULW_0003 | OnlineLoginTaskConnectAccount2.cpp | 280 | |
VMEO150 | VMEO_0001 | OnlineLoginTaskConnectGate.cpp | 150 | |
VMEO239 | VMEO_0002 | OnlineLoginTaskConnectGate.cpp | 239 | |
VMEO277 | VMEO_0003 | OnlineLoginTaskConnectGate.cpp | 277 | |
VMEO308 | VMEO_0005 | OnlineLoginTaskConnectGate.cpp | 308 | |
VMEO338 | VMEO_0007 | OnlineLoginTaskConnectGate.cpp | 338 | |
VMEO346 | VMEO_0008 | OnlineLoginTaskConnectGate.cpp | 346 | |
VMEO372 | VMEO_0009 | OnlineLoginTaskConnectGate.cpp | 372 | Gate: CMD_GET_SVRLIST failed |
VMEO425 | VMEO_0011 | OnlineLoginTaskConnectGate.cpp | 425 | |
VMEO480 | VMEO_0014 | OnlineLoginTaskConnectGate.cpp | 480 | |
VMEO534 | VMEO_0015 | OnlineLoginTaskConnectGate.cpp | 534 | |
VMEO548 | VMEO_0016 | OnlineLoginTaskConnectGate.cpp | 548 | |
VMEO574 | VMEO_0018 | OnlineLoginTaskConnectGate.cpp | 574 | |
VMEO627 | VMEO_0020 | OnlineLoginTaskConnectGate.cpp | 627 | |
PCKS285 | PCKS_0001 | OnlineLoginTaskConnectMenu.cpp | 285 | |
PCKS571 | PCKS_0003 | OnlineLoginTaskConnectMenu.cpp | 571 | |
PCKS609 | PCKS_0005 | OnlineLoginTaskConnectMenu.cpp | 609 | Menu login: CMD_LOGIN (menu) failed |
PCKS660 | PCKS_0006 | OnlineLoginTaskConnectMenu.cpp | 660 | Menu login: CMD_SET_CURRENTPLAYER failed |
PCKS740 | PCKS_0007 | OnlineLoginTaskConnectMenu.cpp | 740 | |
PCKS795 | PCKS_0008 | OnlineLoginTaskConnectMenu.cpp | 795 | |
PCKS855 | PCKS_0009 | OnlineLoginTaskConnectMenu.cpp | 855 | |
— | | OnlineLoginTaskConnectMenu2.cpp | ||
CCWR195 | CCWR_0002 | OnlineLoginTaskConnectMenu2.cpp | 195 | |
CCWR260 | CCWR_0006 | OnlineLoginTaskConnectMenu2.cpp | 260 | |
CCWR332 | CCWR_0010 | OnlineLoginTaskConnectMenu2.cpp | 332 | |
CCWR357 | CCWR_0011 | OnlineLoginTaskConnectMenu2.cpp | 357 | |
CCWR378 | CCWR_0012 | OnlineLoginTaskConnectMenu2.cpp | 378 | |
CCWR434 | CCWR_0013 | OnlineLoginTaskConnectMenu2.cpp | 434 | |
CCWR510 | CCWR_0017 | OnlineLoginTaskConnectMenu2.cpp | 510 | |
— | | OnlineLoginTaskStart.cpp | ||
FDDN624 | FDDN_0020 | OnlineLoginTaskStart.cpp | 624 | |
GNCX385 | GNCX_0001 | OnlineModeMultiplay.cpp | 385 | |
GNCX474 | | OnlineModeMultiplay.cpp | 474 | |
GNCX505 | GNCX_0003 | OnlineModeMultiplay.cpp | 505 | GNCX_0003: the peer link closed (DISCONN_P2P); normal for the second player leaving after a match |
GNCX548 | GNCX_0004 | OnlineModeMultiplay.cpp | 548 | |
GNCX552 | GNCX_0005 | OnlineModeMultiplay.cpp | 552 | |
GNCX556 | GNCX_0006 | OnlineModeMultiplay.cpp | 556 | DATAPACK error: CHECK_CHEAT sums differ between the players (what the player sees; MXNV_0017 is the same check, reported later) |
GNCX594 | GNCX_0007 | OnlineModeMultiplay.cpp | 594 | |
GNCX653 | GNCX_0008 | OnlineModeMultiplay.cpp | 653 | |
GNCX659 | GNCX_0009 | OnlineModeMultiplay.cpp | 659 | |
GNCX664 | GNCX_0010 | OnlineModeMultiplay.cpp | 664 | |
GNCX947 | GNCX_0011 | OnlineModeMultiplay.cpp | 947 | |
UQZU600 | UQZU_0001 | OnlineModeTaskCoopSession.cpp | 600 | |
UQZU638 | UQZU_0003 | OnlineModeTaskCoopSession.cpp | 638 | |
UQZU685 | UQZU_0004 | OnlineModeTaskCoopSession.cpp | 685 | |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
FAMY242 | FAMY_0001 | OnlineModeTaskGameQueueProcessor.cpp | 242 | The server replied ERR_CHEAT to an in-match command → CHEAT abnormal end |
DNRF284 | DNRF_0001 | OnlineModeTaskLobbyRoomMain.cpp | 284 | |
DNRF376 | DNRF_0002 | OnlineModeTaskLobbyRoomMain.cpp | 376 | |
DNRF513 | DNRF_0003 | OnlineModeTaskLobbyRoomMain.cpp | 513 | |
DNRF571 | DNRF_0004 | OnlineModeTaskLobbyRoomMain.cpp | 571 | Room: SET_ROOM_OPTION returned an error |
XLMR596 | XLMR_0001 | OnlineModeTaskMOMLobbyRoomMain.cpp | 596 | |
MXNV134 | MXNV_0001 | OnlineModeTaskMatchSession.cpp | 134 | Match session: online system missing (internal) |
MXNV139 | MXNV_0002 | OnlineModeTaskMatchSession.cpp | 139 | Lost the connection to the game server during match setup ("DISCONNECT PES SERVER") |
MXNV155 | | OnlineModeTaskMatchSession.cpp | 155 | Could not create GET_MATCHID |
MXNV170 | MXNV_0004 | OnlineModeTaskMatchSession.cpp | 170 | GET_MATCHID returned an error |
MXNV195 | MXNV_0023 | OnlineModeTaskMatchSession.cpp | 195 | SEND_SYNC_NOTICE could not be sent |
MXNV206 | MXNV_0024 | OnlineModeTaskMatchSession.cpp | 206 | SEND_SYNC_NOTICE returned an error |
MXNV231 | MXNV_0025 | OnlineModeTaskMatchSession.cpp | 231 | Sync barrier: online system gone |
MXNV248 | MXNV_0005 | OnlineModeTaskMatchSession.cpp | 248 | Could not create START_SEND_GAME_SEQUENCE_DATA (only with upload YES) |
MXNV264 | MXNV_0006 | OnlineModeTaskMatchSession.cpp | 264 | START_SEND_GAME_SEQUENCE_DATA returned an error |
MXNV277 | MXNV_0007 | OnlineModeTaskMatchSession.cpp | 277 | Could not create GET_SERVER_ENV |
MXNV295 | MXNV_0008 | OnlineModeTaskMatchSession.cpp | 295 | GET_SERVER_ENV returned an error |
MXNV374 | MXNV_0009 | OnlineModeTaskMatchSession.cpp | 374 | Error SetConfig(): building the P2P/TURN configuration failed |
MXNV431 | MXNV_0010 | OnlineModeTaskMatchSession.cpp | 431 | Error CreateMultiplaySession (e.g. no usable TURN list entry) |
MXNV444 | MXNV_0011 | OnlineModeTaskMatchSession.cpp | 444 | Multiplay session daemon missing |
MXNV452 | | OnlineModeTaskMatchSession.cpp | 452 | Multiplay session backend missing |
MXNV476 | MXNV_0013 | OnlineModeTaskMatchSession.cpp | 476 | MXNV_0013: the P2P session never reached "connected" (seen in failed connection tests) |
MXNV495 | | OnlineModeTaskMatchSession.cpp | 495 | Error InitOnlineModeMultiplay() |
MXNV522 | MXNV_0015 | OnlineModeTaskMatchSession.cpp | 522 | P2P revision check timed out (60 s) |
MXNV527 | MXNV_0016 | OnlineModeTaskMatchSession.cpp | 527 | P2P revision error (different game data revision) |
MXNV533 | MXNV_0017 | OnlineModeTaskMatchSession.cpp | 533 | DATAPACK error (data packs differ between the players) |
MXNV537 | MXNV_0018 | OnlineModeTaskMatchSession.cpp | 537 | Other user disconnected during the revision check |
MXNV542 | MXNV_0019 | OnlineModeTaskMatchSession.cpp | 542 | Unknown revision-check result |
MXNV823 | MXNV_0020 | OnlineModeTaskMatchSession.cpp | 823 | Match session finish: online system missing |
— | | OnlineModeTaskPesLgWatching.cpp | ||
EYRH1163 | EYRH_0002 | OnlineModeTaskQuickMatching.cpp | 1163 | |
EYRH1175 | EYRH_0003 | OnlineModeTaskQuickMatching.cpp | 1175 | Quick Match: waiting for the P2P connection failed (ActSubConnectWait), shown as "Failed to connect with opponent" |
EYRH1197 | EYRH_0004 | OnlineModeTaskQuickMatching.cpp | 1197 | |
EYRH1212 | EYRH_0005 | OnlineModeTaskQuickMatching.cpp | 1212 | |
EYRH1224 | EYRH_0006 | OnlineModeTaskQuickMatching.cpp | 1224 | |
EYRH1246 | EYRH_0007 | OnlineModeTaskQuickMatching.cpp | 1246 | |
EYRH1290 | EYRH_0008 | OnlineModeTaskQuickMatching.cpp | 1290 | |
SLHQ92 | SLHQ_0001 | OnlineModeTaskSyncManager.cpp | 92 | |
SLHQ160 | SLHQ_0004 | OnlineModeTaskSyncManager.cpp | 160 | |
XWSF131 | XWSF_0002 | OnlineModeTaskSyncSelectSideInMulti.cpp | 131 | |
XWSF744 | XWSF_0005 | OnlineModeTaskSyncSelectSideInMulti.cpp | 744 | |
HEED104 | HEED_0001 | OnlineModeTaskSyncTeamData.cpp | 104 | |
OLXH136 | OLXH_0001 | OnlineModeTaskWatchGame.cpp | 136 | |
OLXH144 | OLXH_0002 | OnlineModeTaskWatchGame.cpp | 144 | Error on the WATCH_GAMEADDPOINT watcher |
OLXH171 | OLXH_0004 | OnlineModeTaskWatchGame.cpp | 171 | Verdict push arrived but the match context isn't in an accepted state |
OLXH186 | OLXH_0005 | OnlineModeTaskWatchGame.cpp | 186 | Verdict push WATCH_GAMEADDPOINT with gameend_reason other than NORMAL_END/INJURY (or missing) |
VNBP833 | VNBP_0001 | OnlineSystemClient.cpp | 833 | |
VNBP864 | VNBP_0002 | OnlineSystemClient.cpp | 864 | |
— | | OnlineSystemClientReconnect.cpp | ||
APLR497 | APLR_0002 | OnlineSystemClientReconnect.cpp | 497 | Reconnect after a gate drop failed |
UMQK322 | UMQK_0001 | OnlineSystemClientUpperlinkWatcher.cpp | 322 | |
REJK373 | | OnlineSystemMultiplay.cpp | 373 | |
REJK379 | | OnlineSystemMultiplay.cpp | 379 | |
REJK392 | REJK_0003 | OnlineSystemMultiplay.cpp | 392 | |
REJK438 | REJK_0006 | OnlineSystemMultiplay.cpp | 438 | |
REJK448 | REJK_0007 | OnlineSystemMultiplay.cpp | 448 | |
REJK454 | REJK_0008 | OnlineSystemMultiplay.cpp | 454 | |
REJK459 | REJK_0009 | OnlineSystemMultiplay.cpp | 459 | |
LISV365 | | OnlineSystemMultiplaySessionStrategyP2pFullMeshTurnOnly.cpp | 365 | |
GQBD643 | | OnlineSystemMultiplaySessionStrategyP2pFullMeshWithTurn.cpp | 643 | |
PWTV340 | | OnlineSystemObserveSession.cpp | 340 | |
PWTV343 | PWTV_0001 | OnlineSystemObserveSession.cpp | 343 | |
DZWO402 | DZWO_0006 | OnlineSystemUtilHttpStreamWatchingData.cpp | 402 | |
DZWO832 | DZWO_0007 | OnlineSystemUtilHttpStreamWatchingData.cpp | 832 | |
WUYK111 | WUYK_0001 | ProcessOnlineInformationGetEura.cpp | 111 | |
IQKF574 | IQKF_0020 | ProcessOnlineLobbyBasePostJoinRoom.cpp | 574 | |
IYGW278 | | ProcessOnlineLobbyConnectMatchSession.cpp | 278 | |
IYGW292 | IYGW_0003 | ProcessOnlineLobbyConnectMatchSession.cpp | 292 | |
IYGW304 | IYGW_0003 | ProcessOnlineLobbyConnectMatchSession.cpp | 304 | |
IYGW347 | IYGW_0001 | ProcessOnlineLobbyConnectMatchSession.cpp | 347 | |
— | | ProcessOnlineLobbyFreePostCreateJoinRoom.cpp | ||
VZLN130 | VZLN_0002 | ProcessOnlineLobbyFreePostCreateJoinRoom.cpp | 130 | Free lobby (owner): own pid missing from the room player list |
UQOW107 | UQOW_0001 | ProcessOnlineLobbyFreePostJoinRoom.cpp | 107 | Free lobby: no room player list received within 10 s of JOIN_ROOM_NTL (the reply to the joiner's own request counts) |
UQOW159 | UQOW_0006 | ProcessOnlineLobbyFreePostJoinRoom.cpp | 159 | Free lobby: own entry missing from the room player list |
UQOW323 | UQOW_0009 | ProcessOnlineLobbyFreePostJoinRoom.cpp | 323 | |
UQOW328 | UQOW_0010 | ProcessOnlineLobbyFreePostJoinRoom.cpp | 328 | |
HCOC139 | HCOC_0001 | ProcessOnlineLobbyMultiPostCreateJoinRoom.cpp | 139 | |
QBFF113 | QBFF_0001 | ProcessOnlineLobbyMultiPostJoinRoom.cpp | 113 | |
QBFF311 | QBFF_0003 | ProcessOnlineLobbyMultiPostJoinRoom.cpp | 311 | |
QBFF316 | QBFF_0004 | ProcessOnlineLobbyMultiPostJoinRoom.cpp | 316 | |
ENLM173 | ENLM_0001 | ProcessOnlineQuickTeamSync.cpp | 173 | |
— | | ProcessOnlineRsLottery.cpp | ||
BOKS277 | BOKS_0008 | ProcessOnlineRsLottery.cpp | 277 |
Catalogue of all 433 server commands
Request fields come from each command's request builder (HTTP form or gate MessagePack), with the common msgid, rqid, svrtype, client, urltype left out. Reply fields come from the reply parser, with nested objects' fields flattened into the same list (see the encoding rules for blobs vs inline maps). STATIC
| Command | Area | Via | Status | Request fields | Reply fields | Notes |
|---|---|---|---|---|---|---|
ACCEPT_CLAN_ENTRY | Clans | gate | unseen | pid, target_pid | ||
ACCEPT_CLAN_INVITE | Lobby & rooms | gate | unseen | pid, target_pid | ||
ADD_FOUL | News & info | gate | OK only ×112 | card_pid, card_side, card_gameplayer_id_info, gameplayer_unique_id, gameplayer_id, card_kind, injury_pid, injury_side, injury_gameplayer_id, injury_data, part, symptom, level, mcount_left, injury_all, injury_one, gtimer | cards + injuries → | |
ADD_MYCLUB_AUCTION_WATCH_LIST | myClub | gate | unseen | pid, product_id | ||
ADD_MYCLUB_AUCTION_WISH_LIST | myClub | gate | unseen | pid, agent, wishlist_id, skill, skill_category, skill_id, grade, is_exhibited | ||
ADD_MYCLUB_SUBSCRIPTION_GAMEPLAYER | myClub | gate | unseen | |||
ADD_SCORE | News & info | gate | OK only ×8 | goal_side, goal_gameplayer_id_info, gameplayer_unique_id, gameplayer_id, goal_player_side, goal_player_pid, assist_side, assist_gameplayer_id_info, assist_player_side, assist_player_pid, gtimer | goals (there is no ADD_GOAL); dedupe by gtimer → | |
ADD_SELECTING_PLAYER_NUM | News & info | gate | unseen | |||
AUTH_STEAM | Store & platform | HTTP | ours ×114 | ticket, steamid, package_type | ||
BL_DATA_SYNC | In-match sync | gate | unseen | |||
BUY_MYCLUB_MARKET_COACH | myClub | gate | unseen | pid, coach_id, use_pes_point, is_coach_texture_use | adaptability_rate, attacking_area, build_up, coach, coach_id, coach_unique_id, contract_gp, contract_pes_point, contract_term, current_point_division, current_point_sim, current_point_vscom, defence_compact, defence_line, defence_num, defence_type, defensive_main_concept, first_df, formation_data, gp, is_coach_texture_use, is_first, is_use_variable_formation, management, mobility, nation_id, offence_num, offensive_main_concept, overall, passsupport_dist, pes_point, press_rule, sell_gp, team_id, transition | |
CANCEL_CLAN_ENTRY | Clans | gate | unseen | pid, target_pid | ||
CANCEL_CLAN_INVITE | Lobby & rooms | gate | unseen | pid, target_pid | ||
CANCEL_COOP_GROUP_MATCHING | Co-op | gate | unseen | pid | ||
CANCEL_COOP_MATCHING | Co-op | gate | unseen | pid | ||
CANCEL_MATCHDAY_ENTRY_PICKUP_MATCH | Matchday | gate | unseen | pid, compe_id | ||
CANCEL_MATCHING | Matchmaking | gate | ours | pid | ||
CHANGE_GAMEPHASE | Match | gate | OK only ×720 | phase, gtimer | 19 phases; never reply ERR_CHEAT → | |
CHECK_CHEAT | Fair play | gate | OK only ×96 | pid, dlc_version, dlc_type, param_check_sum, entry_check_sum | player-DB checksums; pair only equal sums → | |
CHECK_LOCAL_GAMERELAY_PLAYER | Connectivity / relay | gate | unseen | pid, np_account_id | build_gamerelay_num_for_11vs11, build_gamerelay_num_for_1vs1, build_gamerelay_num_for_3vs3, gamerelay_register_url_data, is_local_gamerelay_player, type, url | |
CHECK_MYCLUB_STORE | myClub | gate | unseen | pid | is_enable_myclub_coin, is_enable_subscription | |
CHECK_STRING | Login & account | gate | unseen | str | bad-word filter → | |
COMPLETE_TEAM_SELECT | In-match sync | gate | unseen | |||
CONFIRM_CLAN_REQUEST | Clans | gate | unseen | pid, request_list, type, status, is_new, appliciant_user_id, pname, name, xuid_one, psn_user_id, account_id, online_id, is_valid_cache, is_deleted, is_follow, date, applicant_clan_name | ||
COPY_MYCLUB_SQUAD | myClub | gate | unseen | pid, copy_squad_id, name | squad_id | |
CREATE_CLAN | Clans | gate | unseen | pid, clan_name | ||
CREATEJOIN_COOP_ROOM | Co-op | gate | unseen | pid, basic_settings, room_id, room_name, clan_name, clan_owner_info, pname, name, xuid_one, psn_user_id, account_id, online_id, is_valid_cache, is_deleted, is_follow, is_com_match, is_use_chat, is_same_level, team_level, coop_level, is_same_manner, coop_manner, room_entry_restriction, password, lang, match_settings, user_team_id, enemy_team_id, cpu_level, kind | room_id | |
CREATEJOIN_ROOM | Lobby & rooms | gate | unseen | name, match_type, lang, max_players, is_invite_limit, password, enable_guest, vs_com, use_original_player, is_anyplayers, is_select_gk, auto_start_num, game_rating_limit | room_id | create 1v1 room → |
CREATE_MYCLUB_SQUAD | myClub | gate | unseen | pid, coach_unique_id, name | squad_id | |
CREATE_MYCLUB_STAFF | myClub | gate | unseen | pid, player_info_list, gameplayer_unique_id, gameplayer_base_id, gameplayer_id, gameplayer_level, registared_position, position, stronger_foot, overall, ability, play_style, nation_id, club_team_id, is_use_cloud_match | ability, base_exp, base_player_info, club_team_id, gameplayer_base_id, gameplayer_id, gameplayer_level, gameplayer_unique_id, id, nation_id, overall, play_style, position, registared_position, staff_info_list, stronger_foot | |
CREATE_MYCLUB_TEAM | myClub | gate | unseen | pid, team_name, team_name_short, base_team_id, coach_id, rental_gameplayer_id, is_check_team_name, is_check_team_name_short, is_coach_texture_use, team_name_commentary_id, home_town, nation_id, label, name | ||
CREATE_PLAYER | Login & account | gate | ours ×10 | name | ||
DELETE_MYCLUB_AUCTION_WATCH_LIST | myClub | gate | unseen | pid, product_id, is_all | ||
DELETE_MYCLUB_AUCTION_WISH_LIST | myClub | gate | unseen | pid, agent, wishlist_id, skill, skill_category, skill_id, grade, is_exhibited | ||
DELETE_MYCLUB_SQUAD | myClub | gate | unseen | pid, squad_id | ||
DEMOCHAT | Social | gate | unseen | |||
DISCONNECT | Login & account | gate | ours ×182 | logoutstat | ||
END_STEAM_STORE | Store & platform | HTTP | unseen | ticket, steamid, package_type, orderid, itemid, pid | ||
END_STORE_TRANSACTION | Store & platform | gate | unseen | pid, product_id, transaction_id | subscription_active, subscription_expire_date | |
ENTRY_CLAN | Clans | gate | unseen | pid, target_pid | ||
ENTRY_GAME | Match | gate | unseen | entry, side | entryflag, gameNum | Entry/Cancel toggle → |
ENTRY_MYCLUB_WEEKLY_RANKING | myClub | gate | unseen | pid, is_entry | ||
ERR | In-match sync | gate | unseen | |||
EXCHANGE_E_FOOTBALL_POINT | Store & platform | HTTP | unseen | pid, product_id | e_football_point_num | |
EXPEL_CLAN_MEMBER | Clans | gate | unseen | pid, target_pid | ||
EXTEND_MYCLUB_COACH | myClub | gate | unseen | pid, coach_unique_id, use_pes_point | contract_term, gp, pes_point | |
EXTEND_MYCLUB_GAMEPLAYER | myClub | gate | unseen | pid, gameplayer_unique_id_list, use_pes_point | contract_term, contract_term_list, gameplayer_id, gameplayer_unique_id, gp, pes_point | |
EXTEND_MYCLUB_ITEM_GAMEPLAYER | myClub | gate | unseen | pid, gameplayer_unique_id | contract_term, extend_ticket, gameplayer_id, gameplayer_unique_id | |
FINISH_SEASON | Events & competitions | gate | unseen | pid | division season end → | |
FOLLOW_USER | Social | gate | unseen | pid, follow_user_id_list, pname, name, xuid_one, psn_user_id, account_id, online_id, is_valid_cache, is_deleted, unfollow_user_id_list | ||
GET_AGING_REVISION | Login & account | gate | unseen | |||
GET_AVATAR_HTTP | Login & account | HTTP | OK only ×205 | pid | avatar_data, avatar_data_size, avatar_md5 | avatar: base64 + MD5, ≤48 KiB → |
GET_BLOCKLIST | Social | gate | unseen | bklist, block_id, count, max_player_num, name, player_num | lobby sub-areas; must implement for rooms → | |
GET_CHALLENGECODE | Login & account | gate | ours ×76 | challenge_code | ||
GET_CLAN_INFO | Clans | gate | unseen | pid, owner_id, pname, name, xuid_one, psn_user_id, account_id, online_id, is_valid_cache, is_deleted | account_id, basic_settings, clan_comment, clan_info, clan_member_num, clan_members, clan_name, clan_stats_myclub, clan_stats_online, coop_level, current_division, current_online_mode, current_rating, draw_count, enable_request, goal, is_banned, is_deleted, is_follow, is_join_online_mode, is_valid_cache, last_login, lose_count, lost_goal, match_count, name, online_id, owner_info, pid, pname, psn_user_id, residual_div_first_count, season_match_stats, season_win_count, total_match_stats, user_id, win_count, win_s, win_s_max, xuid_one | |
GET_CLAN_LIST | Clans | gate | unseen | pid, search_options, clan_name, enable_request, is_joined_clan, start_index | account_id, all_list_num, basic_settings, clan_comment, clan_list, clan_list_num, clan_member_num, clan_members, clan_name, clan_stats_myclub, clan_stats_online, coop_level, current_division, current_online_mode, current_rating, draw_count, enable_request, goal, is_banned, is_deleted, is_follow, is_join_online_mode, is_valid_cache, last_login, lose_count, lost_goal, match_count, name, online_id, owner_info, pid, pname, psn_user_id, residual_div_first_count, season_match_stats, season_win_count, start_index, total_match_stats, user_id, win_count, win_s, win_s_max, xuid_one | |
GET_CLAN_MEMBER_MODE | Clans | gate | unseen | pid | account_id, clan_member_num, clan_members, coop_level, current_online_mode, is_deleted, is_follow, is_join_online_mode, is_valid_cache, last_login, name, online_id, pid, pname, psn_user_id, user_id, xuid_one | |
GET_CLAN_PENDING_LIST | Clans | gate | unseen | pid | account_id, applicant_clan_name, appliciant_user_id, date, is_deleted, is_follow, is_new, is_valid_cache, name, online_id, pending_info_list, pending_info_list_num, pid, pname, psn_user_id, status, type, xuid_one | |
GET_CLAN_RANKING | Clans | HTTP | unseen | pid, is_old_season, view_num, division, start_index, is_myclub | account_id, basic_settings, clan_comment, clan_name, clan_ranking, clan_ranking_all_list_num, clan_ranking_num, coop_level, current_online_mode, date, division_change_type, draw_count, enable_request, goal, is_banned, is_deleted, is_follow, is_join_online_mode, is_valid_cache, last_login, lose_count, lost_goal, match_count, match_stats, name, online_id, owner_info, pid, pname, psn_user_id, rank, rating, user_id, win_count, win_s, win_s_max, xuid_one | |
GET_CLAN_REQUEST_LIST | Clans | gate | unseen | pid | account_id, applicant_clan_name, appliciant_user_id, date, is_deleted, is_follow, is_new, is_valid_cache, name, online_id, pid, pname, psn_user_id, request_info_list, request_info_list_num, status, type, xuid_one | |
GET_CLAN_SETTINGS | Clans | gate | unseen | pid | account_id, clan_basic_settings, clan_comment, clan_name, coop_level, current_online_mode, enable_request, is_banned, is_deleted, is_follow, is_join_online_mode, is_valid_cache, last_login, name, online_id, owner_info, pid, pname, psn_user_id, user_id, xuid_one | |
GET_CLAN_SIMPLE_INFO_LIST | Clans | gate | unseen | pid, owner_pid_list | account_id, clan_name, clan_simple_info_list, clan_simple_info_list_num, coop_level, current_online_mode, is_deleted, is_follow, is_join_online_mode, is_valid_cache, last_login, name, online_id, owner_info, pid, pname, psn_user_id, user_id, xuid_one | |
GET_COMPEV_INFO | Events & competitions | gate | unseen | pid, compe_mode, compe_id | ad_file_name, add_limit_match_num_max, add_limit_match_num_min, add_limit_rating_max, add_limit_rating_min, add_limit_vscom_win_rate, banner_file_info, body, clear_match_num, clear_win_point, cleared_count, compe_cpu_level, compe_data, compe_end_time, compe_id, compe_info, compe_kind, compe_name, compe_reward, compe_start_time, contract_term, count, difficulty, entity_id, entry_coach_id, entry_national_id, entry_player_num, entry_team_id, entry_teamspirit_max, entry_teamspirit_min, entry_teamstrength_max, entry_teamstrength_min, entry_type, event_compe_reward_list, filename, grade, hash_str, is_cleared, is_compe_reward_exist, is_coop_match, is_efootball_pro_stadium, is_exist_unlocked_compe_by_cleared, is_limited_matching_target, is_locked, is_pesleague_stadium, is_same_team_power_level, is_squad_bonus, is_squad_bonus_reward_exist, item, item_effect_arg, item_type, item_variation, list_banner_file_info, logo_file_name, name, name_jp, pes_point_price, player_level, player_num, precondition_compe_id, precondition_compe_name, present_id, present_type, receipt_deadline, reward, skill, skill_category, skill_id, squad_bonus, squad_bonus_rate, team_id, title, type, usable_ball_id | |
GET_COMPEV_LIST | Events & competitions | gate | unseen | pid, compe_list_kind, compe_mode | add_limit_match_num_max, add_limit_match_num_min, add_limit_rating_max, add_limit_rating_min, add_limit_vscom_win_rate, banner_file_info, compe_cpu_level, compe_end_time, compe_id, compe_kind, compe_list, compe_list_kind, compe_name, compe_num, compe_start_time, difficulty, entry_coach_id, entry_national_id, entry_player_num, entry_team_id, entry_teamspirit_max, entry_teamspirit_min, entry_teamstrength_max, entry_teamstrength_min, entry_type, filename, hash_str, is_cleared, is_coop_match, is_locked, is_squad_bonus, list_banner_file_info, player_num | |
GET_COMPEV_MAINMENU_INFO | Events & competitions | gate | unseen | pid, compe_mode, compe_id, target_pid | clear_count, compe_result, cpu_level, progress_game_count, status, vscom_team_id, win_point | |
GET_COMPEV_MYENTRY_COMPEID | Events & competitions | gate | unseen | pid, compe_mode | compe_cpu_level, compe_id, compe_mode, progress_game_count | |
GET_COMPLG_MYENTRY_COMPEID | PES League | gate | unseen | |||
GET_COOP_LEVEL_RESULT | Co-op | gate | unseen | pid, match_id | account_id, after_level, after_point, before_level, before_point, coop_level_user_list, evalution, is_clan_owner, is_deleted, is_follow, is_valid_cache, name, online_id, pid, pname, point, psn_user_id, reference, status, user_id, xuid_one | |
GET_COOP_MAINMENU_INFO | Co-op | gate | unseen | pid, online_mode, is_check_season_end | division, division_change_type, is_coop_banned, is_exist_new_pending, is_exist_new_request, is_exist_owner_clan, is_season_end, pre_season_rank, pre_season_rank_all_clan_num | |
GET_COOP_MATCH_DATA | Co-op | gate | unseen | pid | match_data, match_data_size | |
GET_COOP_PROFILE | Co-op | gate | unseen | pid | account_id, coop_level, coop_level_point, coop_manner, coop_profile_data, follower, is_deleted, is_follow, is_valid_cache, match_data, match_data_size, name, online_id, online_match, pid, pname, psn_user_id, user_info, vscom_match, xuid_one | |
GET_COOP_QUICKMATCHOPTION | Co-op | gate | unseen | pid | cpu_level_max, cpu_level_min, force_alone, is_vscom | |
GET_COOP_REJECT_LIST | Co-op | gate | unseen | pid | account_id, is_deleted, is_valid_cache, name, online_id, pid, pname, psn_user_id, reject_list, reject_list_num, xuid_one | |
GET_COOP_ROOMLIST | Co-op | gate | unseen | pid, search_options, room_id, use_password, vs_setting, team_level, coop_level, coop_manner, cpu_level_min, cpu_level_max, can_entry, kind, compe_id, start_index | account_id, all_room_num, basic_settings, clan_name, clan_owner_info, compe_id, coop_level, coop_manner, cpu_level, enemy_team_id, is_com_match, is_deleted, is_follow, is_game, is_same_level, is_same_manner, is_use_chat, is_valid_cache, kind, lang, match_settings, name, online_id, password, pid, pname, psn_user_id, room_entry_restriction, room_id, room_list, room_list_num, room_name, team_level, user_num, user_team_id, xuid_one | |
GET_COOP_ROOM_MEMBER | Co-op | gate | unseen | pid, room_id | account_id, coop_level, guest_info, is_clan_member, is_deleted, is_follow, is_guest, is_owner, is_platform_guest, is_ready, is_valid_cache, list_data, list_num, name, online_id, pid, player_index, pname, psn_user_id, user_info, xuid_one | |
GET_COOP_ROOM_OPTION | Co-op | gate | unseen | pid, room_id | account_id, basic_settings, clan_name, clan_owner_info, coop_level, coop_manner, countdown_end_time, cpu_level, enemy_team_id, is_com_match, is_deleted, is_follow, is_game, is_same_level, is_same_manner, is_start_count_down, is_start_matching, is_stop_countdown, is_use_chat, is_valid_cache, lang, match_settings, name, online_id, password, pid, pname, psn_user_id, room_entry_restriction, room_id, room_name, room_phase, team_level, user_team_id, xuid_one | |
GET_COOP_ROOM_PLATFORM_SESSION | Co-op | gate | unseen | |||
GET_DIVISION_INFO | Divisions & rankings | gate | unseen | pid, is_season_end | account_id, away_score, demotion_point, division, division_info, division_point, doublerank_promotion_point, draw_count, enemy_cpu_level, enemy_name, enemy_side, enemy_team_id, home_score, is_deleted, is_finished_match, is_valid_cache, lose_count, match_history_list, match_record, name, online_id, other_match_num, pname, promotion_point, psn_user_id, rating, win_count, win_lose, win_s_max, xuid_one | division + server-set thresholds → |
GET_DIVISION_POINT_INFO | Divisions & rankings | gate | unseen | pid | division_list, division_type, point, rank, server_num | division records screen → |
GET_DIVISION_RANKING | Divisions & rankings | HTTP | unseen | start_index, view_num, division | account_id, date, division, draw_count, favoritePlayer, favoriteTeam, intro, is_deleted, is_valid_cache, lose_count, manner, match_record, name, online_id, pid, pname, point, psn_user_id, rank, rank_list, rating, total_rank_num, user, win_count, win_s_max, xuid_one | HTTP ranking, inline maps → |
GET_DIVISION_RANKING_BYID | Divisions & rankings | HTTP | unseen | pid, xuid_one, np_account_id, view_num, division | account_id, date, division, draw_count, favoritePlayer, favoriteTeam, intro, is_deleted, is_valid_cache, lose_count, manner, match_record, name, online_id, pid, pname, point, psn_user_id, rank, rank_list, rating, total_rank_num, user, win_count, win_s_max, xuid_one | |
GET_DLC_FILELIST | Login & account | HTTP | ours ×144 | file_type, region, pid | dlc_version, dlcfile_list, dlcfile_list_count, extra_file_list, extra_file_list_count, hash, name, required_program_version, size, url, variation_file_list, variation_file_list_count | |
GET_DMM_NOTIFICATION | Store & platform | gate | OK only ×96 | pid, lang, region, package_type | body, club_team_id, date, default_overall, default_rarity, evoked_text, filename, gameplayer_id, gameplayer_list, gameplayer_list_num, hash_str, header_text, id, info_list, info_list_num, is_watch, link, link_url, movie_url, nation_id, position, service_id, storelinkinfo, thumbnail_info, title, type | top-menu Notifications feed (not Japan-only) → |
GET_DMM_PLAYERINFO | Store & platform | gate | OK only ×96 | pid | is_present_inbox | |
GET_E_FOOTBALL_POINT | Store & platform | HTTP | unseen | pid | e_football_point_num | |
GET_EFP_MOST_RECENTLY_EXPIRED_POINTS | Connectivity / relay | HTTP | unseen | pid, is_warning | expired_point_list, expired_point_list_num, is_show_dialog, point, time | |
GET_ENTRY_GAME | Match | gate | unseen | pid | entryNum, entry_count, entrygame, gameNum, pid | |
GET_EULA_NATION_CODE | Connectivity / relay | gate | ours ×2 | area_code, nation_code | ||
GET_EULA_NATION_LIST | Connectivity / relay | gate | ours ×74 | lang | has_area, name, nation_code, nation_list, nation_list_num, privacy_kind | |
GET_EVENT_CATEGORY_LIST | Events & competitions | gate | unseen | pid | banner_file_info, compe_db_id, event_category, event_category_list, filename, hash_str, is_auto_make_compe_name, is_use_emblem, matchday_emblem_info, matchday_group_type, not_cleared_event_num, open_event_num, recent_event_start_time, team_list_group_a, team_list_group_b | |
GET_FOLLOW_LIST | Social | gate | unseen | pid | account_id, follow_list, follow_list_num, is_clan_member, is_deleted, is_locked, is_valid_cache, name, online_id, pid, pname, psn_user_id, user_id, xuid_one | |
GET_GAMERELAY | Connectivity / relay | HTTP | ours ×75 | pid | game_sycom, gamerelay_index, grid, ip_addr, port | game_sycom P2P|SC; ip/port used only for SC → |
GET_GAMERELAY_QUALITYCHECKLIST | Connectivity / relay | HTTP | unseen | pid | gamerelay_index, grid, ip_addr, last_update, port, quality, quality_check_data_list, quality_check_data_num, quality_list, quality_list_num, quality_threshold_1, quality_threshold_2 | SC relay quality; bare OK → |
GET_GAMERESULTS | Match | gate | unseen | pid, game_res_type, pesleague_compe_id | account_id, cpu_level, date, ex_type, gameend_reason, is_com, is_deleted, is_follow, is_guest, is_valid_cache, match_category, name, no_match, online_id, pid, pk_flag, player, pname, psn_user_id, rlist, rlist_num, score, score_1st, score_2nd, score_ex1st, score_ex2nd, score_pk, side, team, xuid_one | match history list → |
GET_GAME_SCORE | Match | gate | unseen | pid | score, score_1st, score_2nd, score_ex1st, score_ex2nd, score_pk, team | |
GET_GAME_TEAM_LIST | Match | gate | ours ×114 | pid | division_point, team_class, team_id, team_list, team_list_num | |
GET_GLOBALINFOTITLELIST | News & info | gate | OK only ×156 | lang, region, package_type, kind | annnounce_info_list_num, announce_id, announce_info_list, announce_type, compe_db_id, date, event_id, evoked_text, filename, hash_str, is_auto_make_compe_name, is_use_emblem, list_banner_file_info, matchday_emblem_info, matchday_group_type, popup_type, priority, team_list_group_a, team_list_group_b, title, weekly_info_type | news list → |
GET_GP_ACHIEVEMENT | Store & platform | gate | OK only ×236 | pid | all_achievement_bit_array, all_gp, pes_point | |
GET_HEROSTATS | Match | gate | unseen | pid | division_match_num, division_win_num, is_current_match_lose, is_current_match_win, myclub_division_match_num, myclub_division_sim_match_num, myclub_division_sim_win_num, myclub_division_win_num, total_goal_num, total_lose_num, total_lostgoal_num, total_match_num, total_win_num | |
GET_INFOBODY | News & info | gate | unseen | pid, announce_id, is_private, lang, region | announce_basic_info, announce_id, announce_info, announce_type, banner_file_info, body, compe_db_id, compe_name, compe_start_time, date, direct_move, event_id, evoked_text, filename, hash_str, is_auto_make_compe_name, is_use_emblem, link_url, list_banner_file_info, matchday_emblem_info, matchday_group_type, popup_type, priority, team_list_group_a, team_list_group_b, template_id, title, use_template, weekly_info_type | news item body → |
GET_IPANDPORT_NTL | Connectivity / relay | gate | ours | pid | address_family, host_addr, ntl_nat_type, pid, reflexive_addr, relayed_addr, sa_data | |
GET_IS_JOIN_COOP_ROOM | Co-op | gate | unseen | pid | is_join_coop_room | |
GET_IS_KONAMIID_COOPERATION | Co-op | HTTP | unseen | steam_id, xuid, xuid_one, account_id, platform, region | is_cooperation, is_reagree, reagree_url | |
GET_KONAMIID_FUNCTIONAL_BLOCKADE | Social | HTTP | unseen | is_blocked | ||
GET_KONAMIID_LINK_URL | Store & platform | HTTP | unseen | steam_id, xuid, xuid_one, account_id, platform, region | link_url, qr_expiration_date | |
GET_LOBBYINFO | Lobby & rooms | gate | unseen | lobby_id | has_info, sentence_info, sentence_intro, title | |
GET_LOBBYLIST | Lobby & rooms | gate | ours | lobby_type, lang | gamerelay_index, lobby_id, lobby_list, lobby_list_num, name, player_num, player_num_max | |
GET_MAINTENANCE_INFO | News & info | gate | OK only ×144 | maintenance_time, maintenance_warn | maintenance-soon dialog → | |
GET_MANNER_WARN | Fair play | gate | OK only ×180 | pid | warn_kind | fair-play rating warning dialog → |
GET_MATCH_ANALYZE | Match | gate | unseen | pid, target_pid, analyze_data_type | analyze_data_list, analyze_data_size, attack_area_left, attack_area_middle, attack_area_right, attack_time, concept_arrange_defence_first, concept_arrange_defence_second, concept_arrange_offence_first, concept_arrange_offence_second, cross_count, cross_success_count, deffence_time, dribble_distance, favorite_play_defence_first, favorite_play_defence_second, favorite_play_defence_third, favorite_play_offence_first, favorite_play_offence_second, favorite_play_offence_third, foul_count, game_res, inframe_shoot_count, intercept_area, match_up_distance, offside_count, pass_count, pass_cut_count, pass_distance, pass_success_count, posession, score_cross_count, score_dribble_count, score_loss_cross_count, score_loss_dribble_count, score_loss_other, score_loss_pass_count, score_loss_set_play_count, score_loss_through_pass_count, score_other, score_pass_count, score_set_play_count, score_through_pass_count, shoot_count, suffer_inframe_shoot_count, suffer_shoot_count, tackle_count, tackle_success_count | |
GET_MATCH_ANALYZE_ENV | Match | gate | OK only ×128 | pid | deffence, favorite_play, favorite_play_rate, match_up, passtype, posession | |
GET_MATCHDAY_ACHIEVEMENT_REWARD | Matchday | gate | unseen | pid, compe_id | achievement_reward_list, add_matchday_point, body, contract_term, count, entity_id, gameplay_quality, grade, is_repeat, item, item_effect_arg, item_type, item_variation, name, name_jp, pes_point_price, player_level, present_id, present_type, receipt_deadline, require_point, reward_list, skill, skill_category, skill_id, squad_rating, team_id, title, type | |
GET_MATCHDAY_FINAL_RESULT_INFO | Matchday | gate | unseen | pid, compe_id | final_result_info, gameend_reason, is_exist_watch_match_data, score_group_a, score_group_b, score_pk_group_a, score_pk_group_b | |
GET_MATCHDAY_INFO | Matchday | gate | unseen | pid, compe_id | achievement_reward_list, all_reward_info, ball_id, banner_file_info, base_id, body, compe_db_id, compe_id, compe_info, compe_name, contract_term, count, end_date, end_group_match_date, entity_id, entry_limit_date, entry_pickup_match_start_date, entry_user_max, entry_user_num, eula_url, filename, fixed_season, fixed_timezone, fixed_weather, grade, group_desc, group_info_a, group_info_b, group_match_time, group_name, group_type, hash_str, info_overview, is_check_eula, is_disp_compe_name, is_efootball_pro_stadium, is_end, is_entry, is_entry_restricted, is_equalization, is_fix_condition, is_pesleague_stadium, is_possible_watch, is_repeat, is_use_emblem, is_use_emblem_list, item, item_effect_arg, item_type, item_variation, joined_matchday_group, list_banner_file_info, match_type, name, name_jp, pes_point_price, pickup_cut_off_rank, pickup_match_time, pickup_member_date, pickup_select, player_level, pre_pickup_users_pid_list, present_id, present_type, rating_rank, receipt_deadline, require_point, required_point_final_reward, reward_list, skill, skill_category, skill_id, squad_type, start_date, start_match_limit_date, team_id, team_list, team_list_num, title, type, use_stadium_id, watch_match_reward_state, watch_match_start_date, watch_wait_time, win_reward_list | |
GET_MATCHDAY_LIST | Matchday | gate | unseen | pid, is_myclub, start_index | add_limit_rating, banner_file_info, base_id, compe_db_id, compe_id, compe_list, compe_name, end_date, end_group_match_date, entry_limit_date, entry_user_max, entry_user_num, filename, group_desc, group_info_a, group_info_b, group_name, group_type, hash_str, is_disp_compe_name, is_end, is_entry, is_entry_restricted, is_no_check, is_possible_watch, is_use_emblem, is_use_emblem_list, list_banner_file_info, list_max, list_num, match_type, pickup_member_date, pre_pickup_users_pid_list, rating_rank, squad_type, start_date, team_list, team_list_num, watch_match_reward_state | |
GET_MATCHDAY_MAINMENU_INFO | Matchday | gate | unseen | pid, compe_id | account_id, body, contract_term, count, entity_id, final_reward_list, grade, group_match_info, group_result, is_deleted, is_failed_pickup_users, is_final_reward, is_get_final_reward, is_hide_graph, is_valid_cache, is_watch_match, item, item_effect_arg, item_type, item_variation, mainmenu_info, matchday_point, matchday_progress, matchday_rank, matchday_ranking_user_num, matchday_ratio, name, name_jp, online_id, pes_point_price, pickup_match_score_group_a, pickup_match_score_group_b, pickup_reward_list, pickup_reward_type, pickup_user_group_a_num, pickup_user_group_b_num, pickup_user_info, pickup_users_group_a, pickup_users_group_b, pid, player_level, pname, present_id, present_type, psn_user_id, receipt_deadline, skill, skill_category, skill_id, team_id, title, total_matchday_point_group_a, total_matchday_point_group_b, type, xuid_one | |
GET_MATCHDAY_RANKING | Matchday | gate | unseen | pid, compe_id, start_index, view_num | account_id, entry_name, is_deleted, is_valid_cache, list_max, list_num, matchday_point, name, online_id, pid, pname, psn_user_id, rank, rank_list, recode_date, team_id, update_date, xuid_one | |
GET_MATCHDAY_RANKING_BYID | Matchday | gate | unseen | pid, compe_id, view_num | account_id, entry_name, is_deleted, is_valid_cache, list_max, list_num, matchday_point, name, online_id, pid, pname, psn_user_id, rank, rank_list, recode_date, team_id, update_date, xuid_one | |
GET_MATCHDAY_SP_ALL_COOP_MEMBER_LIST | Co-op | gate | unseen | pid, coop_player_list | coop_memberlist, coop_memberlist_num, gameplayer_id, nation_id, parameters, pid, team_id | |
GET_MATCHDAY_SP_CONFIRM_COOP_SQUAD | myClub | gate | unseen | pid | base_team_id, elected_myplayer_id_list, elected_myplayer_id_list_num, elected_myplayerlist, elected_myplayerlist_num, gameplan_data, gameplan_data_size, gameplayer_id, my_team, nation_id, parameters, pid, team_id | |
GET_MATCHDAY_SP_GAMEPLAN | Matchday | gate | unseen | pid, compe_id | gameplan_data, gameplan_data_size, sp_member_list | |
GET_MATCHDAY_WATCH_MATCH_REWARD | Matchday | gate | unseen | pid, compe_id | body, contract_term, count, entity_id, grade, is_exist_watch_match_reward, item, item_effect_arg, item_type, item_variation, name, name_jp, pes_point_price, player_level, present_id, present_type, receipt_deadline, skill, skill_category, skill_id, team_id, title, type, watch_match_reward_list | |
GET_MATCHID | Match | gate | ours ×98 | match_id, upload | match id; keep upload NO → | |
GET_MATCHREJECTLIST | Match | gate | unseen | pid | account_id, is_deleted, is_valid_cache, name, online_id, pid, pname, psn_user_id, reject_list, reject_list_num, xuid_one | |
GET_MYCLUB_ACHIEVEMENTLIST | myClub | gate | unseen | pid | achievement_category, achievement_list, achievement_list_num, body, contract_term, count, entity_id, grade, is_new, item, item_effect_arg, item_type, item_variation, milestone_list, milestone_list_num, name, name_jp, pes_point_price, player_level, present, present_id, present_type, receipt_deadline, received_all, received_milestone_level, skill, skill_category, skill_id, target_value, team_id, title, type, value | |
GET_MYCLUB_AGENT_BOX_INFO | myClub | gate | unseen | pid, agent_id | agent, agent_end_time, agent_id, agent_info, agent_token_end_time, banner_file_info, bgm_id, box_pack_num, box_size, count, filename, get_player_num, gp, hash_str, is_buy_gp_pes_point, is_draw_checked, is_use_reset, level, limit_count, main_player_rarity_info, name, name_jp, pes_point, rarity, reset_remain_count, skill, skill_category, skill_id, sub1_player_rarity_info, sub2_player_rarity_info, target_level, token_list, token_list_num, type, uniform, use_count | |
GET_MYCLUB_AGENT_DRAW_RATE | myClub | gate | unseen | pid, agent_id | main, rate_player_num, rate_table, sub1, sub2 | |
GET_MYCLUB_ALL_COOP_MEMBER_LIST | myClub | gate | unseen | pid, coop_player_list | coop_memberlist, coop_memberlist_num, gameplayer_id, gameplayer_unique_id, matchday_select_team_id, nation_id, parameters, pid, team_id | |
GET_MYCLUB_AUCTION_PRICE_RANKING | myClub | gate | unseen | pid, ranking_kind | auction_price_ranking, auction_price_ranking_num, end_time, grade, price, product_id, rank, scout_id, skill, skill_category, skill_id | |
GET_MYCLUB_AUCTION_REPORT_LIST | myClub | gate | unseen | pid | auction_report_list, auction_state, bid_num, finalround_end_time, grade, is_bid, is_bid_user_max, is_highest_bider, is_register_watchlist, price_now, product_id, scout_id, skill, skill_category, skill_id, time_limit, total_auction_report_list_num, update_time | |
GET_MYCLUB_AUCTION_SCOUT_DETAIL | myClub | gate | unseen | pid, product_id | auction_end_time, auction_scout_detail, auction_start_time, auction_state, bid_num, finalround_end_time, grade, is_bid, is_bid_user_max, is_highest_bidder, is_reservation, my_price, price_now, price_start, product_id, reservation_price, scout_id, second_price, skill, skill_category, skill_id, third_price | |
GET_MYCLUB_AUCTION_SCOUT_TENDER_USERINFOLIST | myClub | gate | unseen | pid, product_id | account_id, auction_tender_userlist, auction_tender_userlist_num, is_deleted, is_valid_cache, name, online_id, pid, pname, psn_user_id, xuid_one | |
GET_MYCLUB_AUCTION_SUCCESSFUL_BID_INFO | myClub | gate | unseen | pid, scout_id, grade, skill, skill_category, skill_id | auction_successful_bid_list, auction_successful_bid_list_num, average_bid_price, best_bid_amount_day, best_bid_amount_price | |
GET_MYCLUB_AUCTION_WATCH_LIST | myClub | gate | unseen | pid, is_auction_state_changed | auction_info_list, auction_state, bid_num, finalround_end_time, grade, is_bid, is_bid_user_max, is_highest_bider, is_register_watchlist, price_now, product_id, scout_id, skill, skill_category, skill_id, time_limit, total_auction_info_list_num, update_time | |
GET_MYCLUB_AUCTION_WISH_LIST | myClub | gate | unseen | pid, start_index | grade, is_exhibited, skill, skill_category, skill_id, total_wish_info_list_num, wish_info_list, wishlist_id | |
GET_MYCLUB_CLOUDMATCH_BONUS | myClub | gate | unseen | pid | account_id, body, cloud_bonus, contract_term, count, cpu_level, date, draw_num, entity_id, ex_type, gameend_reason, grade, is_com, is_deleted, is_follow, is_guest, is_valid_cache, item, item_effect_arg, item_type, item_variation, lose_num, match_category, match_list, match_list_num, match_num, name, name_jp, no_match, online_id, pes_point_price, pid, pk_flag, player, player_level, pname, present_id, present_type, psn_user_id, receipt_deadline, score, score_1st, score_2nd, score_ex1st, score_ex2nd, score_pk, side, skill, skill_category, skill_id, team, team_id, title, type, win_num, xuid_one | |
GET_MYCLUB_CLOUD_SQUADID | myClub | gate | unseen | pid | squad_id | |
GET_MYCLUB_COACH_CONTRACT_NORMA | myClub | gate | unseen | pid, coach_unique_id | current_point_division, current_point_sim, current_point_vscom, is_contract_end, norma_point_division, norma_point_sim, norma_point_vscom | |
GET_MYCLUB_COACHLIST | myClub | gate | unseen | pid | adaptability_rate, attacking_area, build_up, coach_id, coach_list, coach_list_num, coach_unique_id, contract_gp, contract_pes_point, contract_term, current_point_division, current_point_sim, current_point_vscom, defence_compact, defence_line, defence_num, defence_type, defensive_main_concept, first_df, formation_data, is_coach_texture_use, is_use_variable_formation, management, mobility, nation_id, offence_num, offensive_main_concept, overall, passsupport_dist, press_rule, sell_gp, team_id, transition | |
GET_MYCLUB_COM_MATCH_INFO | myClub | gate | unseen | pid | contWinMax_num, contWin_num, current_weekly_point, division, draw_num, goal, lose_num, lostGoal, match_num, match_stats, max_weekly_point, rating, win_num | |
GET_MYCLUB_COMMENTARY_INFO | myClub | gate | unseen | pid, match_category, team_spirit, team_power_level | coach_extended, coach_match_num, cont_win_max, cont_win_num, demotion, division, division_num, division_stats, draw_num, gameplayer_extended_list, gameplayer_id, gameplayer_unique_id, get_player_result, is_coach_norma_clear, lose_num, num, promotion, team_power_level_prematch, team_spirit_prematch, total_match_num, win_num | |
GET_MYCLUB_CONFIRM_COOP_SQUAD | myClub | gate | unseen | pid | base_team_id, club_edition_type, coach_id_list, coach_unique_id_list, default_rarity, elected_myplayerlist, elected_myplayerlist_num, gameplan_data, gameplan_data_size, gameplayer_id, gameplayer_unique_id, is_club_edition, is_entry_compe, matchday_condition_list, member_list, member_num, my_team, name, parameters, player_level, squad_id, team_data, team_name, team_name_commentary_id, team_name_short, uniform_number | |
GET_MYCLUB_DEFAULT_COACHLIST | myClub | gate | unseen | pid | adaptability_rate, attacking_area, build_up, coach_id, default_coach_list, default_coach_list_num, defence_compact, defence_line, defence_num, defence_type, defensive_main_concept, first_df, formation_data, gp, is_locked, is_use_variable_formation, management, mobility, offence_num, offensive_main_concept, overall, passsupport_dist, pes_point, press_rule, transition | |
GET_MYCLUB_DEFAULT_RENTAL_GAMEPLAYERLIST | myClub | gate | unseen | pid | add_skill_id, assist, attacking_area_center, attacking_area_side, build_up_long, build_up_short, close_date, concept, contract_gp, contract_pes_point, contract_term, default_overall, default_rarity, defence_type_forecheck, defence_type_retreat, enhanced_parameters, exp_current_level, exp_to_next_level, exp_total, first_df_aggressive, first_df_safety, gameplayer, gameplayer_cost, gameplayer_id, gameplayer_unique_id, games, goal, gp, is_protected, is_rental, is_subscription, level, level_info, level_limit, mcountLeft, mobility_fix, mobility_float, nation_id, open_date, parameters, pes_point, player_level_need_exp, press_rule_net_defence, press_rule_seal_off, rating, redcard_game_kind, redcard_info_list, rental_gameplayer_list, rental_gameplayer_list_num, sell_gp, team_id, tiredness, transition_counter, transition_possession, uniform_number | |
GET_MYCLUB_EFP_EXCHANGE_STORELIST | myClub | gate | unseen | pid | body, contract_term, count, entity_id, item, item_effect_arg, item_type, item_variation, limit_count, name, name_jp, pes_point_price, player_level, player_level_limit, present_type, price, product_id, receipt_deadline, store_list, store_list_num, team_id, title, use_count | |
GET_MYCLUB_FEATURE_PLAYER_LIST | myClub | gate | unseen | pid | gameplayer_list, gameplayer_list_num, hold_gameplayer_list, hold_gameplayer_list_num | |
GET_MYCLUB_GAME_BONUS | myClub | gate | unseen | pid | agent_id, base_gp, body, bonus_kind, bonus_rate, contract_term, count, entity_id, gain_gp, game_res, gp, gp_bonus_elected_myplayer_num, gp_bonus_list, gp_bonus_list_num, grade, is_first_win, item, item_effect_arg, item_type, item_variation, match_num, name, name_jp, new_cpu_level, old_cpu_level, pes_point_price, player_level, present_id, present_type, rate, rate_player_num, rate_table, receipt_deadline, scout, sell_gp, skill, skill_category, skill_id, special_match_bonus_list, squad_bonus_item_list, target_level, team_id, title, type | |
GET_MYCLUB_GAMEPLAYER_EXPERIENCE | myClub | gate | unseen | pid | add_skill_id, enhanced_parameters, exp_current_level, exp_info_postmatch, exp_info_prematch, exp_list, exp_list_num, exp_match, exp_to_next_level, exp_total, gameplayer_unique_id, level, level_limit, parameters | |
GET_MYCLUB_GAMEPLAYERLIST | myClub | gate | unseen | pid | add_skill_id, assist, attacking_area_center, attacking_area_side, build_up_long, build_up_short, concept, contract_gp, contract_pes_point, contract_term, default_overall, default_rarity, defence_type_forecheck, defence_type_retreat, enhanced_parameters, exp_current_level, exp_to_next_level, exp_total, first_df_aggressive, first_df_safety, gameplayer_cost, gameplayer_id, gameplayer_list, gameplayer_list_max, gameplayer_list_num, gameplayer_unique_id, games, goal, is_protected, is_rental, is_subscription, level, level_info, level_limit, main_edition_gameplayer_list, main_edition_gameplayer_list_num, mcountLeft, mobility_fix, mobility_float, nation_id, parameters, player_level_need_exp, press_rule_net_defence, press_rule_seal_off, rating, redcard_game_kind, redcard_info_list, sell_gp, team_id, tiredness, transition_counter, transition_possession, uniform_number | |
GET_MYCLUB_GAMEPLAYER_NEED_EXPERIENCELIST | myClub | gate | unseen | |||
GET_MYCLUB_HISTORYLIST | myClub | gate | unseen | pid, start_index | count, data_type, date, entity_id, history_data_in, history_data_kind, history_data_out, index, item_data, item_effect_arg, item_type, item_variation, myclub_history_list, myclub_history_list_num, myclub_history_list_total, name, pes_point_price | |
GET_MYCLUB_INCREASED_COINLIST | myClub | gate | unseen | pid, start_index | expiration_date, gain_date, increased_coin_list_total, increased_pes_point_list, increased_pes_point_list_num, index, no_use_pes_point, pes_point, pes_point_buy, pes_point_free, pes_point_type, use_expiration_date | |
GET_MYCLUB_IS_FIRST_AGENT_MULTIPLE | myClub | gate | unseen | pid | is_first | |
GET_MYCLUB_IS_FIRST_MEMBERLIST | myClub | gate | unseen | pid | is_first | |
GET_MYCLUB_IS_MARKET_COACH_AVAILABLE | myClub | gate | unseen | pid, coach_id | is_get | |
GET_MYCLUB_ITEMLIST | myClub | gate | unseen | pid | count, item_effect_arg, item_list, item_list_num, item_type, item_variation, pes_point_price | |
GET_MYCLUB_LEGEND_GAMEPLAYERLIST | myClub | gate | unseen | pid | add_skill_id, assist, attacking_area_center, attacking_area_side, build_up_long, build_up_short, concept, contract_gp, contract_pes_point, contract_term, default_overall, default_rarity, defence_type_forecheck, defence_type_retreat, enhanced_parameters, exp_current_level, exp_to_next_level, exp_total, first_df_aggressive, first_df_safety, gameplayer_cost, gameplayer_id, gameplayer_list, gameplayer_list_num, gameplayer_unique_id, games, goal, is_protected, is_rental, is_subscription, level, level_info, level_limit, mcountLeft, mobility_fix, mobility_float, nation_id, parameters, player_level_need_exp, press_rule_net_defence, press_rule_seal_off, rating, redcard_game_kind, redcard_info_list, sell_gp, team_id, tiredness, transition_counter, transition_possession, uniform_number | |
GET_MYCLUB_LOGIN_BONUS | myClub | gate | unseen | pid | body, contract_term, count, entity_id, grade, is_bonus, item, item_effect_arg, item_type, item_variation, login_bonus_list, login_bonus_list_num, name, name_jp, pes_point_price, player_level, present_id, present_type, receipt_deadline, skill, skill_category, skill_id, team_id, title, today_bonus_number, type | |
GET_MYCLUB_MAINMENU_INFO | myClub | gate | unseen | pid | achievement_info, achievement_not_recieved_num, achievement_num, achievement_total_num, agent_panel_file_info, com_countWin_num, com_match_num, compe_db_id, cpu_level, filename, game_result, game_result_wdl, hash_str, is_auction_state_changed, is_auto_make_compe_name, is_coop_enable, is_free_enable, is_use_emblem, liveevent_panel_file_info, matchday_emblem_info, matchday_group_type, oppo_level, present_num, rank, rank_coach, rank_coach_total_num, rank_total_num, scount_num, staff_num, team_id, team_list_group_a, team_list_group_b, weekly_group_rank, weekly_group_rank_total_num | |
GET_MYCLUB_MAIN_SQUAD | myClub | gate | unseen | pid, target_pid | adaptability_rate, add_skill_id, assist, attacking_area, attacking_area_center, attacking_area_side, base_team_id, build_up, build_up_long, build_up_short, club_edition_type, coach_id, coach_id_list, coach_list, coach_list_num, coach_unique_id, coach_unique_id_list, concept, contract_gp, contract_pes_point, contract_term, current_point_division, current_point_sim, current_point_vscom, default_overall, default_rarity, defence_compact, defence_line, defence_num, defence_type, defence_type_forecheck, defence_type_retreat, defensive_main_concept, enhanced_parameters, exp_current_level, exp_to_next_level, exp_total, first_df, first_df_aggressive, first_df_safety, formation_data, gameplan_data, gameplan_data_size, gameplayer_cost, gameplayer_id, gameplayer_list, gameplayer_list_num, gameplayer_unique_id, games, goal, is_club_edition, is_coach_texture_use, is_entry_compe, is_protected, is_rental, is_subscription, is_use_variable_formation, level, level_info, level_limit, management, mcountLeft, member_list, member_num, mobility, mobility_fix, mobility_float, name, nation_id, offence_num, offensive_main_concept, overall, parameters, passsupport_dist, player_level, player_level_need_exp, press_rule, press_rule_net_defence, press_rule_seal_off, rating, redcard_game_kind, redcard_info_list, sell_gp, squad, squad_id, team_id, team_name, tiredness, transition, transition_counter, transition_possession, uniform_number | |
GET_MYCLUB_MARKET_AGENTLIST | myClub | gate | unseen | pid | agent, agent_end_time, agent_id, agent_token_end_time, banner_file_info, bgm_id, count, end_time, filename, get_player_num, gp, hash_str, is_buy_gp_pes_point, is_draw_checked, level, limit_count, market_agent_list, market_agent_list_num, market_subscription, name, name_jp, pes_point, skill, skill_category, skill_id, target_level, token_list, token_list_num, type, uniform, use_count | |
GET_MYCLUB_MARKET_COACHLIST | myClub | gate | unseen | pid | adaptability_rate, attacking_area, build_up, coach_id, defence_compact, defence_line, defence_num, defence_type, defensive_main_concept, end_time, first_df, formation_data, gp, is_locked, is_use_variable_formation, management, market_coach_list, market_coach_list_num, mobility, now_time, offence_num, offensive_main_concept, overall, passsupport_dist, pes_point, press_rule, transition | |
GET_MYCLUB_PLAYER_NUMBER_FIXATION | myClub | gate | unseen | pid | number, player_id, player_number_list, player_number_list_num | |
GET_MYCLUB_PRESENTLIST | myClub | gate | unseen | pid | body, contract_term, count, entity_id, grade, item, item_effect_arg, item_type, item_variation, name, name_jp, pes_point_price, player_level, present_id, present_list, present_list_num, present_type, receipt_deadline, skill, skill_category, skill_id, team_id, title, type | |
GET_MYCLUB_PROCURABLE_GAMEPLAYERLIST | myClub | gate | unseen | pid, is_top_agent, agent_id, is_subscription | gameplayer_id, gameplayer_list, gameplayer_list_num, is_draw, level_limit, team_id | |
GET_MYCLUB_PROCURABLE_GAMEPLAYERLIST_RARITY | myClub | gate | unseen | pid, rarity | gameplayer_id, gameplayer_list, gameplayer_list_num, is_draw, level_limit, team_id | |
GET_MYCLUB_PROCURABLE_GAMEPLAYERLIST_SCOUT | myClub | gate | unseen | pid, scout_list, agent_id, skill, skill_category, skill_id, grade, count, rate, rate_table, rate_player_num, target_level, sell_gp, scout_list_num | gameplayer_id, gameplayer_list, gameplayer_list_num, is_draw, level_limit, rate, rate_player_num, rate_table, team_id | |
GET_MYCLUB_PROCURABLE_SCOUTLIST_GAMEPLAYER | myClub | gate | unseen | pid, gameplayer | agent_id, count, grade, rate, rate_player_num, rate_table, scout_list, scout_list_num, sell_gp, skill, skill_category, skill_id, target_level | |
GET_MYCLUB_RANKING | myClub | HTTP | unseen | start_index, sort, order, view_num, is_coach | account_id, date, division, draw_count, favoritePlayer, favoriteTeam, intro, is_deleted, is_valid_cache, lose_count, manner, match_record, name, online_id, pid, pname, psn_user_id, rank, rank_list, rating, team_id, team_name, total_rank_num, user, win_count, win_s_max, xuid_one | |
GET_MYCLUB_RANKING_BYID | myClub | HTTP | unseen | pid, xuid_one, np_account_id, sort, order, view_num, is_coach | account_id, date, division, draw_count, favoritePlayer, favoriteTeam, intro, is_deleted, is_valid_cache, lose_count, manner, match_record, name, online_id, pid, pname, psn_user_id, rank, rank_list, rating, team_id, team_name, total_rank_num, user, win_count, win_s_max, xuid_one | |
GET_MYCLUB_REFINE_SEARCH_AUCTION_LIST | myClub | gate | unseen | pid, refine_search_auction, grade_list, is_settings_rarity, price_min, price_max, is_settings_price, time_limit_min, time_limit_max, is_settings_time_limit, bid_min, bid_max, is_settings_tender, skill_list, skill_category, skill_id, skill_list_num, is_settings_agent_skill, start_index, is_auction_state_changed | auction_info_list, auction_state, bid_num, finalround_end_time, grade, is_bid, is_bid_user_max, is_highest_bider, is_register_watchlist, price_now, product_id, scout_id, skill, skill_category, skill_id, time_limit, total_auction_info_list_num, update_time | |
GET_MYCLUB_RENTAL_GAMEPLAYERLIST | myClub | gate | unseen | pid | add_skill_id, assist, attacking_area_center, attacking_area_side, build_up_long, build_up_short, close_date, concept, contract_gp, contract_pes_point, contract_term, default_overall, default_rarity, defence_type_forecheck, defence_type_retreat, enhanced_parameters, exp_current_level, exp_to_next_level, exp_total, first_df_aggressive, first_df_safety, gameplayer, gameplayer_cost, gameplayer_id, gameplayer_unique_id, games, goal, gp, is_protected, is_rental, is_subscription, level, level_info, level_limit, mcountLeft, mobility_fix, mobility_float, nation_id, open_date, parameters, pes_point, player_level_need_exp, press_rule_net_defence, press_rule_seal_off, rating, redcard_game_kind, redcard_info_list, rental_gameplayer_list, rental_gameplayer_list_num, sell_gp, team_id, tiredness, transition_counter, transition_possession, uniform_number | |
GET_MYCLUB_SCOUTLIST | myClub | gate | unseen | pid | agent_id, count, grade, rate, rate_player_num, rate_table, scout_list, scout_list_num, sell_gp, skill, skill_category, skill_id, target_level | |
GET_MYCLUB_SERVER_ENV | myClub | gate | unseen | pid, get_club_edition_list | agent_id, count, grade, is_all_club_edition_set, license_out_coach_list, license_out_player_list, market_scout_list, rate, rate_player_num, rate_table, sell_gp, skill, skill_category, skill_id, target_level | |
GET_MYCLUB_SQUAD_BONUS_TARGET_PLAYERLIST | myClub | gate | unseen | pid, compe_id | gameplayer_id, gameplayer_id_list, gameplayer_id_list_num, is_draw, level_limit, need_player_num, team_id | |
GET_MYCLUB_SQUAD_GAMEPLAN | myClub | gate | unseen | pid, squad_id | gameplan_data, gameplan_data_size | |
GET_MYCLUB_SQUADLIST | myClub | gate | unseen | pid | cloud_squad_id, club_edition_type, coach_id_list, coach_unique_id_list, default_rarity, edition_squad_list, edition_squad_list_num, gameplan_data, gameplan_data_size, gameplayer_id, gameplayer_unique_id, is_club_edition, is_entry_compe, main_squad_id, member_list, member_num, name, parameters, player_level, squad_id, squad_list, squad_list_num, uniform_number | |
GET_MYCLUB_STAFF_LIST | myClub | gate | unseen | pid, player_info, gameplayer_unique_id, gameplayer_base_id, gameplayer_id, gameplayer_level, registared_position, position, stronger_foot, overall, ability, play_style, nation_id, club_team_id | ability, base_exp, base_player_info, club_team_id, gameplayer_base_id, gameplayer_id, gameplayer_level, gameplayer_unique_id, id, nation_id, overall, play_style, position, registared_position, staff_list, staff_list_num, stronger_foot | |
GET_MYCLUB_SUBSCRIPTION_MY_GAMEPLAYERLIST | myClub | gate | unseen | |||
GET_MYCLUB_USER_INFO | myClub | gate | unseen | pid | add_uniform_list, base_team_id, gp, home_town, is_iconic_moment_view, label, name, nation_id, norma_point_division, norma_point_sim, norma_point_vscom, pes_point, progress_status, select_add_uniform_id, team_name, team_name_commentary_id, team_name_short, user_base_team_id, user_team_name, user_team_name_commentary_id, user_team_name_short | |
GET_MYCLUB_VSCOM_OPPONENT | myClub | gate | unseen | pid, is_coach_mode, is_team_power_lv | account_id, attacking_area_center, attacking_area_side, base_team_id, build_up_long, build_up_short, club_edition_type, coach_adaptability_rate, coach_id_list, coach_unique_id_list, concept, concept_data, cpu_level, default_rarity, defence_type_forecheck, defence_type_retreat, first_df_aggressive, first_df_safety, gameplan_data, gameplan_data_size, gameplayer_id, gameplayer_unique_id, is_club_edition, is_deleted, is_entry_compe, is_valid_cache, member_list, member_num, mobility_fix, mobility_float, name, online_id, parameters, pes_pname, pid, player_level, press_rule_net_defence, press_rule_seal_off, psn_user_id, side, squad_id, team_data, team_name, team_name_commentary_id, team_name_short, transition_counter, transition_possession, uniform_number, xuid_one | |
GET_MYCLUB_WEEKLYPOINT_RESULT | myClub | gate | unseen | pid, oppo_pid | gain_point_by_skill_rank, gain_point_by_weekly_point, hi_score, hi_score_rank, is_entry_weekly_myclub, is_hi_score, old_hi_score, old_hi_score_rank, old_weekly_point, oppo_skill_rank, weekly_point, weekly_point_info, weekly_point_rate | |
GET_MYCLUB_WEEKLY_RANKING | myClub | HTTP | unseen | group_search_target_pid, start_index, view_num, is_group_ranking, is_old_season | account_id, body, contract_term, count, date, division, entity_id, grade, group_number, is_deleted, is_valid_cache, item, item_effect_arg, item_type, item_variation, max_weekly_point, name, name_jp, online_id, pes_point_price, pid, player_level, pname, present_id, present_type, psn_user_id, rank, rank_list, receipt_deadline, reward, reward_list, skill, skill_category, skill_id, team_id, title, total_rank_num, type, xuid_one | |
GET_MYCLUB_WEEKLY_RANKING_BASIC_INFO | myClub | gate | unseen | pid | basic_info, body, contract_term, count, division, division_change_type, entity_id, eura_url, grade, is_beginner, is_group_rank_1st, is_join, is_no_play_season, is_rejected, is_season_end, item, item_effect_arg, item_type, item_variation, name, name_jp, pes_point_price, player_level, present_id, present_type, receipt_deadline, reward, skill, skill_category, skill_id, team_id, title, type | |
GET_MYCLUB_WEEKLY_RANKING_BYID | myClub | HTTP | unseen | pid, xuid_one, np_account_id, view_num, is_group_ranking, is_old_season | account_id, body, contract_term, count, date, division, entity_id, grade, group_number, is_deleted, is_valid_cache, item, item_effect_arg, item_type, item_variation, max_weekly_point, name, name_jp, online_id, pes_point_price, pid, player_level, pname, present_id, present_type, psn_user_id, rank, rank_list, receipt_deadline, reward, reward_list, skill, skill_category, skill_id, team_id, title, total_rank_num, type, xuid_one | |
GET_OFFMODE_PLAYER_PARAMETERLIST | Login & account | gate | unseen | pid, home_player_list, gameplayer_unique_id, gameplayer_id, away_player_list, is_equalization | away_param_playerlist, gameplayer_id, gameplayer_id_info, gameplayer_unique_id, home_param_playerlist, parameters | |
GET_OFTEN_USED_TEAM_LIST | Match | gate | unseen | pid | last_used_team_id, used_team_id_list, used_team_id_list_num | |
GET_ONLINE_AD_FILE | News & info | gate | OK only ×16 | pid, ad_match_kind, compe_id | ad_banner_file_name, ad_signage_file_name | stadium ad-board file names → |
GET_ONLINE_ID | Store & platform | gate | unseen | |||
GET_ONLINE_ID_CLIENT | Store & platform | gate | unseen | |||
GET_PESLEAGUE_1VS1_MAINMENU_INFO | PES League | gate | unseen | pid, compe_id | compe_end_time, draw_count, lose_count, match_num, matching_first_date, matching_interval, matching_time, point, rank_type, regulation_match_num, team_id, team_name, win_count | |
GET_PESLEAGUE_COMPE_INFO | PES League | gate | unseen | pid, compe_id | account_id, banner_file_info, basic_settings, clan_comment, clan_info, clan_member_num, clan_members, clan_name, clan_stats_myclub, clan_stats_online, compe_data, compe_db_id, compe_id, compe_name, compe_regulation, condition, coop_level, current_division, current_online_mode, current_rating, draw_count, enable_request, end_date, entry_compe, entry_limit_date, entry_limit_division, entry_limit_division_max, entry_limit_division_min, entry_user_limit, entry_user_max, entry_user_num, extra_time, filename, goal, guest, hash_str, is_banned, is_deleted, is_e_sports, is_efootball_pro_stadium, is_exist_overview_info, is_exist_participation_right, is_exist_rewardInfo, is_follow, is_join_online_mode, is_myclub, is_pesleague_stadium, is_valid_cache, last_login, lose_count, lost_goal, match_count, match_end_date, match_time, match_type, name, online_id, owner_info, pid, pk, pname, psn_user_id, ranking_match_num, residual_div_first_count, season_match_stats, season_win_count, start_date, team_id, total_match_stats, trade_num, use_ball_id, user_id, win_count, win_s, win_s_max, xuid_one | |
GET_PESLEAGUE_COMPE_LIST | PES League | gate | unseen | pid, mode, start_index, is_end, is_join_only | banner_file_info, compe_db_id, compe_id, compe_list, compe_name, end_date, entry_limit_date, entry_limit_division, entry_limit_division_max, entry_limit_division_min, entry_user_limit, entry_user_max, entry_user_num, filename, hash_str, is_end, is_entry, is_gm_account, is_myclub, is_no_check, list_banner_file_info, list_max, list_num, match_end_date, match_type, mode, start_date | |
GET_PESLEAGUE_COMPE_OVERVIEW_INFO | PES League | gate | unseen | pid, compe_id | overview_info | |
GET_PESLEAGUE_COMPE_PARTICIPATION_RIGHT | PES League | gate | unseen | pid, compe_id | account_id, banner_file_info, clan_name, clan_owner_name, clan_owner_pid, compe_id, compe_name, end_date, filename, hash_str, is_deleted, is_get, is_valid_cache, name, need_match_num, need_point, online_id, participation_right, player_point, psn_user_id, start_date, xuid_one | |
GET_PESLEAGUE_COMPE_RANKING | PES League | gate | unseen | pid, compe_id, start_index, view_num | account_id, clan_owner_name, continuous_win, diff_score, draw_count, entry_name, get_score, is_deleted, is_get_participation_right, is_mydata, is_valid_cache, list_max, list_num, lose_count, lose_score, match_num, name, online_id, pid, point, psn_user_id, rank, rank_list, rank_type, recode_date, team_id, update_date, win_count, xuid_one | |
GET_PESLEAGUE_COMPE_RANKING_BYID | PES League | gate | unseen | pid, compe_id, view_num | account_id, clan_owner_name, continuous_win, diff_score, draw_count, entry_name, get_score, is_deleted, is_get_participation_right, is_mydata, is_valid_cache, list_max, list_num, lose_count, lose_score, match_num, name, online_id, pid, point, psn_user_id, rank, rank_list, rank_type, recode_date, team_id, update_date, win_count, xuid_one | |
GET_PESLEAGUE_COMPE_RESULT_LIST | PES League | gate | unseen | pid, compe_id, is_unconfirm_list | account_id, banner_file_info, before_division, clan_name, clan_owner_name, clan_owner_pid, compe_db_id, compe_id, compe_name, end_date, entry_user_num, filename, hash_str, is_confirm, is_deleted, is_get_reward, is_participation_get, is_valid_cache, name, online_id, player_rank, psn_user_id, result_list, result_list_num, start_date, update_division, xuid_one | |
GET_PESLEAGUE_COMPE_REWARD_INFO | PES League | gate | unseen | pid, compe_id | reward_info | |
GET_PESLEAGUE_COMPE_REWARD_LIST | PES League | gate | unseen | pid, compe_id | body, contract_term, count, entity_id, grade, item, item_effect_arg, item_type, item_variation, name, name_jp, pes_point_price, player_level, present_id, present_type, receipt_deadline, reward_list, reward_list_num, skill, skill_category, skill_id, team_id, title, type | |
GET_PESLEAGUE_COMPE_TEAM_LIST | PES League | gate | unseen | pid, compe_id | team_list, team_list_num | |
GET_PESLEAGUE_MAINMENU_INFO | PES League | gate | unseen | pid, mode | division, new_result | |
GET_PLATFORM_SESSION | Store & platform | gate | unseen | pid, room_id | data_size, session | |
GET_PLAYER_DATA | Login & account | gate | ours ×86 | account_id, has_data, is_deleted, is_valid_cache, name, online_id, pid, pname, psn_user_id, xuid_one | ||
GET_PLAYERINFO | News & info | gate | unseen | pid, user_id, pname, name, xuid_one, psn_user_id, account_id, online_id, is_valid_cache, is_deleted | account_id, active_squad_level, active_squad_power, base_team_id, best_rank, cloud_squad_level, cloud_squad_power, contWinMax_num, contWin_num, coop_level, coop_level_point, coop_manner, coop_profile_data, current_weekly_point, disconnect_rate, division, draw_count, draw_num, entry_count, favoritePlayer, favoriteTeam, follower, game_count, goal, group_win_count, hometown, intro, is_deleted, is_follow, is_valid_cache, label, lose_count, lose_num, lostGoal, manner, match_data, match_data_size, match_num, matchday_rating_rank, matchday_stats_coop, matchday_stats_single, max_weekly_point, myclub_coach_stats, myclub_matchday_rating_rank, myclub_stats, name, nation_id, online_id, online_match, pickup_count, pid, pname, position, position_rating, psn_user_id, rankmatch_stats, rankmatch_teamLog, rating, regist_team_info, skill_rank, team_name, total_position_match_num, total_position_rating, vscom_match, win_count, win_num, xuid_one | |
GET_PLAYER_PARAMETERLIST | Login & account | gate | OK only ×88 | pid, player_list, gameplayer_unique_id, gameplayer_id, is_equalization | gameplayer_id, gameplayer_id_info, gameplayer_unique_id, is_cost_over, param_playerlist, parameters | |
GET_POSITION_RATING | Match | gate | unseen | pid, target_pid | game_count, pos_rating_list, position, rating, total_position_match_num, total_position_rating | |
GET_PRIVATEINFOTITLELIST | News & info | gate | OK only ×192 | pid, lang, region | annnounce_info_list_num, announce_id, announce_info_list, announce_type, compe_db_id, date, event_id, evoked_text, filename, hash_str, is_auto_make_compe_name, is_use_emblem, list_banner_file_info, matchday_emblem_info, matchday_group_type, popup_type, priority, team_list_group_a, team_list_group_b, title, weekly_info_type | personal news list → |
GET_QUICKMATCHOPTION | Matchmaking | gate | ours ×76 | pid | is_league, is_pass_level, is_team_power_lv, ping_level, rating_level, team_class | |
GET_RANDOMSELECTION_LOTTERY_LIST | Random Selection | gate | unseen | pid, compe_id | gameplayer_list, gameplayer_list_num, trade_num | |
GET_RANKING | Divisions & rankings | HTTP | unseen | start_index, view_num, sort, order | account_id, date, division, draw_count, favoritePlayer, favoriteTeam, intro, is_deleted, is_valid_cache, lose_count, manner, match_record, name, online_id, pid, pname, point, psn_user_id, rank, rank_list, rating, total_rank_num, user, win_count, win_s_max, xuid_one | HTTP ranking, inline maps → |
GET_RANKING_BYID | Divisions & rankings | HTTP | unseen | pid, xuid_one, np_account_id, view_num, sort, order | account_id, date, division, draw_count, favoritePlayer, favoriteTeam, intro, is_deleted, is_valid_cache, lose_count, manner, match_record, name, online_id, pid, pname, point, psn_user_id, rank, rank_list, rating, total_rank_num, user, win_count, win_s_max, xuid_one | |
GET_ROOM_BESTPLAYER | Lobby & rooms | gate | unseen | pid, room_id | game_count, pid, position_best_player, rating | |
GET_SERVER_ENV | Login & account | gate | ours ×206 | is_check_myclub_level, is_revision_check, konamiid_api_retry_sec, lobby_ping_good, lobby_ping_normal, log_update_level, match_client_timeout_cmd_lack, match_client_timeout_init_not_end, match_client_timeout_load_timeout, match_client_timeout_long_outofplay, matchrejectpid_max, max_division, proto_opt, quality_check_wait_sec, quick_ping_good, quick_ping_normal, teamlobby_game_rating_border_hard, teamlobby_game_rating_border_normal, trigger_keep_alive | match timeouts in seconds + switches → | |
GET_STEAM_STORE_STATE | Store & platform | HTTP | unseen | pid, ticket, steamid, package_type, orderid | state | |
GET_STORELINK | Store & platform | HTTP | unseen | region | storelinkinfo | |
GET_STORE_PRODUCT_LIST | Store & platform | gate | OK only ×148 | license_area | base_point, bonus_point, expiration_date, is_consumable, is_purchasable, is_subscription, live_asset_id, live_offer_id, live_product_id, product_id, product_list, product_list_num, psn_entitlement_id, psn_product_id, steam_dlc_id, steam_item_id, total_point | |
GET_STORE_TRANSACTION_STATE | Store & platform | gate | OK only ×148 | pid | live_transaction_id, possession_num, product_id, state, steam_order_id, transaction_id, use_num, used_present_product_id_list, used_present_product_id_list_num | |
GET_SVRLIST | Login & account | gate | ours ×74 | timeout, lang, patch_version, dlc_version | max_player_num, player_num, server_num, svraddr, svrgid, svrlist, svrport, svrtype | |
GET_SVRTIME | Login & account | gate | ours ×74 | date | ||
GET_SVRVERSION | Login & account | gate | ours ×74 | patch_version, dlc_version, livedata_version | dlc_version, eula_myclub_version, eula_privacy_notice_version, eula_privacy_policy_california_version, eula_privacy_policy_version, eula_version, livedata_version, patch_version, version | |
GET_TRIAL_URLLIST | Store & platform | HTTP | unseen | lang, platform, region, type | type, ulist, url, url_num | |
GET_TURN_SERVER_LIST | Connectivity / relay | HTTP | OK only ×250 | pid, turn_account_param, turn_time_limit | address, id, origin, port, pw, server_certificate, server_certificate_data_size, tls_port, turn_server_list, zone | TURN servers + creds; empty list = no relay fallback → |
GET_URGENT_ANNOUNCEMENT | News & info | gate | OK only ×96 | pid, package_type, online_mode, announcement_type, lang, region | announcement_data, announcement_id, announcement_type, body, is_announcement, online_mode, read_check, title | server pop-up before a mode → |
GET_URLLIST | Login & account | gate | ours ×104 | lang, region, patch_version, dlc_version | type, ulist, url, url_num | |
GET_WATCHING_MATCH_LIST | Spectating | gate | unseen | pid, match_category, compe_id, index | account_id, cpu_level, date, ex_type, game_phase, game_result, gameend_reason, is_com, is_deleted, is_follow, is_guest, is_valid_cache, match_category, match_id, match_list, match_list_num, name, no_match, online_id, pid, pk_flag, player, pname, psn_user_id, score, score_1st, score_2nd, score_ex1st, score_ex2nd, score_pk, side, team, total_match_num, xuid_one | watchable matches → |
INVITE_CLAN | Lobby & rooms | gate | unseen | pid, target_id, pname, name, xuid_one, psn_user_id, account_id, online_id, is_valid_cache, is_deleted | ||
JOIN_BLOCK | Social | gate | unseen | block_id | enter a block → | |
JOIN_COMPEV | Events & competitions | gate | unseen | pid, compe_mode, compe_id, compe_cpu_level | ||
JOIN_COMPEV_MODE | Events & competitions | gate | unseen | pid, compe_mode | ||
JOIN_COOP_ROOM | Co-op | gate | unseen | pid, room_id, password, is_invite | ||
JOIN_LOBBY | Lobby & rooms | gate | ours | lobby_id | gamerelay_web_url | |
JOIN_MATCHDAY | Matchday | gate | unseen | pid, compe_id, entry_matchday_group, team_id, sp_gameplan_data, sp_gameplan_data_size, sp_member_list | evaluation_a, evaluation_b, rating_kind_player_bonus_value_list, sp_squad_rating, squad_rating_info | |
JOIN_MATCHDAY_MODE | Matchday | gate | unseen | pid | ||
JOIN_OFFLINE_MODE | Login & account | gate | OK only ×12 | pid, offline_mode | ||
JOIN_ONLINE_MODE | Login & account | gate | OK only ×96 | pid, online_mode, patch_version, dlc_version, livedata_version, extradata_version | versions; ERR_MODE_BLOCKED = version gate → | |
JOIN_PESLEAGUE_COMPE | PES League | gate | unseen | pid, compe_id, team_id | ||
JOIN_PESLEAGUE_COMPE_MODE | PES League | gate | unseen | pid, compe_mode | ||
JOIN_ROOM_NTL | Lobby & rooms | gate | unseen | room_id, is_invited, password | account_id, address_family, host_addr, is_deleted, is_valid_cache, name, ntl_nat_type, online_id, pid, pname, psn_user_id, reflexive_addr, relayed_addr, room_owner, room_stat, sa_data, xuid_one | join a room (password) → |
LACK | In-match sync | gate | unseen | |||
LEAVE_BLOCK | Social | gate | unseen | pid | ||
LEAVE_CLAN | Clans | gate | unseen | pid, owner_pid | ||
LEAVE_COMPEV | Events & competitions | gate | unseen | pid, compe_mode | ||
LEAVE_COMPEV_MODE | Events & competitions | gate | unseen | pid | ||
LEAVE_COOP_ROOM | Co-op | gate | unseen | pid, room_id | ||
LEAVE_GAME | Match | gate | unseen | pid | back to room after a match → | |
LEAVE_LOBBY | Lobby & rooms | gate | ours | |||
LEAVE_MATCHDAY | Matchday | gate | unseen | pid | ||
LEAVE_MATCHDAY_MODE | Matchday | gate | unseen | pid | ||
LEAVE_MYCLUB_AUCTION_SCOUT_DETAIL | myClub | gate | unseen | pid | ||
LEAVE_OFFLINE_MODE | Login & account | gate | OK only ×12 | pid, offline_mode | ||
LEAVE_ONLINE_MODE | Login & account | gate | OK only ×6 | pid, online_mode | ||
LEAVE_PESLEAGUE_COMPE | PES League | gate | unseen | pid | ||
LEAVE_PESLEAGUE_COMPE_MODE | PES League | gate | unseen | pid | ||
LEAVE_ROOM | Lobby & rooms | gate | OK only ×68 | error_code | ||
LOCK_FOLLOW_USER | Social | gate | unseen | pid, target_pid, is_lock | ||
LOGIN | Login & account | gate | ours ×152 | username, hash, platform, patch_version, dlc_version, livedata_version, extradata_version, package_type, sku, net_link_type, np_account_id, pairwise_id | ||
LOGIN_TRIAL | Store & platform | HTTP | unseen | steam_id, xuid, xuid_one, account_id, platform, region, lang, type | ||
LOST_GUEST | In-match sync | gate | unseen | |||
MATCH_MENU_STADIUM_LIST | Match | gate | unseen | |||
MATCH_MENU_UPDATE | Match | gate | unseen | |||
RECONNECT | In-match sync | gate | unseen | pid, platform, patch_version, dlc_version, online_mode | key, key_size | after a gate drop; needs key like SET_CURRENTPLAYER → |
RECV_MYCLUB_ACHIEVEMENT_BONUS | myClub | gate | unseen | pid, achievement_category, is_all | achievement_bonus, achievement_category, achievement_id, body, contract_term, count, entity_id, grade, item, item_effect_arg, item_type, item_variation, name, name_jp, pes_point_price, player_level, present, present_id, present_type, receipt_deadline, received_all, received_milestone_level, recv_achievement_list, skill, skill_category, skill_id, team_id, title, type | |
RECV_MYCLUB_PRESENT | myClub | HTTP | unseen | pid, present_id, is_all | body, contract_term, count, entity_id, grade, item, item_effect_arg, item_type, item_variation, name, name_jp, pes_point_price, player_level, present_id, present_type, receipt_deadline, receive_result_list, receive_result_list_num, skill, skill_category, skill_id, team_id, title, type | |
REENTRY_COMPEV | Events & competitions | gate | unseen | pid, compe_id | ||
REJECT_CLAN_REQUEST | Clans | gate | unseen | pid, request_list, type, status, is_new, appliciant_user_id, pname, name, xuid_one, psn_user_id, account_id, online_id, is_valid_cache, is_deleted, is_follow, date, applicant_clan_name | ||
RENT_MYCLUB_GAMEPLAYER | myClub | gate | unseen | pid, gameplayer_id, use_pes_point | add_skill_id, assist, attacking_area_center, attacking_area_side, build_up_long, build_up_short, concept, contract_gp, contract_pes_point, contract_term, default_overall, default_rarity, defence_type_forecheck, defence_type_retreat, enhanced_parameters, exp_current_level, exp_to_next_level, exp_total, first_df_aggressive, first_df_safety, gameplayer, gameplayer_cost, gameplayer_id, gameplayer_unique_id, games, goal, gp, is_protected, is_rental, is_subscription, level, level_info, level_limit, mcountLeft, mobility_fix, mobility_float, nation_id, parameters, pes_point, player_level_need_exp, press_rule_net_defence, press_rule_seal_off, rating, redcard_game_kind, redcard_info_list, sell_gp, team_id, tiredness, transition_counter, transition_possession, uniform_number | |
REQ_GAMEADDPOINT | Match | gate | OK only ×64 | pid | asks for the verdict after 10 s; answer + push → | |
REQWATCH_ERROR_COOP_ROOM_TO_MATCHING | Co-op | gate | unseen | pid, room_id | error_kind, is_error | |
REQWATCHL_BLOCK_MATCH_LIST | Social | gate | unseen | pid | account_id, away, game_phase, home, is_deleted, is_valid_cache, list_data, list_key_name, list_num, list_type, match_id, name, online_id, pid, pname, psn_user_id, room_id, room_name, room_number, score, score_1st, score_2nd, score_ex1st, score_ex2nd, score_pk, team_id, xuid_one | |
REQWATCHL_COOP_ROOM_MEMBER | Co-op | gate | unseen | pid, room_id | account_id, coop_level, guest_info, is_clan_member, is_deleted, is_follow, is_guest, is_owner, is_platform_guest, is_ready, is_valid_cache, list_data, list_key_name, list_num, list_type, name, online_id, pid, player_index, pname, psn_user_id, user_info, xuid_one | |
REQWATCHL_ROOMLIST | Lobby & rooms | gate | unseen | account_id, auto_start_num, ball_type, cpuLevel, dlcontent, enter_no, exGame, exSubstitution, game_no, game_phase, game_rating_limit, gameenv, gamer, gamer_num, gametime, injury, is_anyplayers, is_deleted, is_invite_limit, is_original_player, is_passwd, is_room_owner, is_select_gk, is_valid_cache, limitTime, list_data, list_key_name, list_num, list_type, max_players, name, online_id, owner_lang, owner_pname, pid, pkOnOff, psn_user_id, room_id, room_number, room_user_count, side, status, substitution, vs_com, xuid_one | room list (RELOAD/ADD/UPDATE/DEL) → | |
REQWATCHL_ROOMPLAYERLIST_NTL | Lobby & rooms | gate | unseen | room_id | account_id, address_family, game_entry_no, guest_info, has_guest, host_addr, is_deleted, is_owner, is_platform_guest, is_quality_bad, is_valid_cache, lang, list_data, list_key_name, list_num, list_type, name, ntl_nat_type, online_id, pid, pname, psn_user_id, reflexive_addr, relayed_addr, room_entry_no, room_player_id, sa_data, side, xuid_one | room members + P2P addresses; reply within 10 s, later changes as UPDATE → |
REQWATCH_MYCLUB_AUCTION_REFUNDED_GP | myClub | gate | unseen | pid | gp, product_id, refunded_gp_list, skill, skill_category, skill_id, total_gp | |
REQWATCH_ROOM_XUIDONE_LIST | Lobby & rooms | gate | unseen | pid, room_id | list_size, xuid_one_list | |
RESET_MYCLUB_AGENT_BOX | myClub | gate | unseen | pid, agent_id | ||
RESET_MYCLUB_TEAM | myClub | gate | unseen | pid | ||
RESULT_RANDOMSELECTION_LOTTERY | Random Selection | gate | unseen | |||
RESULT_RANDOMSELECTION_TRADE | Random Selection | gate | unseen | |||
RESULT_SELECTING_PLAYER_NUM | Match | gate | unseen | |||
RESULT_SIDE | Match | gate | unseen | |||
RETURN_COOP_ROOM | Co-op | gate | unseen | pid, room_id | ||
REVISION_CHECK | In-match sync | gate | unseen | |||
ROLLBACK_STORE_TRANSACTION | Store & platform | gate | unseen | pid, transaction_id | ||
SELECT_SIDE | In-match sync | gate | unseen | |||
SELL_MYCLUB_COACH | myClub | gate | unseen | pid, coach_unique_id | gain_gp, gp | |
SELL_MYCLUB_GAMEPLAYER | myClub | gate | unseen | pid, gameplayer_unique_id_list, is_use_cloud_match | gain_gp, gp | |
SELL_MYCLUB_SCOUT | myClub | gate | unseen | pid, scout_list, agent_id, skill, skill_category, skill_id, grade, count, rate, rate_table, rate_player_num, target_level, sell_gp | gain_gp, gp | |
SEND_ABNORMALEND | Match | gate | OK only ×80 | reason, error_code | 26 reasons; error_code CODE_0xHEX → | |
SEND_ALIVE | Match | gate | unseen | pid, reason | reply to liveness probe → | |
SEND_ALIVEPLAYER | Match | gate | unseen | pid, pid_list, pid_list_num | ||
SEND_AUTHORIZATION_CODE | Login & account | HTTP | unseen | authorization_code, issuer_id, pid, onlineid_data, onlineid_term, region, package_type | account_id | |
SEND_COOP_ALIVE | Co-op | gate | unseen | pid, group_id | answer to CHECKALIVE → | |
SEND_DOWNLOAD_STATS_DATA | Match | gate | unseen | pid, filename, file_hash, download_type, download_time, downloaded_size, average_bps, max_bps, min_bps, result_kind | ||
SENDFAILED | In-match sync | gate | unseen | |||
SEND_GAME_RESULT | Match | gate | OK only ×72 | pid, gameend_reason, error_code, game_phase, side, home_score, away_score, home_team_id, away_team_id, is_cheat, abnormalend_reason, communication_time, link_type, rtt_max, rtt_mean, rtt_var, rx_packet_loss_rate_max, rx_packet_loss_rate_mean, rx_recently_packet_loss_rate_max, rx_recently_packet_loss_rate_mean, receive_idle_time, transport_rtt_max, transport_rtt_mean, transport_rtt_var, match_time, cursor_data_list, cursor_id, name, cursor_executed_command_count, cursor_executed_command_count_in_mc_active, input_delay_in_mc_active_mean, input_delay_in_mc_active_max, input_delay_buffer_fatal_cond_determn_time_max, match_delay_mean, match_delay_max, match_delay_mean_inactive, match_delay_max_inactive, match_stop_count_self_buffer_empty_in_mc_active, cursor_data_list_num, match_stop_count_buffer_empty_in_mc_active, executed_command_count, executed_command_count_in_mc_active, match_hz_min, match_hz_mean, match_hz_variance, base_private_network_quality, base_network_quality, private_network_quality, network_quality, is_quality_bad, is_quality_check_failed, is_degrade_private_network, is_degrade_network, pes_srv_rtt_nums, pes_srv_rtt_mean, pes_srv_rtt_variance, pes_srv_rtt_min, pes_srv_rtt_max | one per client; reconcile both → | |
SEND_GAME_SEQUENCE_DATA | Match | gate | unseen | pid, match_id, game_seq_data, type, fromId, channelId, sequenceNumber, data, data_len, game_seq_data_num | match recording upload (spectating) → | |
SEND_HEARTBEAT | Login & account | gate | ours ×3845 | |||
SEND_IPANDPORT_NTL | Connectivity / relay | gate | ours ×90 | host_addr, address_family, sa_data, reflexive_addr, relayed_addr, ntl_nat_type, file_hash_list, file_hash_list_num | NTL candidates; host's reflexive = LAN IP problem → | |
SEND_KICK_REQUEST | Fair play | gate | unseen | |||
SEND_LOG | Login & account | gate | OK only ×192 | pid, title, log | ||
SEND_MATCH_ANALYZE | Match | gate | unseen | pid, analyze_data_type, analyze_data, game_res, favorite_play_offence_first, favorite_play_offence_second, favorite_play_offence_third, favorite_play_defence_first, favorite_play_defence_second, favorite_play_defence_third, posession, pass_count, pass_success_count, cross_count, cross_success_count, pass_cut_count, tackle_count, tackle_success_count, dribble_distance, attack_time, deffence_time, pass_distance, match_up_distance, foul_count, offside_count, shoot_count, inframe_shoot_count, suffer_shoot_count, suffer_inframe_shoot_count, score_dribble_count, score_pass_count, score_cross_count, score_through_pass_count, score_set_play_count, score_other, score_loss_dribble_count, score_loss_pass_count, score_loss_cross_count, score_loss_through_pass_count, score_loss_set_play_count, score_loss_other, attack_area_left, attack_area_middle, attack_area_right, intercept_area, concept_arrange_offence_first, concept_arrange_offence_second, concept_arrange_defence_first, concept_arrange_defence_second | ||
SEND_MATCHING_RESULT | Matchmaking | gate | OK only ×108 | member, pid, host_addr, address_family, sa_data, reflexive_addr, relayed_addr, ntl_nat_type, vs_member, error_code, game_sycom, gamerelay_ip_addr, gamerelay_ip_port, quality_select_kind, quality_antenna | per-match connectivity record → | |
SEND_MATCH_TEAM_INFO | News & info | gate | OK only ×72 | pid, match_team_info, team_spirit, cpu_level, is_cost_over, chemistry, player_role_list, role, is_use_variable_formation, starting_order, gameplayer_id_info, gameplayer_unique_id, gameplayer_id, level, condition, stamina | line-ups, form, stamina → | |
SEND_MYCLUB_MATCH_RATING | myClub | gate | unseen | pid, rating_list, gameplayer_id_info, gameplayer_unique_id, gameplayer_id, rating, opponent_rating_list, rating_num, opponent_rating_num | ||
SEND_MYCLUB_PROGRESS_STATUS | myClub | gate | unseen | pid, status | next_status | |
SEND_MYCLUB_READ_ACHIEVEMENTLIST | myClub | gate | unseen | pid, achievement_category_list | ||
SEND_NOTICE | Match | gate | ours | pid_list_num, pid_list, data | JSON room notices (MOMROOM_*, ROOM_SHARE_INFO) → | |
SEND_PSID | Store & platform | gate | ours ×76 | psid_high, psid_low, xb1_device_id | ||
SEND_STATS_DATA | Match | gate | OK only ×72 | pid, match_id, stats, side, inframe_shoot_num, freekick_num, cornerkick_num, tackle_success_num, save_num, pass_success_num, cut_num, possesion | 8 team counters per side → | |
SEND_STORE_TRANSACTION_ERROR_INFO | Store & platform | gate | unseen | pid, error_code, transaction_id, product_id, use_num, possession_num, psn_service_entitlement_id, live_asset_id, live_product_id, live_transaction_id | ||
SEND_SYNC_NOTICE | Match | gate | ours ×54 | pid_list_num, pid_list, data | barrier; pid_list grows per match, dedupe → | |
SEND_SYSTEM_NOTICE | Match | gate | ours ×98 | pid_list_num, pid_list, data | START/END P2P rendezvous; exactly once, in order → | |
SEND_TAMPER_DATA | Fair play | gate | unseen | pid, match_category, data, error_code | game reports its own tampering → | |
SEND_TEXTCHAT | Social | gate | unseen | channel, statement, list_flg, list_pid | room/block chat → | |
SEND_TRIAL_AUTHORIZATION_CODE | Store & platform | gate | unseen | |||
SEND_TRIAL_AUTHORIZATION_CODE_CLIENT | Store & platform | HTTP | unseen | authorization_code, issuer_id, onlineid_data, onlineid_term, platform, region, type | account_id | |
SEND_TRIAL_ID | Store & platform | HTTP | unseen | steam_id, xuid, xuid_one, account_id, platform, region, type | ||
SEND_TURN_ADDRESS_DATA | Connectivity / relay | gate | unseen | pid, address, address_data_size | client's TURN relayed address; forward to opponent → | |
SEND_WATCHING_RESULT | Spectating | gate | unseen | pid, match_id, is_connect, phase, error_code, reason | viewer's report → | |
SET_AVATAR | Login & account | gate | unseen | pid, avatar_data_size, avatar_data, avatar_md5 | ||
SET_CLAN_SETTINGS | Clans | gate | unseen | pid, clan_basic_settings, clan_name, owner_info, user_id, pname, name, xuid_one, psn_user_id, account_id, online_id, is_valid_cache, is_deleted, coop_level, is_follow, last_login, current_online_mode, is_join_online_mode, enable_request, clan_comment, is_banned | ||
SET_COOP_MATCH_DATA | Co-op | gate | unseen | pid, match_stats, grade, match_data_size, match_data | ||
SET_COOP_MATCH_READY | Co-op | gate | unseen | pid, room_id, is_ready | ||
SET_COOP_PLAYER_GRADE | Co-op | gate | unseen | pid, grade_list, grade, oppo_grade_list | ||
SET_COOP_QUICKMATCHOPTION | Co-op | gate | unseen | pid, is_vscom, cpu_level_min, cpu_level_max | ||
SET_COOP_REJECT | Co-op | gate | unseen | pid, set_reject_pid_list, unset_reject_pid_list | account_id, is_deleted, is_valid_cache, name, online_id, pid, pname, psn_user_id, reject_list, reject_list_num, xuid_one | |
SET_COOP_ROOM_GUEST | Co-op | gate | unseen | pid, room_id, guest_info_list, pname, name, xuid_one, psn_user_id, account_id, online_id, is_valid_cache, is_deleted, is_platform_guest | ||
SET_COOP_ROOM_OPTION | Co-op | gate | unseen | pid, room_id, basic_settings, room_name, clan_name, clan_owner_info, pname, name, xuid_one, psn_user_id, account_id, online_id, is_valid_cache, is_deleted, is_follow, is_com_match, is_use_chat, is_same_level, team_level, coop_level, is_same_manner, coop_manner, room_entry_restriction, password, lang, match_settings, user_team_id, enemy_team_id, cpu_level | ||
SET_COOP_ROOM_PLATFORM_SESSION | Co-op | gate | unseen | |||
SET_COOP_ROOM_TO_MATCHING | Co-op | gate | unseen | pid, room_id, to_match_pid_list | ||
SET_CURRENTPLAYER | Login & account | gate | ours ×78 | region, lang, pcspec, np_account_id, xuid_one, name, dlc_dl_status, abnormal_disocn, discon_game_mode, cmd_err, discon_kind, rtt_nums, rtt_mean, rtt_variance, rtt_min, rtt_max, disconnect_utc_unixtime, dp_file_list, dp_file_list_num, nation_code_ip, nation_code_select, area_code_ip, area_code_select, stun_addr, stun_time | area_code_server, area_name_server, chat_probi, is_select_code_changed, key, key_size, nation_code_server, nation_name_server, subscription_active, subscription_expire_date | key_size 32 would switch to AES; keep 16 → |
SET_DMM_NOTIFICATION_ACTION | Store & platform | gate | unseen | pid, notification_id, action_kind | ||
SET_GAMEENV | Match | gate | unseen | game_env, cpuLevel, gametime, injury, ball_type, exGame, pkOnOff, substitution, exSubstitution, limitTime | match settings → | |
SET_GAMEMEMBER | Match | gate | OK only ×52 | owner only; in Free lobby = start the game → | ||
SET_GAMEMEMBERENV | Match | gate | OK only ×52 | list_num, envlist, pid, side, sideLeader | owner only; authoritative sides; errors abort → | |
SET_GAMEPLAYER_PLAYTIME | Match | gate | OK only ×16 | player_list_num, player_list, gameplayer_id_info, gameplayer_unique_id, gameplayer_id, play_time, position, opponent_player_list_num, opponent_player_list | minutes + positions → | |
SET_GAMERELAY_CHECK_RES | Connectivity / relay | gate | ours ×81 | pid, game_sycom, error_code, gamerelay, gamerelay_index, ip_addr, port, grid, failed_reason, is_special_match_confirm | client's connection verdict → | |
SET_GAMERELAY_MATCH_QUALITY | Connectivity / relay | gate | unseen | pid, match_quality | ||
SET_GAMERELAY_QUALITY | Connectivity / relay | gate | unseen | pid, quality_list, gamerelay_index, quality, last_update | ||
SET_GAMETEAM | Match | gate | OK only ×88 | home_team_id, away_team_id | home/away team ids → | |
SET_GP_ACHIEVEMENT | Store & platform | gate | unseen | pid, new_achievement_bit_array | all_achievement_bit_array, all_gp | |
SET_GUEST | In-match sync | gate | unseen | has_guestplayer, guest_info, pname, name, xuid_one, psn_user_id, account_id, online_id, is_valid_cache, is_deleted, is_platform_guest | ||
SET_LANGUAGE | Login & account | gate | OK only ×152 | lang | ||
SET_LOCAL_GAMERELAY_LIST | Connectivity / relay | HTTP | unseen | pid, np_account_id, ip_addr | ||
SET_MATCHDAY_SP_COOP_MEMBER_LIST | Co-op | gate | unseen | pid, member_list, gameplayer_id, parameters, team_id, nation_id, member_list_num | ||
SET_MATCHDAY_SP_GAMEPLAN | Matchday | gate | unseen | pid, compe_id, gameplan_data_size, gameplan_data, sp_member_list | ||
SET_MATCHDAY_START_WATCH_MATCH | Matchday | gate | unseen | pid, compe_id | ||
SET_MATCHREJECTPID | Match | gate | unseen | pid, reject_pid, is_reject | ||
SET_MYCLUB_ACHIEVEMENT | myClub | gate | unseen | pid, achievement_category | ||
SET_MYCLUB_ADD_UNIFORM_ID | myClub | gate | unseen | pid, add_uniform_id | ||
SET_MYCLUB_CLOUD_SQUAD | myClub | gate | unseen | pid, cloud_squad_id, team_power, team_level, is_use_cloud_match | ||
SET_MYCLUB_CLUB_EDITION_INFO | myClub | gate | unseen | pid, club_edhition_info_list, club_edition_type, team_id, coach_id, name, gameplan_data_size, gameplan_data, squad_member_list, team_member_list, member_list_num, is_over_cost, team_power, team_level, team_spirit | ||
SET_MYCLUB_COOP_MEMBER_LIST | myClub | gate | unseen | pid, member_list, gameplayer_unique_id, gameplayer_id, parameters, team_id, nation_id, member_list_num, matchday_condition_list | ||
SET_MYCLUB_HOMETOWN | myClub | gate | unseen | pid, home_town, nation_id, label, name | ||
SET_MYCLUB_ICONIC_MOMENT_VIEW | myClub | gate | unseen | pid, is_iconic_moment_view | ||
SET_MYCLUB_MAIN_SQUAD | myClub | gate | unseen | pid, squad_id, team_power, team_level, team_spirit, matchday_squad_rating_info, squad_rating, squad_rating_kind_player_num_list | ||
SET_MYCLUB_PLAYER_NUMBER_FIXATION | myClub | gate | unseen | pid, player_number_list, player_id, number, player_number_list_num | ||
SET_MYCLUB_PROTECTED_DISABLE | myClub | gate | unseen | pid, gameplayer_unique_id_list | ||
SET_MYCLUB_PROTECTED_ENABLE | myClub | gate | unseen | pid, gameplayer_unique_id_list | ||
SET_MYCLUB_SQUAD_COACH | myClub | gate | unseen | pid, squad_id, coach_unique_id, tacticsPlanKind, gameplan_data_size, gameplan_data | ||
SET_MYCLUB_SQUAD_GAMEPLAN | myClub | gate | unseen | pid, squad_id, gameplan_data_size, gameplan_data | ||
SET_MYCLUB_SQUAD_GAMEPLAYER | myClub | gate | unseen | pid, squad_id, member_list, gameplayer_unique_id, gameplayer_id, uniform_number, player_level, parameters, default_rarity, member_list_num, is_over_cost, team_power, team_level, team_spirit, matchday_squad_rating_info, squad_rating, squad_rating_kind_player_num_list | ||
SET_MYCLUB_SQUAD_NAME | myClub | gate | unseen | pid, squad_id, name | ||
SET_MYCLUB_TEAM_BASE | myClub | gate | unseen | pid, base_team_id | ||
SET_MYCLUB_TEAM_NAME | myClub | gate | unseen | pid, team_name, team_name_short, is_check_team_name, is_check_team_name_short, team_name_commentary_id | ||
SET_MYCLUB_VSCOM_GAMERESULT | myClub | gate | unseen | pid, cpu_level, gameend_reason, winner_side, ex_flag, pk_flag, team, score, score_1st, score_2nd, score_ex1st, score_ex2nd, score_pk, goal_player_list, gameplayer_unique_id, gameplayer_id, assist_player_list, yellow_player_list, red_player_list, injury_player_list, gameplayer_id_info, injury_data, part, symptom, level, mcount_left, injury_all, injury_one, gameplayer_played_info_list, play_time, rating, position, is_coach_mode, error_code, pes_srv_rtt_nums, pes_srv_rtt_mean, pes_srv_rtt_variance, pes_srv_rtt_min, pes_srv_rtt_max, past_game_played_pid, is_interrupt | account_id, contWin_num, gameend_reason, is_deleted, is_first, is_first_skillrank, is_rankup_skill_rank, is_valid_cache, name, oldrating, online_id, pes_pname, pid, player_data, psn_user_id, rating, rating_boost_rate, rating_boost_type, rating_compe, rating_type, side, skill_rank, team_id, xuid_one | |
SET_MYCLUB_WISHLIST_AT_TOP | myClub | gate | unseen | pid, wishlist_id | ||
SET_PLATFORM_SESSION | Store & platform | gate | unseen | pid, data_size, session | ||
SET_PLAYDATA_MATCH | Match | HTTP | OK only ×15 | pid, play_data | JSON summary: scorers, player ratings → | |
SET_PLAYERPROFILE | Login & account | gate | unseen | profile, date, favorite_team, favorite_player, intro, is_enable_myPES | error_favorite_player, error_favorite_team, error_intro | |
SET_POSITION_RATING | Match | gate | unseen | pid, position, rating | ||
SET_QUICKMATCHOPTION | Matchmaking | gate | unseen | pid, is_pass_level, rating_level, ping_level, team_class, is_league, is_team_power_lv | ||
SET_ROOM_OPTION | Lobby & rooms | gate | unseen | pid, name, password, is_anyplayers, auto_start_num, game_rating_limit | ||
SET_TRACKRECORD | Match | gate | unseen | |||
SET_TRIAL_MATCH_DATA | Store & platform | gate | unseen | |||
SET_WEEKLY_INFORMATION_ACTION | News & info | gate | unseen | pid, announce_id, action_kind | ||
START_COOP_GROUP_MATCHING | Co-op | gate | unseen | pid, matching_type, is_good_reputation, com_level_min, com_level_max, retry_num | form my side (every human) → | |
START_COOP_MATCHING | Co-op | gate | unseen | pid, matching_type, coop_player_info_list, is_good_reputation, guest_kind, user_id, pname, name, xuid_one, psn_user_id, account_id, online_id, is_valid_cache, is_deleted, owner_pid, use_team_id, retry_num | group owner only: find opponents → | |
START_COOP_VSCOM_OPPONENT | Co-op | gate | unseen | pid, is_myclub_mode, com_level_min, com_level_max, user_data, guest_kind, owner_pid, my_team_id, vs_team_id | co-op vs CPU → | |
START_MATCHDAY_ENTRY_PICKUP_MATCH | Matchday | gate | unseen | pid, compe_id | ||
START_MATCHDAY_PICKUP_MATCHING | Matchday | gate | unseen | pid, compe_id | ||
START_MATCHING | Matchmaking | gate | ours ×74 | pid, matching_type, has_guestplayer, guest_info, pname, name, xuid_one, psn_user_id, account_id, online_id, is_valid_cache, is_deleted, is_platform_guest, pass_level, is_pass_level, is_coach_mode, rating_level, ping_level, class_type, use_team_class_type, is_team_power_lv, retry_num, is_good_reputation | ||
START_SEND_GAME_SEQUENCE_DATA | Match | gate | unseen | pid | replay upload, only with upload YES → | |
START_STEAM_STORE | Store & platform | HTTP | unseen | ticket, steamid, package_type, pid, itemid, language | orderid | |
START_STORE_TRANSACTION | Store & platform | gate | unseen | pid, product_id, use_num, possession_num, live_transaction_id, np_ticket, np_ticket_size, steam_order_id | transaction_id | |
SUB_SELECTING_PLAYER_NUM | Login & account | gate | unseen | |||
SYNC_COMMENTARY | In-match sync | gate | unseen | |||
SYNC_COMPEV_PROGRESS | Events & competitions | gate | unseen | pid, target_pid, room_id | ||
SYNC_MATCHPLAN_DATA_SINGLE | Match | gate | unseen | |||
SYNC_RANDOMSELECTION_TRADE | Random Selection | gate | unseen | |||
TEAM_DATA_SYNC | In-match sync | gate | unseen | |||
TENDER_MYCLUB_AUCTION_SCOUT | myClub | gate | unseen | pid, product_id, tender_gp, is_finalround | auction_end_time, auction_scout_detail, auction_start_time, auction_state, bid_num, finalround_end_time, gp, grade, is_bid, is_bid_user_max, is_highest_bidder, is_reservation, my_price, price_now, price_start, product_id, reservation_price, scout_id, second_price, skill, skill_category, skill_id, third_price | |
TENDER_MYCLUB_AUCTION_SCOUT_FINALROUND_RESERVATION | myClub | gate | unseen | pid, product_id, tender_gp | auction_end_time, auction_scout_detail, auction_start_time, auction_state, bid_num, finalround_end_time, gp, grade, is_bid, is_bid_user_max, is_highest_bidder, is_reservation, my_price, price_now, price_start, product_id, reservation_price, scout_id, second_price, skill, skill_category, skill_id, third_price | |
TENDER_MYCLUB_AUCTION_SCOUT_FINALROUND_RESERVATION_CANCEL | myClub | gate | unseen | pid, product_id | auction_end_time, auction_scout_detail, auction_start_time, auction_state, bid_num, finalround_end_time, gain_gp, gp, grade, is_bid, is_bid_user_max, is_highest_bidder, is_reservation, my_price, price_now, price_start, product_id, reservation_price, scout_id, second_price, skill, skill_category, skill_id, third_price | |
TRADE_MYCLUB_GAMEPLAYER | myClub | gate | unseen | pid, my_player_trade_list, target_trade_player | add_skill_id, assist, attacking_area_center, attacking_area_side, build_up_long, build_up_short, concept, contract_gp, contract_pes_point, contract_term, default_overall, default_rarity, defence_type_forecheck, defence_type_retreat, enhanced_parameters, exp_current_level, exp_to_next_level, exp_total, first_df_aggressive, first_df_safety, gameplayer, gameplayer_cost, gameplayer_id, gameplayer_unique_id, games, goal, is_protected, is_rental, is_subscription, level, level_info, level_limit, mcountLeft, mobility_fix, mobility_float, nation_id, parameters, player_level_need_exp, press_rule_net_defence, press_rule_seal_off, rating, redcard_game_kind, redcard_info_list, sell_gp, team_id, tiredness, transition_counter, transition_possession, uniform_number | |
UPDATE_MYCLUB_COACH_CONTRACT | myClub | gate | unseen | pid, coach_unique_id | contract_term, next_norma | |
UPDATE_TEAM_SELECT | In-match sync | gate | unseen | |||
USE_MYCLUB_ADAPTABILITY_RATE_ITEM | myClub | gate | unseen | pid, coach_unique_id, use_count | adaptability_rate, attacking_area, build_up, coach, coach_id, coach_unique_id, contract_gp, contract_pes_point, contract_term, current_point_division, current_point_sim, current_point_vscom, defence_compact, defence_line, defence_num, defence_type, defensive_main_concept, first_df, formation_data, is_coach_texture_use, is_use_variable_formation, management, mobility, nation_id, offence_num, offensive_main_concept, overall, passsupport_dist, press_rule, sell_gp, team_id, transition | |
USE_MYCLUB_ADD_POSITION_APTITUDE_ITEM | myClub | gate | unseen | pid, gameplayer_unique_id, use_count | result_parameters | |
USE_MYCLUB_ADD_SKILL_ITEM | myClub | gate | unseen | pid, gameplayer_unique_id | add_skill_id, result_parameters | |
USE_MYCLUB_AGENT | myClub | gate | unseen | pid, agent_id, use_pes_point, use_token, use_token_level | add_skill_id, agent_bonus_item_list, assist, attacking_area_center, attacking_area_side, body, build_up_long, build_up_short, concept, contract_gp, contract_pes_point, contract_term, count, default_overall, default_rarity, defence_type_forecheck, defence_type_retreat, enhanced_parameters, entity_id, exp_current_level, exp_to_next_level, exp_total, first_df_aggressive, first_df_safety, gameplayer_cost, gameplayer_id, gameplayer_list, gameplayer_list_num, gameplayer_unique_id, games, goal, gp, grade, is_protected, is_rental, is_subscription, item, item_effect_arg, item_type, item_variation, level, level_info, level_limit, mcountLeft, mobility_fix, mobility_float, name, name_jp, nation_id, parameters, pes_point, pes_point_price, player_level, player_level_need_exp, present_id, present_type, press_rule_net_defence, press_rule_seal_off, rating, receipt_deadline, redcard_game_kind, redcard_info_list, sell_gp, skill, skill_category, skill_id, team_id, tiredness, title, transition_counter, transition_possession, type, uniform_number | |
USE_MYCLUB_ITEM_RECOVERY | myClub | gate | unseen | pid, gameplayer_unique_id_list, is_all, use_pes_point | pes_point | |
USE_MYCLUB_MANAGEMENT_ITEM | myClub | gate | unseen | pid, coach_unique_id, use_count | adaptability_rate, attacking_area, build_up, coach, coach_id, coach_unique_id, contract_gp, contract_pes_point, contract_term, current_point_division, current_point_sim, current_point_vscom, defence_compact, defence_line, defence_num, defence_type, defensive_main_concept, first_df, formation_data, is_coach_texture_use, is_use_variable_formation, management, mobility, nation_id, offence_num, offensive_main_concept, overall, passsupport_dist, press_rule, sell_gp, team_id, transition | |
USE_MYCLUB_SCOUT | myClub | gate | unseen | pid, scout_list, agent_id, skill, skill_category, skill_id, grade, count, rate, rate_table, rate_player_num, target_level, sell_gp, scout_list_num | add_skill_id, assist, attacking_area_center, attacking_area_side, build_up_long, build_up_short, concept, contract_gp, contract_pes_point, contract_term, default_overall, default_rarity, defence_type_forecheck, defence_type_retreat, enhanced_parameters, exp_current_level, exp_to_next_level, exp_total, first_df_aggressive, first_df_safety, gameplayer, gameplayer_cost, gameplayer_id, gameplayer_unique_id, games, goal, is_protected, is_rental, is_subscription, level, level_info, level_limit, mcountLeft, mobility_fix, mobility_float, nation_id, parameters, player_level_need_exp, press_rule_net_defence, press_rule_seal_off, rating, redcard_game_kind, redcard_info_list, sell_gp, team_id, tiredness, transition_counter, transition_possession, uniform_number | |
USE_MYCLUB_STAFF | myClub | gate | unseen | pid, player_info, gameplayer_unique_id, gameplayer_base_id, gameplayer_id, gameplayer_level, registared_position, position, stronger_foot, overall, ability, play_style, nation_id, club_team_id, staff_info_list, base_player_info, base_exp, use_item_list, item_variation, count | add_skill_id, contract_gp, contract_pes_point, enhanced_parameters, exp_added, exp_current_level, exp_info_post, exp_info_pre, exp_to_next_level, exp_total, gameplayer_unique_id, level, level_limit, m_aggressiveness, m_agility, m_ball_spin_control, m_ball_touch, m_body_balance, m_body_control, m_catching, m_clearances, m_collapsing, m_defense_decision, m_deflecting, m_dribble, m_gk_decision, m_heading, m_intercept, m_jump, m_kick_power, m_long_pass, m_offense_decision, m_place_kicking, m_short_pass, m_shot, m_speed, m_stamina, m_trap, parameters, sell_gp, traning_result, traning_result_num | |
USE_MYCLUB_TACTICAL_TRAINING | myClub | gate | unseen | pid, squad_id, coach_unique_id, is_offensive_formation, use_count | add_skill_id, assist, attacking_area_center, attacking_area_side, build_up_long, build_up_short, concept, contract_gp, contract_pes_point, contract_term, default_overall, default_rarity, defence_type_forecheck, defence_type_retreat, enhanced_parameters, exp_current_level, exp_to_next_level, exp_total, first_df_aggressive, first_df_safety, gameplayer_cost, gameplayer_id, gameplayer_list, gameplayer_unique_id, games, goal, is_protected, is_rental, is_subscription, level, level_info, level_limit, mcountLeft, mobility_fix, mobility_float, nation_id, parameters, player_level_need_exp, press_rule_net_defence, press_rule_seal_off, rating, redcard_game_kind, redcard_info_list, sell_gp, team_id, tiredness, transition_counter, transition_possession, uniform_number | |
USER_DATA_SYNC | In-match sync | gate | unseen | |||
WATCH_BREAKUP_COOP_ROOM | Co-op | gate | unseen | |||
WATCH_CHECK_ALIVE_PLAYER | Match | gate | unseen | pid | push: are you there? → SEND_ALIVE → | |
WATCH_COOP_GROUP_MATCHING | Co-op | gate | unseen | pid | account_id, address_family, base_team_id, com_level_max, com_level_min, coop_level, coop_manner, division, game_result, game_result_wdl, guest_info, guest_kind, has_guestplayer, hometown_info, host_addr, is_deleted, is_entry_weekly_myclub, is_follow, is_owner, is_pes_league_mode, is_platform_guest, is_valid_cache, join_compe_rating, label, manner, matching_order, matching_state, member, member_list, member_list_num, name, nation_id, ntl_nat_type, online_id, pid, pname, psn_user_id, rating, reflexive_addr, relayed_addr, retry_num, sa_data, side, skill_rank, team_id, team_name, team_power_lv, weekly_point, xuid_one | push: side formed; one is_owner per group → |
WATCH_COOP_MATCHING | Co-op | gate | unseen | pid | account_id, address_family, base_team_id, coop_level, coop_manner, division, game_result, game_result_wdl, group_list, guest_info, guest_kind, has_guestplayer, hometown_info, host_addr, is_deleted, is_entry_weekly_myclub, is_follow, is_owner, is_pes_league_mode, is_platform_guest, is_valid_cache, join_compe_rating, label, manner, matching_order, member, member_list, member_list_num, name, nation_id, ntl_nat_type, online_id, pid, pname, psn_user_id, rating, reflexive_addr, relayed_addr, retry_num, sa_data, side, skill_rank, team_id, team_name, team_power_lv, weekly_point, xuid_one | push: both groups with sides → |
WATCH_COOP_MATCHING_CONDITION | Co-op | gate | unseen | pid | coop_play_level_max, coop_play_level_min, manner_max, manner_min, team_power_level_max, team_power_level_min | |
WATCH_COOP_ROOM_OPTION | Co-op | gate | unseen | account_id, basic_settings, clan_name, clan_owner_info, coop_level, coop_manner, countdown_end_time, cpu_level, enemy_team_id, is_com_match, is_deleted, is_follow, is_game, is_same_level, is_same_manner, is_start_count_down, is_start_matching, is_stop_countdown, is_use_chat, is_valid_cache, lang, match_settings, name, online_id, password, pid, pname, psn_user_id, room_entry_restriction, room_id, room_name, room_phase, team_level, user_team_id, xuid_one | ||
WATCH_COOP_ROOM_TO_MATCHING_MEMBER | Co-op | gate | unseen | player_index_list | ||
WATCH_COOP_VSCOM_OPPONENT | Co-op | gate | unseen | pid | account_id, base_team_id, club_edition_type, coach_id_list, coach_unique_id_list, com_level, com_team, default_rarity, gameplan_data, gameplan_data_size, gameplayer_id, gameplayer_unique_id, is_club_edition, is_deleted, is_entry_compe, is_valid_cache, member_list, member_num, my_team, name, online_id, owner_pid, parameters, pes_pname, pid, player_level, psn_user_id, side, squad_id, team_data, team_name, team_name_commentary_id, team_name_short, uniform_number, xuid_one | |
WATCH_DECIDE_GAMEENV | Match | gate | unseen | ball_type, cpuLevel, exGame, exSubstitution, game_env, gametime, injury, limitTime, pkOnOff, substitution | push: final settings → | |
WATCHEND_LOBBY_MATCH_LIST | Lobby & rooms | gate | unseen | |||
WATCH_ENTRY_GAME | Match | gate | unseen | entryNum, entry_count, entrygame, gameNum, pid | push: who entered → | |
WATCH_GAMEADDPOINT | Match | gate | unseen | account_id, contWin_num, gameend_reason, is_deleted, is_first_skillrank, is_pk, is_rankup_skill_rank, is_valid_cache, name, oldrating, online_id, pes_pname, pid, player_count, player_list, psn_user_id, rating, rating_boost_rate, rating_boost_type, rating_compe, rating_type, side, skill_rank, team_id, winner_side, xuid_one | push: ratings, streak, winner; removes 20 s stall → | |
WATCH_GAMERELAY_CHECK_RES | Connectivity / relay | gate | OK only ×26 | error_code | push: server verdict; RETRY if either failed → | |
WATCH_MATCHDAY_PICKUP_MATCHING | Matchday | gate | unseen | account_id, address_family, group_list, group_list_num, host_addr, is_deleted, is_valid_cache, matching_state, member_list, name, ntl_nat_type, online_id, pid, pname, psn_user_id, reflexive_addr, relayed_addr, sa_data, xuid_one | ||
WATCH_MATCHDAY_PICKUP_USER | Matchday | gate | unseen | account_id, is_deleted, is_failed_pickup_users, is_valid_cache, name, online_id, pickup_user_group_a_num, pickup_user_group_b_num, pickup_user_info, pickup_users_group_a, pickup_users_group_b, pid, pname, psn_user_id, xuid_one | ||
WATCH_MATCHING | Matchmaking | gate | ours ×76 | account_id, address_family, base_team_id, division, game_result, game_result_wdl, guest_info, has_guestplayer, hometown_info, host_addr, is_deleted, is_entry_weekly_myclub, is_first_rookie_match, is_owner, is_pes_league_mode, is_platform_guest, is_same_group_match, is_special_match, is_valid_cache, join_compe_rating, label, manner, matching_order, matching_state, member, name, nation_id, ntl_nat_type, online_id, pid, ping, player_num, pname, psn_user_id, rating, reflexive_addr, relayed_addr, retry_num, sa_data, side, skill_rank, special_match_rate, team_id, team_name, team_power_lv, weekly_point, xuid_one | ||
WATCH_MATCHING_CONDITION | Matchmaking | gate | unseen | manner_max, manner_min, rating_max, rating_min | ||
WATCH_MYCLUB_AUCTION_SCOUT_DETAIL | myClub | gate | unseen | auction_agent_id, auction_state, bid_num, is_bid_user_max, is_finished, my_price, price_now, reservation_price, second_price, successful_bid_pid, third_price, update_auction_scout_detail | ||
WATCH_NOTICE | Match | gate | unseen | data | ||
WATCH_PUNCHING_DATA | Connectivity / relay | gate | unseen | address_family, host_addr, ntl_nat_type, reflexive_addr, sa_data | push: peer NTL addresses (lobby flows) → | |
WATCH_ROOMSTATE | Lobby & rooms | gate | unseen | event, owner_pid, password, state | push: room events/states → | |
WATCH_SYNC_NOTICE | Match | gate | OK only ×77 | data | push; content ignored, 10 s wait → | |
WATCH_SYSTEM_NOTICE | Match | gate | OK only ×90 | data | push; a stray head entry stalls 30 s → | |
WATCH_TEXTCHAT | Social | gate | unseen | channel, from_pid, name, statement | push: chat line → | |
WATCH_TURN_ADDRESS_DATA | Connectivity / relay | gate | unseen | address, address_data_size | push: opponent's relayed address (bytes unchanged) → |
How this was found
- Static reading of the game binary (PES2021.exe 1.01.00), with no debugger and no live server traffic to Konami. A small toolkit (
notes/re/functions/tools/) on top of capstone builds a cached cross-reference index of the 37 MB code section in about 10 s. From each command name it finds the request builder, the reply parser and every function that uses the command. STATIC - The game's own structure helps a lot. Each command has an
…Optionclass (request; vtable slot 3 = HTTP form builder, slot 1 of the +280 vtable = gate MessagePack packer) and a…Resultclass whose parser stores every field at a fixed offset. Game code creates commands by name, and the tasks are state machines full of debug strings and source paths (D:\pes2021\PATCH10100\pes21\Source\…\OnlineModeTaskMatchSession.cpp). - Cross-checked with our logs: every claim about a request that the game really sent was compared with the decoded traffic of our test sessions. LIVE
- Reply schemas:
notes/re/extract_schemas.pymissed keys that the client compares with itsstd::string == const char*helper (0x140cf3990) instead ofmemcmp. The fixed extractor finds 1,907 more reply fields in 108 commands (for example the verdict push, division info and all rankings). The catalogue below uses the fixed result. The server'sschemas.jsonhas not been regenerated yet, because the server builds default replies from it and that needs a test run. - The full per-area reports, with every address, are in
notes/re/functions/:net.md,match.md,results.md,rooms.md,coop.md,menus.md,wire.md,survey.md,db.md(with the parsertools/pesdb.py),live.md,nettune.md,messages.md,sweep.md.
What a live test would settle
One match through a TURN relay: done (live tests). The DTLS leg and the relayed-address blob are done too (2026-11-06). The 21.4 s restart (DTLS port change, fixed) and a match forced onto the relay (works, given the label rule) are done too.Pushing WATCH_GAMEADDPOINT after a Quick Match: settled statically. Quick Match never shows the rating screen.- A Free-lobby room between two clients: whether REQWATCHL requests are sent, the order of SET_GAMEENV and CREATEJOIN_ROOM, and the commands between SETENV and kick-off. Partly done: the requests are sent, the order is CREATEJOIN_ROOM then SET_GAMEENV, and with the test handlers the whole flow works: room list → details → join → both Start Match → owner's SET_GAMEMEMBER → DECIDE_GAMEENV + SETENV → team selection on both games (live tests). Since tested: a full match and the return to the room (each game sends LEAVE_GAME; the WAITING push brings both back, and a rematch is possible).
- A hex dump of the first 64 bytes of every UDP send during matchmaking and kick-off: the lltcp header, hole-punching messages and the match-layer packets.
Killing the server connection: done. In the menus it gives VNBP_0002 with no reconnect; during a match, CMD_RECONNECT survives about 7 s (live tests).