fix: don't try to add/remove components of despawned entities #23
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.
suppose you have some component
FooComponent
andBarComponent
and you have a system like this:What now happens is both the remove and the despawn operation will be enqueued because for the duration of the enumeration the table where the entity is located is locked. When the enumerator is disposed the queued operations will be executed in reverse, so the despawn operation is first. This will remove the entity from the table. Next the remove operation runs, but it runs on an entity that is no longer alive.
There is probably a reason why these operations are executed in reverse so I kept this. Also just changing execution order would break as well if the despawn came first and the remove came later. So I chose to add a check to
ApplyTableOperations
to ensure that both adding and removing of components is only attempted if the entity is alive at this point in time.