sent in updateSelf.  As for the packet order, I am pretty sure that
sndPStatus (which is called from updateShips) is sent before sndSelf
(which is called from updateSelf), as I could monitor client-side that
your status is changed 1 update before your whydead is updated.  However,
I cannot find the exact line(s) of code where this order is determined.
It might be in the fatten packet part of the UDP code.  I know the packets
are ordered by type via packets.h, but then the flushsockbuf function
starts stuffing packets in that fit, so I really am lost as to packet
order.

I do know that in the sndSelf function, when whydead changes, it is sent
high priority by TCP rather than UDP.  And I tested this patch to see that
indeed, whydead is sent for observers on geno.
>
> 1.  if the code is meant to do the same thing, add a new static
> function, such as sp_s_you_criticality() or something, and call that
> function from both places that do this same thing ... this is called
> factoring,
>
Yes it is meant to do the same thing, I can factorize it, however there is
one line I am not sure of.  In the updateSelf function, the way it
determines whether to use sndSelf or sndSSelf is by the following:

if(send_short &&  me->p_fuel < 61000  ) { /* A little margin ... */

I am not sure why it looks at fuel, whereas for other places in the code
it just checks send_short.

> It might also be time to make 0x40 and 0x80 more formally declared.
> Interesting that it causes server packets to be restricted to 0-63 type
> codes, wasting bits in the type char.  Perhaps some day we should change
> sendClientPacket to remove this prioritisation overload.
>
Regarding the semicritical packets (0x40), I can't figure out how the
sendSC function works either :).  Specifically, what line checks to send
the packet only if sequence number is 0x40?