Troubleshoot an L2Off connection
Fix common standalone connector, SQL Server, and extender symptoms
Work from the visible symptom. The connector log covers profile, SQL, and connection failures; SQL Server and extender logs cover the game-side handoff.
Server stays Disconnected
Likely causes: Node is older than 22, the process started in the wrong directory, the generated token is stale, or outbound WSS is blocked.
Check: run node --version, confirm portal.toml sits beside the .mjs,
and inspect the first startup error. Download a fresh profile only if the token
was regenerated.
Connector exits before connecting
Likely causes: invalid TOML, a missing required SQL parameter, an unreadable catalog path, or incomplete database settings.
Check: use the exact dotted path named in the validation error. Every line
marked CHECK in the generated profile must match this pack.
Account linking fails
Likely causes: wrong database, password format, ANSI codepage, md5Key, or
account blocking query.
Check: follow Link and create L2Off accounts, then compare one known account through Connector check and a real game login.
Characters do not appear
Likely causes: @account filters the wrong column or the result aliases do
not match the row contract.
Check: execute queries.list_characters with the connector SQL login and
the linked account. An account with no characters should return zero rows, not
an error.
Catalog search returns nothing
Likely causes: a path points at another server root, the file is unreadable, or the name table was uploaded for another game server.
Check: confirm startup record counts, then follow Show item and skill names.
Purchase is queued but item never arrives
Likely causes: no extender consumer, mismatched DLLs/opcodes, delivery is
disabled in l2ext.ini, or the player has not reached an eligible state.
Check: observe whether lin_PortalDeliveryAsk runs, whether the live-player
call succeeds, and whether lin_PortalDeliveryDone consumes the row. Follow
Connect your L2Off extender.
Item arrives more than once
Likely causes: the acknowledgement update fails or the unique command-id guard is absent.
Check immediately: disable sales, verify both procedures store
uses_quoted_identifier = 1, verify the filtered unique index, and replay one
test command. Resolve affected orders only after checking the in-game inventory.
Queue row is consumed but order stays pending
Likely causes: refused_code / reported_at columns are missing, the
connector cannot poll results, or acknowledgement to Forgeport has not
completed.
Check: keep reported_at connector-owned, confirm result polling SQL and
permissions, and inspect the connection log for retries.