I'm trying to implement a new feature in the client which will display a
playerlist without the observers, as well as another toggle to display a
playerlist with only observers.  Reason being, the large number of observers
on there now on servers can mess up the playerlist.

Sounded simple, but I cannot find a reliable way to determine on the client
if a player is an observer or not.

The reason is that sndPStatus() on the server wipes out this value.  I guess
because some older clients didn't know how to handle p_status > 4.

But is that still the case?  If this is no longer an issue, I'd like to
request applying the following patch, which basically rips out the observer
specific morphing from that function.

If not, can someone suggest an alternative?

I can't check if p_no > 16 because that is a bad assumption.
I could check to see if it had that little doohickey appended at the end,
but that's not reliable either as I see regular players using that character
in their names.

Patch to fix POBSERV status:
*** genspkt.bak Tue Nov  7 09:22:49 2000
--- genspkt.c   Tue May  8 21:08:54 2001
***************
*** 350,378 ****
        /* We update the location of people whose status has changed.
         * (like if they just re-entered...)
         */
- #ifdef OBSERVERS
-       int pobserv = 0;
- #endif
        pstatus->type=SP_PSTATUS;
        pstatus->pnum=pl->p_no;
        pstatus->status=pl->p_status;
- #ifdef OBSERVERS
-       /* Some clients do not know about POBSERV, so we mask it into a
-          known status ... for observers we tell them they are alive,
-          but for everybody else we say they are outfitting.  Quozl */
-       if (pl->p_status == POBSERV) {
-           if (pl == me)
-               pstatus->status = PALIVE;
-           else
-               pstatus->status = POUTFIT;
-           pobserv = 1;
-       }
- #endif
        /* S_P2 */
        if ( send_short < 2
- #ifdef OBSERVERS
-            || pobserv
- #endif
             || pl->p_no > 31
             || pl->p_flags & PFROBOT
             || pstatus->status != PALIVE
--- 350,360 ----
***************
*** 383,392 ****

            sendClientPacket(pstatus);
        if (dead_warp) dead_warp = 1;
- #ifdef OBSERVERS
-       if (pobserv)
-           pstatus->status = POBSERV;
- #endif
        return(TRUE);
      }
      return (FALSE);
--- 365,370 ----