bg_pmove.c:892
pm->maxs[2] = pm->ps->maxs[2] - pm->ps->standViewHeight - PRONE_VIEWHEIGHT;
this comes out to 48 - 40 -(-8) = 16
crouch goes like this:
g_client.c:2003
client->ps.crouchMaxZ = client->ps.maxs[2] - (client->ps.standVi ewHeight - client->ps.crouchViewHeight);
which comes out to 48 - (40 - 16) = 24
Notice the difference in grouping of an otherwise similar expression.
Note that the player bbox always exetends to -24 in z. Dead players also use the crouch value.
(yes, I know etpro and shrub fix the above)
Another mystery is why crouchMaxZ is in player state. It never changes, AFAIK.