Repository navigation
Conversation
The loading/transition flag at SClient+0x1198 was read as a uint32. In client.exe the field is a bool: every access is a byte move (5 reads, 3 writes), and +0x1199..+0x119B are padding the client never writes. When that padding holds stale heap data the flag never reads as zero, so a pilot who is in game is treated as still loading: the in-game Client Manager tab, add-on overlays, Auto Pilot and the other features gated on LoadingOrTransitionFlag == 0 never appear. Read one byte in ClientSessionObserver and ClientNavigationStateObserver (the same field, FrameProcessingGateFlag). The model types stay uint. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
dan51588
marked this pull request as ready for review
October 29, 2026 06:38
Contributor
Author
|
Superseded by #2 (the same commit, opened from a topic branch). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
With some clients, every pilot stays "loading" from Net7 Client Manager's point of view even though they are in game. The observed lifecycle is
in_game, butLoadingOrTransitionFlagnever reads as zero. Everything gated on that flag stays off:ClientHostForm.ApplyAddonPresentationStateneeds!isTransitioning)Cause
ClientSessionObserverreads SClient+0x1198as auint32(andClientNavigationStateObserverreads the same field asFrameProcessingGateFlag). Inclient.exethat field is a one-bytebool. The bytes at+0x1199..+0x119Bare struct padding before astd::stringat+0x119C. The client never writes them, so they hold whatever the memory held before SClient was constructed.Evidence from the client
client.exe(8,642,625 bytes, SHA-256249f852496f341c00361be95b66e7c0becc2c39e7cba026f9227e38b602651c4). Every instruction in.textwith displacement0x1198is a byte access. There are no 16- or 32-bit loads, stores or compares of the field:0x740621c6 86 98 11 00 00 01mov byte [esi+0x1198], 10x7405E0): starts astrue0x737d45c6 86 98 11 00 00 01mov byte [esi+0x1198], 10x745160c6 81 98 11 00 00 00mov byte [ecx+0x1198], 00x745160, called from the START packet handler (0x733440): cleared when the sector starts0x742b918a 86 98 11 00 00mov al, byte [esi+0x1198]SClient::Do_Frame(0x742B60): on a dead connection0x742d248a 86 98 11 00 00mov al, byte [esi+0x1198]Do_Frame: skips the per-object aux-data aging step while set0x742f338a 86 98 11 00 00mov al, byte [esi+0x1198]Do_Frame: skipsSClient::Process_AI(0x744260) and the view update while set0x7447a28a 86 98 11 00 00mov al, byte [esi+0x1198]0x744690)0x50cafe8a 88 98 11 00 00mov cl, byte [eax+0x1198]+0x0C): returnsMainView::Render_Initializingwhile setThis matches the name the manager already uses. The flag is
truefrom construction and after a sector handoff until START arrives, and the client itself skips simulation and draws its loading view while it is set.The layout, as recovered from a reconstruction of the client's source from this binary:
Observed on live clients
Read from live clients that were in game and actively playing, with every in-game overlay hidden:
uint32at+0x11980x3EA301000001 A3 3E0x3F0022000022 00 3F0xBEE1DB0000DB E1 BE0x3D9DEA0000EA 9D 3DThe flag byte is
00(in game) on every client. The padding is stale data, which happens to look like the top bytes of small floats. Whether the padding is zero depends on what that heap block held before, so the bug can come and go between machines, sessions and client start-up paths.Fix
ProcessMemoryReader.TryReadByte: a one-byte read on top ofTryReadBytes.ClientSessionObserverandClientNavigationStateObserverread the field with it.uint, so nothing downstream changes. A client whose padding happens to be zero behaves exactly as before.Testing
dotnet build Net7ClientManager.slnx: 0 errors, no new analyzer warnings.🤖 Generated with Claude Code