Fix local player pointer randomly becoming corrupted after spawning an item#45
Open
yyy257 wants to merge 3 commits intoxtreme8000:masterfrom
Open
Fix local player pointer randomly becoming corrupted after spawning an item#45yyy257 wants to merge 3 commits intoxtreme8000:masterfrom
yyy257 wants to merge 3 commits intoxtreme8000:masterfrom
Conversation
Owner
|
Good spot! I think the best solution here would be to only store |
…ed around in memory
Author
|
I also think that's a good idea, so I implemented it in a commit. It might not be the best implementation, but it seems to work - I hope it will be useful. This could even save memory, as dictionaries may use a temp array relative to the dictionary's size while resizing. To reproduce the bug, I dug a lot of blocks without picking them up until the player data became corrupted. I could also reliably trigger it with the code in my fork that drops all items upon death. |
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.
Client-side entitites are tracked with an M*LIB dictionary, and inserting a new entity can shuffle other entities around in memory, including the local player:
Therefore, insertion of a new entity can randomly make
gstate.local_playerpoint to garbage data, usually getting the player stuck at X=0, Y=0 and Z=0, sometimes ending in a segmentation fault.To fix it, I added a variable separate from the entity dictionary which tracks the local player ID, allowing updating
gstate.local_playerafter spawning a new entity. As long as the game is singleplayer, the local player ID is always 0, but the variable may be useful when multiplayer is added.