diff -Nru trem901-original-wraths-tmp2/src/game/g_admin.c trem901-original-wraths-tmp/src/game/g_admin.c
--- trem901-original-wraths-tmp2/src/game/g_admin.c	2007-08-18 06:54:59.000000000 +0200
+++ trem901-original-wraths-tmp/src/game/g_admin.c	2007-08-18 06:56:29.000000000 +0200
@@ -82,7 +82,7 @@
     
     {"listadmins", G_admin_listadmins, "D",
       "display a list of all server admins and their levels",
-      "(^5name|start admin#^7)"
+      "(^5name|start admin#^7) (^5minimum level to display^7)"
     },
     
     {"listlayouts", G_admin_listlayouts, "L",
@@ -759,7 +759,7 @@
   trap_FS_FCloseFile( f );
 }
 
-static int admin_listadmins( gentity_t *ent, int start, char *search )
+static int admin_listadmins( gentity_t *ent, int start, char *search, int minlevel )
 {
   int drawn = 0;
   char guid_stub[9];
@@ -818,59 +818,60 @@
 
   for( i = start; i < MAX_ADMIN_ADMINS && g_admin_admins[ i ]
     && drawn < MAX_ADMIN_LISTITEMS; i++ )
-  {
-    if( search[ 0 ] )
-    {
-      G_SanitiseName( g_admin_admins[ i ]->name, name );
-      if( !strstr( name, search ) )
-        continue;
+   if( g_admin_admins[ i ]->level >= minlevel ) 
+   {
+     if( search[ 0 ] )
+     {
+       G_SanitiseName( g_admin_admins[ i ]->name, name );
+       if( !strstr( name, search ) )
+         continue;
       
-      // verify we don't have the same guid/name pair in connected players
-      // since we don't want to draw the same player twice
-      dup = qfalse;
-      for( j = 0; j < level.maxclients; j++ )
-      {
-        vic = &g_entities[ j ];
-        if( !vic->client || vic->client->pers.connected != CON_CONNECTED )
-          continue;
-        G_SanitiseName( vic->client->pers.netname, name2 );
-        if( !Q_stricmp( vic->client->pers.guid, g_admin_admins[ i ]->guid )
-          && strstr( name2, search ) ) 
-        {
-          dup = qtrue;
-          break;
-        }
-      }
-      if( dup )
-        continue;
-    }
-    for( j = 0; j <= 8; j++ )
-      guid_stub[ j ] = g_admin_admins[ i ]->guid[ j + 24 ];
-    guid_stub[ j ] = '\0';
-   
-    lname[ 0 ] = '\0'; 
-    Q_strncpyz( lname_fmt, "%s", sizeof( lname_fmt ) );
-    for( j = 0; j < MAX_ADMIN_LEVELS && g_admin_levels[ j ]; j++ )
-    {
-      if( g_admin_levels[ j ]->level == g_admin_admins[ i ]->level )
-      {
-        G_DecolorString( g_admin_levels[ j ]->name, lname );
-        Com_sprintf( lname_fmt, sizeof( lname_fmt ), "%%%is",
-          ( admin_level_maxname + strlen( g_admin_levels[ j ]->name )
-            - strlen( lname ) ) );
-        Com_sprintf( lname, sizeof( lname ), lname_fmt,
-           g_admin_levels[ j ]->name );
-        break;
-      }
-    }
-    ADMBP( va( "%4i %4i %s^7 (*%s) %s^7\n",
-      ( i + MAX_CLIENTS ),
-      g_admin_admins[ i ]->level,
-      lname,
-      guid_stub,
-      g_admin_admins[ i ]->name ) );
-    drawn++;
-  }
+       // verify we don't have the same guid/name pair in connected players
+       // since we don't want to draw the same player twice
+       dup = qfalse;
+       for( j = 0; j < level.maxclients; j++ )
+       {
+         vic = &g_entities[ j ];
+         if( !vic->client || vic->client->pers.connected != CON_CONNECTED )
+           continue;
+         G_SanitiseName( vic->client->pers.netname, name2 );
+         if( !Q_stricmp( vic->client->pers.guid, g_admin_admins[ i ]->guid )
+           && strstr( name2, search ) ) 
+         {
+           dup = qtrue;
+           break;
+         }
+       }
+       if( dup )
+         continue;
+     }
+     for( j = 0; j <= 8; j++ )
+       guid_stub[ j ] = g_admin_admins[ i ]->guid[ j + 24 ];
+     guid_stub[ j ] = '\0';
+    
+     lname[ 0 ] = '\0'; 
+     Q_strncpyz( lname_fmt, "%s", sizeof( lname_fmt ) );
+     for( j = 0; j < MAX_ADMIN_LEVELS && g_admin_levels[ j ]; j++ )
+     {
+       if( g_admin_levels[ j ]->level == g_admin_admins[ i ]->level )
+       {
+         G_DecolorString( g_admin_levels[ j ]->name, lname );
+         Com_sprintf( lname_fmt, sizeof( lname_fmt ), "%%%is",
+           ( admin_level_maxname + strlen( g_admin_levels[ j ]->name )
+             - strlen( lname ) ) );
+         Com_sprintf( lname, sizeof( lname ), lname_fmt,
+            g_admin_levels[ j ]->name );
+         break;
+       }
+     }
+     ADMBP( va( "%4i %4i %s^7 (*%s) %s^7\n",
+       ( i + MAX_CLIENTS ),
+       g_admin_admins[ i ]->level,
+       lname,
+       guid_stub,
+       g_admin_admins[ i ]->name ) );
+     drawn++;
+   }
   ADMBP_end();
   return drawn;
 }
@@ -1496,7 +1497,7 @@
   {
     ADMP( "^3!setlevel:^7 more than one match.  Use the admin number "
       "instead:\n" );
-    admin_listadmins( ent, 0, name );
+    admin_listadmins( ent, 0, name, 0 );
     return qfalse;
   }
 
@@ -2103,22 +2104,40 @@
   int start = 0;
   qboolean numeric = qtrue;
   int drawn = 0;
+  int minlevel = 1;
 
   t = trap_RealTime( &qt );
+  
+  if( G_SayArgc() == 3 + skiparg )
+  {
+    G_SayArgv( 2 + skiparg, s, sizeof( s ) );
+    if( s[ 0 ] >= '0' && s[ 0] <= '9' )
+    {
+      minlevel = atoi( s );
+      if( minlevel < 1 ) 
+       minlevel = 1;
+    }
+  }
 
   for( i = 0; i < MAX_ADMIN_ADMINS && g_admin_admins[ i ]; i++ )
   {
-    if( g_admin_admins[ i ]->level == 0 )
-      continue;
-    found++;
+    if( g_admin_admins[ i ]->level >= minlevel )
+      found++;
   }
   if( !found )
   {
-    ADMP( "^3!listadmins: ^7no admins defined\n" );
+    if( minlevel > 1 )
+    {
+      ADMP( va( "^3!listadmins: ^7no admins level %i or greater found\n", minlevel ) );
+    }
+    else
+    {
+       ADMP( "^3!listadmins: ^7no admins defined\n" );
+    }
     return qfalse;
   }
 
-  if( G_SayArgc() == 2 + skiparg )
+  if( G_SayArgc() >= 2 + skiparg )
   {
     G_SayArgv( 1 + skiparg, s, sizeof( s ) );
     for( i = 0; i < sizeof( s ) && s[ i ]; i++ )
@@ -2142,31 +2161,42 @@
   if( start >= found || start < 0 )
     start = 0;
 
-  if( start >= found )
-  {
-    ADMP( va( "^3!listadmins: ^7listing %d admins\n", found ) );
-    return qfalse;
-  }
-
-  drawn = admin_listadmins( ent, start, search );
+  drawn = admin_listadmins( ent, start, search, minlevel );
 
   if( search[ 0 ] )
   {
-    ADMP( va( "^3!listadmins:^7 found %d admins matching '%s^7'\n",
-      drawn, search ) );
+    if( drawn <= 20 )
+    {
+      ADMP( va( "^3!listadmins:^7 found %d admins level %i or greater matching '%s^7'\n",
+        drawn, minlevel, search ) );
+    }
+    else
+    {
+      ADMP( va( "^3!listadmins:^7 found >20 admins level %i or greater matching '%s^7. Try a more narrow search.'\n",
+        minlevel, search ) );
+    }
   }
   else
   {
     ADMBP_begin();
-    ADMBP( va( "^3!listadmins:^7 showing admin %d - %d of %d.  ",
+    ADMBP( va( "^3!listadmins:^7 showing admins level %i or greater %d - %d of %d.  ",
+      minlevel,
       ( found ) ? ( start + 1 ) : 0,
       ( ( start + MAX_ADMIN_LISTITEMS ) > found ) ?
        found : ( start + MAX_ADMIN_LISTITEMS ),
       found ) );
     if( ( start + MAX_ADMIN_LISTITEMS ) < found )
     {
-      ADMBP( va( "run '!listadmins %d' to see more",
-        ( start + MAX_ADMIN_LISTITEMS + 1 ) ) );
+      if( minlevel > 1)
+      {
+        ADMBP( va( "run '!listadmins %d %d' to see more",
+          ( start + MAX_ADMIN_LISTITEMS + 1 ), minlevel ) );
+      }
+      else
+      {
+        ADMBP( va( "run '!listadmins %d' to see more",
+          ( start + MAX_ADMIN_LISTITEMS + 1 ) ) );
+      }
     }
     ADMBP( "\n" );
     ADMBP_end();
