diff -Nru trem901-original-wraths/src/game/g_active.c trem901-original-wraths-mod/src/game/g_active.c
--- trem901-original-wraths/src/game/g_active.c	2007-07-15 09:04:09.000000000 +0200
+++ trem901-original-wraths-mod/src/game/g_active.c	2007-07-15 11:08:08.000000000 +0200
@@ -194,12 +194,28 @@
 static void G_ClientShove( gentity_t *ent, gentity_t *victim )
 {
   vec3_t  dir, push;
-  int entMass = 200, vicMass = 200;
+  int entMass = 200, vicMass = 200 , shove;
 
   // shoving enemies changes gameplay too much
   if( !OnSameTeam( ent, victim ) )
     return;
 
+  if ( g_shove.value < 0 )
+  {
+    if ( ( victim->client->ps.weapon >= WP_ABUILD ) &&
+         ( victim->client->ps.weapon <= WP_HBUILD ) &&
+         ( victim->client->ps.stats[ STAT_BUILDABLE ] != BA_NONE ) )
+      return;
+    else
+      shove = - g_shove.value;
+  }
+  else if ( g_shove.value > 0 )
+  {
+    shove = g_shove.value;
+  }
+  else
+    return;
+
   // alien mass is directly related to their health points
   // human mass is 200, double for bsuit  
   if( ent->client->pers.teamSelection == PTE_ALIENS )
@@ -235,7 +251,7 @@
     return;
 
   VectorScale( dir,
-    ( g_shove.value * ( ( float )entMass / ( float )vicMass ) ), push );
+    ( shove * ( ( float )entMass / ( float )vicMass ) ), push );
   VectorAdd( victim->client->ps.velocity, push,
                 victim->client->ps.velocity );
 
