Fix exploit that spawns partially built units out of external factories on transfer #6701
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.
Issue
First reported by @4z0t.
Units currently building in an external factory are attached indirectly, so the engine's usual army transfer behavior for standard factories doesn't destroy those units, and instead the unbuilt units are spawned as damaged units. In other words you can have an unit building in an external factory, transfer it to another player, and the unbuilt unit would respawn as a built but damaged unit for the other army.
spawn.units.exploit.mp4
Description of the proposed changes
In the SimUtils transfer function, before using the engine
ChangeUnitArmyfunction, destroy the building unit in the external factory if it exists. All user transfers go through here, as well as all the share on death type of transfers. Some scenario or AI utils don't, but they don't seem to be an issue with this specific exploit.Testing done on the proposed changes
You can no longer spawn built units from transferring external factories with unbuilt units.
spawn.units.exploit.fixed.mp4
Checklist