>           struct player_s2_spacket *pa2 = (struct player_s2_spacket *) sbuf;
>           x = SCALE * ntohs(pa2->x);
>           y = SCALE * ntohs(pa2->y);
> If you also change the clients to treat the data in the SP2 struct as
> signed instead of unsigned, then you get:
> data sent in SP2 packet = 0xf63d = -2499
> client interpertation of SP2 data = -99960
> Close, but still different.
Yup I also changed client from ntohs to (short) ntohs.  -99960 is
good enough imo, would be better if it was -100000 but I don't see
how to do that.  Probably a rounding thing.  There are several
places in the client (COW, netrekxp at least) where it looks for negative
player position as determining factor whether to redraw screen or not.
Most noticeable for observers locked onto a player who dies - with short
packets on, the observer gets constant redraws due to xpos > 0, with long
packets, client stops redrawing due to xpos = -100000.  Yes it also
requires a client change to receive the signed position correctly, and
yes the client could be changed to check both x upper bound as well as
lower bound - but getting completely wrong position is still something
that should be fixed, imho.
For older clients without the corresponding client change, they will still
get the way wrong positive xpos as you said.  But for newer clients this
gives a chance to actually get negative pos values.