Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Workaround CS:GO Stringtable bug #1046

Merged
merged 1 commit into from
Jul 19, 2019
Merged

Workaround CS:GO Stringtable bug #1046

merged 1 commit into from
Jul 19, 2019

Conversation

asherkin
Copy link
Member

The cause of the infamous "Index error writing string table baseline"
error appears to be a timing issue between the engine's network message
processing, the stringtable encoding, and command processing when adding
stringtable entries in OnConfigsExecuted.

When the first client connects the map is re-loaded which causes a full
refresh, the game's stringtable entries are added at tick 65, the client
connection is registered at tick 66, and stringtable entries added in
OnConfigsExecuted are registered as being added in tick 67. The engine
later calls WriteBaselines with the client's signon tick, and neglects
to encode the SM added entries as it considers them from the future.

To avoid this, always pass INT_MAX as the current tick when encoding
the baseline, so all stringtable entries are included regardless of when
they were added. Tested on both Windows and Linux.

The cause of the infamous "Index error writing string table baseline"
error appears to be a timing issue between the engine's network message
processing, the stringtable encoding, and command processing when adding
stringtable entries in OnConfigsExecuted.

When the first client connects the map is re-loaded which causes a full
refresh, the game's stringtable entries are added at tick 65, the client
connection is registered at tick 66, and stringtable entries added in
OnConfigsExecuted are registered as being added in tick 67. The engine
later calls WriteBaselines with the client's signon tick, and neglects
to encode the SM added entries as it considers them from the future.

To avoid this, always pass INT_MAX as the current tick when encoding
the baseline, so all stringtable entries are included regardless of when
they were added. Tested on both Windows and Linux.
@peace-maker
Copy link
Member

Are you sure there are no side effects from always passing INT_MAX instead of only for the first client?

@asherkin
Copy link
Member Author

It’s definitely fine, for later clients their signon tick is already far in the future than the added entries.

@KyleSanderson
Copy link
Member

KyleSanderson commented Jul 19, 2019

Can we get this in cstrike?

Copy link
Member

@Drifter321 Drifter321 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

Copy link
Member

@Headline Headline left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice

@asherkin
Copy link
Member Author

Can we get this in cstrike?

As far as I know CS:GO is the only engine branch with this delta stringtable encoding, all the older games unconditionally send the entire table on signon and never again.

@asherkin asherkin merged commit fcafd07 into master Jul 19, 2019
@KyleSanderson
Copy link
Member

Can we get this in cstrike?

As far as I know CS:GO is the only engine branch with this delta stringtable encoding, all the older games unconditionally send the entire table on signon and never again.

Which is why it should have been in cstrike ;-).

@Headline Headline deleted the csgo-stringtable branch July 21, 2019 06:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants