Some code is redundant, instead of do many loops depending on @*** argument, use get_players with appropriated flags and do only 1 loop.
You could make a function so freeze/unfreeze a player in which you would set flags, bit, and store angles.
If you do so, at the end of the function, you could check if PreThink forward needs to be registered or not, this is just a suggestion, but FM allows to enable/disable forwards ;)