gitlab GlitchyScripts/xlivelessness v1.6.2.1

6 hours ago

Download

Download this release containing ALL files for normal/regular use:

In-Progress

SHA-256: In-Progress

Latest XLLN Repository CI Builds:

If you are:

  • having troubles running a Title and wish to diagnose the issue (by checking the debug logs)
  • experiencing a regression in compatibility and want to find what change caused it
  • or wish to use the most recent changes available instead of waiting for the next official release

you can find and download the alternate binaries here:

XLiveLessNess Debug mode:

https://gitlab.com/GlitchyScripts/xlivelessness/-/jobs/artifacts/master/browse/bin/?job=build:%20%5BDebug%5D

XLiveLessNess Release mode:

https://gitlab.com/GlitchyScripts/xlivelessness/-/jobs/artifacts/master/browse/bin/?job=build:%20%5BRelease%5D

XLLN-Modules Debug & Release mode:

https://gitlab.com/GlitchyScripts/xlln-modules/-/jobs/artifacts/master/browse/bin/?job=build

XLLN-Hub for Linux:

https://gitlab.com/GlitchyScripts/xlln-online-hub/-/jobs/artifacts/master/browse/bin/?job=build-linux

XLLN-Hub for Windows:

https://gitlab.com/GlitchyScripts/xlln-online-hub/-/jobs/artifacts/master/browse/bin/?job=build-windows

Release Info and Changes

Sessions and Matchmaking

  • !30 A search returned every context and property a session held, overrunning a Title that sizes
    its result handling against its own query → emit only what the XLAST query declares, in the
    order it declares them, and omit an attribute the session never set
  • !34 Every supplied context was matched for equality → apply the Filters and the Constants the
    Title's XLAST query declares, with the operators they name
  • !30 A session advertised only the properties it held at creation, so a lobby configured
    afterwards never reached a search → carry a property into the session, as contexts already were
  • !34 Context and property updates reached only the first local session
  • !35 XUserSetContextEx and XUserSetPropertyEx skipped a session this instance hosts but the user
    has not joined, dropping every attribute set before the local join
  • !36 XSessionDelete only marked the session deleted, so it was advertised for the life of the
    process → skip deleted sessions and unadvertise, rather than waiting out the 15 second expiry

Fixes: Battlestations Pacific, GTA IV, Section 8: Prejudice (dedicated servers), Universe at War: Earth Assault.

Discovery and Session Identity

  • !33 The remote session store was keyed by host instance alone, so a host's party session and its
    matchmaking session displaced each other on every broadcast tick and only one was ever visible
    → key by instance id and session id
  • !33 A party session (GROUP_LOBBY) and a session with no open public slots are no longer offered
    to matchmaking; both stay reachable by session id, which is how an invitation resolves
  • !33 dwOpenPublicSlots reported the allocation instead of what is left, so a session with 1 of 32
    slots taken was described as having 32 open
  • !33 The unadvertise packet never assigned its sessionType, so the receiver chose which store to
    purge out of uninitialised memory
  • !36 The unadvertise packet named an instance, not a session → it now carries the session id,
    appended so an older instance reads the packet exactly as before
  • !33 The LiveOverLan broadcast walked the local sessions holding only the broadcast lock, while
    XCloseHandle frees those entries from the Title's thread → take xlive_critsec_xsession

Fixes: RE: Operation Raccoon City, GTA IV (Party Mode).

Winsock / Sockets

  • !35 Bind and packet routing compared the port number alone, so a Title holding a stream and a
    datagram socket on one port lost the second bind and misrouted datagrams → key by transport
  • !35 An accepted socket inherits the listener's port without registering it, so closing one
    erased the listener's routing entry → only the registered socket erases it
  • !35 An owed ack or keep-alive left an idle socket on the six second backstop until the peer gave
    up → submit the wait deadline, and wake the thread on an owed ack
  • !40 sendto() on a connected TCP socket was rejected with WSAEINVAL and the payload discarded.
    Winsock ignores the address there and sends to the connected peer. Three decisions after it
    also read the address in place of the socket type, so a stream send carrying an address went
    out as a datagram to a port where nothing listens
  • !41 A lost TCP connection woke a blocked connect, a blocked select and the WSAEventSelect close
    event, but never a blocking recv → the Title thread stayed parked for data that cannot arrive
  • !41 SO_SNDTIMEO was stored by setsockopt and read by nothing, so every blocking send wait was
    infinite

Fixes: Crash Time 4 (3+ player races, and the host freezing when a client leaves).

Title Servers (XLSP)

  • !32 XLSP was stubbed out, so a Title that reaches its dedicated servers through it could not
    connect → bridge a dial to a declared secure-gateway port onto a real TCP connection. Configured
    per Title in XLiveLessNess/xlln-xlsp/*.json, matched on the running title id, and inert unless
    an entry matches. The backend's close surfaces to the Title as EOF, so read-until-close
    responses terminate
  • !32 XN_LIVE_CONNECTIONCHANGED was dropped when it was raised before the Title created its
    listener → retain it on zero listeners, so a Title that signs in first still learns it is online
  • !32 A second XLiveUninitialize waited on the GetCurrentProcess() pseudo-handle, which is the same
    value as INVALID_HANDLE_VALUE, and blocked until the process exits — with nothing logged. Each
    window teardown is now guarded on its own destroy event
  • !32 Config paths are resolved while the working directory is still the game root, because a Title
    can change it after startup and break every later config-relative lookup

Fixes: Section 8: Prejudice, Crash Time 4 ("Online" greyed out).

Achievements and Stats

  • !19 Stats a Title writes are now kept, persisted per title and user to stats.dat, and served back
    on XUserReadStats. The file is written to a temp name and swapped in, so a crash or a full disk
    leaves the previous stats.dat intact
  • !19 View and column names are resolved from the SPA's embedded XLAST project, and an XLLN
    debug Stats window lists every declared stat per view and can view or edit stored values
  • !19 HexStrToByteArray read overlapping character pairs, kept only the low nibble of each byte and
    accepted a-z/A-Z beyond the hex range. This also affected xcontent's contentId config parsing
  • !31 XSessionWriteStats now validates every view before storing any, so a rejected call leaves
    nothing applied
  • !31 XllnStatsResolveColumnId resolved a system-scope column onto an unrelated title cell, since
    the two share their low id bits
  • !31 Two Stats window defects: the selected row is restored by stat identity across a repaint that
    a write from the Title thread triggers mid-edit, and the previous brush is restored before
    DeleteObject, which refuses a brush selected into the DC
  • !30 An empty SPA string table entry is legal, but MultiByteToWideChar reports a zero byte count as
    failure, which abandoned the whole SPA file and took the stats schema with it
  • !30 The XSRC offset and length were used unchecked and the XVC2 guard compared a signed pointer
    difference as an unsigned length, so a stale or hand-edited resource faulted inside the parse at
    startup. The property bitmap skip could also wrap a 32 bit size to zero and walk arbitrary bytes
  • !30 XUserCreateAchievementEnumerator resolved an explicit XUID against the remote username map
    alone, where a signed-in user never appears, so an instance could not enumerate its own player

Fixes: FlatOut Ultimate Carnage, Battlestations Pacific.

Addressing and Lifecycle

  • !37 XNetDnsLookup dereferenced *xndns without allocating it, faulting for a Title that passes a
    zeroed out-parameter. It also strided the address array as IN_ADDR[8] per entry, and returned
    WSAGetLastError() even on success instead of reporting the outcome in iStatus
  • !30 XNetUnregisterKey entered the QoS listener lock where it meant to release it, holding it for
    the life of the process whenever a key was not registered
  • !35 XUserCheckPrivilege rejected XUSER_INDEX_ANY as an out of range user index

Fixes: Operation Flashpoint: Red River.

Build, Tooling and CI

  • The XLLN-Module loader entry point code-cave now works on .NET executables (4ea82d8). A mixed-mode
    managed Title is entered through mscoree.dll's _CorExeMain, which the previous cave missed
  • Logging noise: GetLocalChatData warned whenever a Title passed a voice buffer larger than the most
    packets that can be produced, which is allowed and already handled. A Title polling voice chat
    per frame filled nine tenths of the log with it (!36)

XLLN-Modules

  • Quick-Patch Crash Time 4 - run multiple instances concurrently, and let the launcher start a
    Title while another Title runs. Covers CrashTime4Hi.exe and CrashTime4Low.exe
  • Quick-Patch DiRT 2 - run multiple instances concurrently. Covers the Shipped and Patch 1
    versions of dirt2_game.exe
  • Quick-Patch DiRT 3 - run multiple instances concurrently
  • Quick-Patch Kane & Lynch: Dead Men - run multiple instances concurrently. As well as the
    mutex, the Title creates its six render hand-off events with a plain name, so every process in
    the session shared one event per name. An auto reset event releases a single waiter, so one
    instance took the wake up owed to another and both stopped

XLLN-Hub v1.4.2.1

  • Hub !5 Packet forwarding was gated on the Title's version rather than the XLLN version, so the
    hub refused to forward for Titles it should have served

Don't miss a new xlivelessness release

NewReleases is sending notifications on new releases.