Excerpt from functions_f_jets\Functions\Ejection\fn_planeEjection.sqf:
//deploy parachute if (isPlayer _pilot) then { disableUserInput true; }; private _parachute = createvehicle [_ejectionParachute,getPos _ejectionSeat,[],0,"CAN_COLLIDE"]; _parachute setPosWorld (_ejectionSeat modelToWorldWorld [0,0,2.5]); _parachute setDir getDir _ejectionSeat; waitUntil { _pilot moveInDriver _parachute; _pilot in _parachute }; if !(_pilot in _parachute) then { _pilot moveInDriver _parachute; }; _parachute lock 2; sleep 1; //to make sure parachute is locked and player cannot use Get Out ;( if (isPlayer _pilot) then { disableUserInput false; };
In the code above, user input is disabled before parachute deployment, and re-enabled afterwards. However, sometimes the parachute spawns in a bugged state and moveInDriver fails on every attempt. This causes the script to stays stuck in the waitUntil loop indefinitely, preventing the user from regaining input, requiring to terminate the game. A simple workaround is adding a 2-second timeout to waitUntil:
_time = time; waitUntil { _pilot moveInDriver _parachute; _pilot in _parachute || time - _time > 2 };
Never create a synchronous wait condition without a timeout.