diff -Nru -x .svn -x build -x build-linux-x86 -x q3asm -x q3cpp -x q3lcc -x q3rcc -x '*.orig' -x '*.rej' org/src/game/bg_public.h work/src/game/bg_public.h
--- org/src/game/bg_public.h	2007-05-30 22:05:26.000000000 +0200
+++ work/src/game/bg_public.h	2007-05-30 22:54:20.000000000 +0200
@@ -882,7 +882,9 @@
 
   MOD_ASPAWN,
   MOD_ATUBE,
-  MOD_OVERMIND
+  MOD_OVERMIND,
+
+  MOD_SLAP
 } meansOfDeath_t;
 
 
diff -Nru -x .svn -x build -x build-linux-x86 -x q3asm -x q3cpp -x q3lcc -x q3rcc -x '*.orig' -x '*.rej' org/src/game/g_admin.c work/src/game/g_admin.c
--- org/src/game/g_admin.c	2007-05-30 22:05:26.000000000 +0200
+++ work/src/game/g_admin.c	2007-05-30 22:50:18.000000000 +0200
@@ -159,6 +159,11 @@
       "(^5start at ban#^7)"
     },
 
+    {"slap", G_admin_slap, "x",
+      "assert your authoritay!",
+      "[^3name|slot^7] (damage)"
+    },
+
     {"spec999", G_admin_spec999, "P",
       "move 999 pingers to the spectator team",
       ""},
@@ -1623,7 +1628,135 @@
   }
   return qtrue;
 }   
-  
+
+qboolean G_admin_slap( gentity_t *ent, int skiparg )
+{
+  int pids[ MAX_CLIENTS ], damage = 0;
+  char name[ MAX_NAME_LENGTH ], err[ MAX_STRING_CHARS ],
+    command[ MAX_ADMIN_CMD_LEN ], *cmd;
+  gentity_t *vic;
+  vec3_t dir;
+
+  if( level.intermissiontime ) return qfalse;
+
+  if( G_SayArgc() < 2 + skiparg )
+  {
+    ADMP( "^3!slap: ^7usage: slap [name|slot#]\n" );
+    return qfalse;
+  }
+  G_SayArgv( skiparg, command, sizeof( command ) );
+  cmd = command;
+  if( cmd && *cmd == '!' )
+    cmd++;
+  G_SayArgv( 1 + skiparg, name, sizeof( name ) );
+  if( G_ClientNumbersFromString( name, pids ) != 1 )
+  {
+    G_MatchOnePlayer( pids, err, sizeof( err ) );
+    ADMP( va( "^3!slap: ^7%s\n", err ) );
+    return qfalse;
+  }
+  if( !admin_higher( ent, &g_entities[ pids[ 0 ] ] ) )
+  {
+    ADMP( "^3!slap: ^7sorry, but your intended victim has a higher admin"
+        " level than you\n" );
+    return qfalse;
+  }
+  vic = &g_entities[ pids[ 0 ] ];
+
+  // cant slap spectators
+  if( vic->client->pers.teamSelection == PTE_NONE ||
+      vic->client->pers.classSelection == PCL_NONE ) {
+    ADMP( "^3!slap: ^7can't slap thin air\n" );
+    return qfalse;
+  }
+
+  // cant slap console?
+  if( !vic ) {
+    ADMP( "^3!slap: ^7bad target\n" );
+    return qfalse;
+  }
+
+  // knockback in a random direction
+  dir[0] = crandom();
+  dir[1] = crandom();
+  dir[2] = random();
+  if( (g_slapKnockback.integer) && vic->client )
+  {
+    vec3_t  ndir;
+    vec3_t  kvel;
+    float   mass;
+
+    mass = 200;
+
+    // Normalize (g_slapKnockback.integer)
+    VectorCopy( dir, ndir );
+    VectorNormalize( ndir );
+
+    // Halve (g_slapKnockback.integer) for bsuits
+    if( vic->client &&
+        vic->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS &&
+        BG_InventoryContainsUpgrade( UP_BATTLESUIT, vic->client->ps.stats ) )
+      mass += 400;
+
+    // Halve (g_slapKnockback.integer) for crouching players
+    if(vic->client->ps.pm_flags&PMF_DUCKED) (g_slapKnockback.integer) /= 2.f;
+
+    VectorScale( ndir, g_knockback.value * (g_slapKnockback.integer) / mass, kvel );
+    VectorAdd( vic->client->ps.velocity, kvel, vic->client->ps.velocity );
+
+    // set the timer so that the other client can't cancel
+    // out the movement immediately
+    if( !vic->client->ps.pm_time )
+    {
+      int   t;
+
+      t = (g_slapKnockback.integer) * 2;
+      if( t < 50 )
+        t = 50;
+
+      if( t > 200 )
+        t = 200;
+
+      vic->client->ps.pm_time = t;
+      vic->client->ps.pm_flags |= PMF_TIME_KNOCKBACK;
+    }
+  }
+
+  if( vic != ent )
+    trap_SendServerCommand( vic-g_entities,
+      va( "cp \"%s^7 is not amused\n\"",
+      ent ? ent->client->pers.netname : "console" ) );
+
+  if( g_slapDamage.integer > 0 ) {
+
+    // !slap (name) [damage] syntax
+    if( G_SayArgc() > 2 + skiparg ) {
+      char dmg_str[ MAX_STRING_CHARS ];
+      G_SayArgv( 2 + skiparg, dmg_str, sizeof( dmg_str ) );
+      damage = atoi(dmg_str);
+      if( damage < 0 ) damage = 0;
+    } else {
+      if( g_slapDamage.integer > 100 ) g_slapDamage.integer = 100;
+      damage = BG_FindHealthForClass( vic->client->ps.stats[ STAT_PCLASS ] ) *
+        g_slapDamage.integer / 100;
+      if( damage < 1 ) damage = 1;
+    }
+
+    vic->health -= damage;
+    vic->client->ps.stats[ STAT_HEALTH ] = vic->health;
+    vic->lastDamageTime = level.time;
+    if( vic->health <= 0 )
+    {
+      vic->flags |= FL_NO_KNOCKBACK;
+      vic->enemy = &g_entities[ pids[ 0 ] ];
+      vic->die( vic, 0, 0, damage, MOD_SLAP );
+    } else if( vic->pain ) vic->pain( vic, &g_entities[ pids[ 0 ] ], damage );
+  }
+
+  return qtrue;
+}
+ 
+
 qboolean G_admin_kick( gentity_t *ent, int skiparg )
 {
   int pids[ MAX_CLIENTS ];
diff -Nru -x .svn -x build -x build-linux-x86 -x q3asm -x q3cpp -x q3lcc -x q3rcc -x '*.orig' -x '*.rej' org/src/game/g_admin.h work/src/game/g_admin.h
--- org/src/game/g_admin.h	2007-05-30 22:05:26.000000000 +0200
+++ work/src/game/g_admin.h	2007-05-30 22:22:27.000000000 +0200
@@ -146,6 +146,7 @@
 // ! command functions
 qboolean G_admin_time( gentity_t *ent, int skiparg );
 qboolean G_admin_setlevel( gentity_t *ent, int skiparg );
+qboolean G_admin_slap( gentity_t *ent, int skiparg );
 qboolean G_admin_woolball( gentity_t *ent, int skiparg );
 qboolean G_admin_kick( gentity_t *ent, int skiparg );
 qboolean G_admin_ban( gentity_t *ent, int skiparg );
diff -Nru -x .svn -x build -x build-linux-x86 -x q3asm -x q3cpp -x q3lcc -x q3rcc -x '*.orig' -x '*.rej' org/src/game/g_combat.c work/src/game/g_combat.c
--- org/src/game/g_combat.c	2007-05-30 22:05:26.000000000 +0200
+++ work/src/game/g_combat.c	2007-05-30 22:23:17.000000000 +0200
@@ -117,7 +117,9 @@
 
   "MOD_ASPAWN",
   "MOD_ATUBE",
-  "MOD_OVERMIND"
+  "MOD_OVERMIND",
+
+  "MOD_SLAP"
 };
 
 /*
diff -Nru -x .svn -x build -x build-linux-x86 -x q3asm -x q3cpp -x q3lcc -x q3rcc -x '*.orig' -x '*.rej' org/src/game/g_local.h work/src/game/g_local.h
--- org/src/game/g_local.h	2007-05-30 22:05:27.000000000 +0200
+++ work/src/game/g_local.h	2007-05-30 22:10:34.000000000 +0200
@@ -1181,6 +1181,9 @@
 
 extern  vmCvar_t  g_privateMessages;
 
+extern  vmCvar_t  g_slapKnockback;
+extern  vmCvar_t  g_slapDamage;
+
 extern  vmCvar_t  g_hiddenClients;
 
 extern  vmCvar_t  g_dretchPunt;
diff -Nru -x .svn -x build -x build-linux-x86 -x q3asm -x q3cpp -x q3lcc -x q3rcc -x '*.orig' -x '*.rej' org/src/game/g_main.c work/src/game/g_main.c
--- org/src/game/g_main.c	2007-05-30 22:05:27.000000000 +0200
+++ work/src/game/g_main.c	2007-05-30 22:19:25.000000000 +0200
@@ -138,6 +138,9 @@
 
 vmCvar_t  g_privateMessages;
 
+vmCvar_t  g_slapKnockback;
+vmCvar_t  g_slapDamage;
+
 vmCvar_t  g_tag;
 
 vmCvar_t  g_hiddenClients;
@@ -276,6 +279,9 @@
   { &g_adminTempBan, "g_adminTempBan", "120", CVAR_ARCHIVE, 0, qfalse  },
   
   { &g_privateMessages, "g_privateMessages", "1", CVAR_ARCHIVE, 0, qfalse  },
+
+  { &g_slapKnockback, "g_slapKnockback", "200", CVAR_ARCHIVE, 0, qfalse},
+  { &g_slapDamage, "g_slapDamage", "5", CVAR_ARCHIVE, 0, qfalse},
   
   { &g_tag, "g_tag", "main", CVAR_INIT, 0, qfalse },
 
