diff -ru old/src/game/g_client.c new/src/game/g_client.c
--- old/src/game/g_client.c	2007-06-24 00:05:50.000000000 +0200
+++ new/src/game/g_client.c	2007-06-24 00:42:58.000000000 +0200
@@ -96,13 +96,21 @@
     {
       if( client->ps.persistant[ PERS_CREDIT ] >= ALIEN_MAX_KILLS &&
           credit > 0 )
+	  {
+        if( g_autoDonate.integer )
+          G_Donate(client, credit);
         return;
+	  }
     }
     else if( client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
     {
       if( client->ps.persistant[ PERS_CREDIT ] >= HUMAN_MAX_CREDITS &&
           credit > 0 )
+	  {
+        if( g_autoDonate.integer )
+          G_Donate(client, credit);
         return;
+	  }
     }
   }
 
@@ -113,12 +121,20 @@
     if( client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS )
     {
       if( client->ps.persistant[ PERS_CREDIT ] > ALIEN_MAX_KILLS )
+      {
+        if( g_autoDonate.integer )
+          G_Donate(client, client->ps.persistant[ PERS_CREDIT ] - ALIEN_MAX_KILLS);
         client->ps.persistant[ PERS_CREDIT ] = ALIEN_MAX_KILLS;
+      }
     }
     else if( client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
     {
       if( client->ps.persistant[ PERS_CREDIT ] > HUMAN_MAX_CREDITS )
+      {
+        if( g_autoDonate.integer )
+          G_Donate(client, client->ps.persistant[ PERS_CREDIT ] - HUMAN_MAX_CREDITS);
         client->ps.persistant[ PERS_CREDIT ] = HUMAN_MAX_CREDITS;
+      }
     }
   }
 
Seulement dans new/src/game: .g_client.c.swp
diff -ru old/src/game/g_local.h new/src/game/g_local.h
--- old/src/game/g_local.h	2007-06-24 00:05:50.000000000 +0200
+++ new/src/game/g_local.h	2007-06-24 00:06:29.000000000 +0200
@@ -1134,6 +1134,7 @@
 extern  vmCvar_t  g_allowShare;
 extern  vmCvar_t  g_allowDonate;
 extern  vmCvar_t  g_grangerMode;
+extern  vmCvar_t  g_autoDonate;
 extern  vmCvar_t  g_enableDust;
 extern  vmCvar_t  g_enableBreath;
 extern  vmCvar_t  g_singlePlayer;
diff -ru old/src/game/g_main.c new/src/game/g_main.c
--- old/src/game/g_main.c	2007-06-24 00:05:50.000000000 +0200
+++ new/src/game/g_main.c	2007-06-24 00:43:38.000000000 +0200
@@ -154,6 +154,7 @@
 
 vmCvar_t  g_allowShare;
 vmCvar_t  g_allowDonate;
+vmCvar_t  g_autoDonate;
 
 vmCvar_t  g_grangerMode;
 
@@ -310,6 +311,7 @@
   { &wbpguid, "wbpguid", "", CVAR_ARCHIVE, 0, qfalse },
   
   { &g_allowDonate, "g_allowDonate", "1", CVAR_ARCHIVE, 0, qfalse},
+  { &g_autoDonate, "g_autoDonate", "1", CVAR_ARCHIVE, 0, qfalse},
   { &g_allowShare, "g_allowShare", "1", CVAR_ARCHIVE, 0, qfalse},
   { &g_grangerMode, "g_grangerMode", "0", 0, 0, qfalse }
 };
@@ -2460,3 +2462,94 @@
   }
 }
 
+/*
+ =================
+G_Donate
+
+Alms for the poor
+=================
+*/
+
+void G_Donate( gclient_t *client, short value )
+{
+  char type[10];
+  int i, divisor, portion, new_credits, total=0,
+    *amounts, max, i_cl = 0;
+  qboolean donated = qtrue;
+
+  if( client->pers.teamSelection == PTE_ALIENS )
+  {
+    divisor = level.numAlienClients-1;
+    max = ALIEN_MAX_KILLS;
+    Q_strncpyz(type, "evo(s)", 10);
+  }
+  else if( client->pers.teamSelection == PTE_HUMANS )
+  {
+    divisor = level.numHumanClients-1;
+    max = HUMAN_MAX_CREDITS;
+    Q_strncpyz(type, "credit(s)", 10);
+  }
+  else
+    return;
+
+  if( divisor < 1 )
+    return;
+
+  if( value <= 0)
+    return;
+
+  if( value > client->ps.persistant[ PERS_CREDIT ] )
+    value = client->ps.persistant[ PERS_CREDIT ];
+
+  // allocate memory for distribution amounts
+  amounts = G_Alloc( level.maxclients * sizeof( int ) );
+
+  for( i = 0; i < level.maxclients; i++ )
+  {
+    if(level.clients + i == client)
+      i_cl = i;
+    amounts[ i ] = 0;
+  }
+
+  // determine donation amounts for each client
+  total = value;
+  while( donated && value ) {
+    donated = qfalse;
+    portion = value / divisor;
+    if( portion < 1 ) portion = 1;
+    for( i = 0; i < level.maxclients; i++ )
+      if( level.clients[ i ].pers.connected == CON_CONNECTED &&
+           client != level.clients + i &&
+           level.clients[ i ].pers.teamSelection ==
+           client->pers.teamSelection ) {
+        new_credits = level.clients[ i ].ps.persistant[ PERS_CREDIT ] + portion;
+        amounts[ i ] = portion;
+        if( new_credits > max ) {
+          amounts[ i ] -= new_credits - max;
+          new_credits = max;
+        }
+        if( amounts[ i ] ) {
+          level.clients[ i ].ps.persistant[ PERS_CREDIT ] = new_credits;
+          donated = qtrue;
+          value -= amounts[ i ];
+          if( value < portion ) break;
+        }
+      }
+  }
+
+  // transfer funds
+  G_AddCreditToClient( client, value - total, qtrue );
+  for( i = 0; i < level.maxclients; i++ )
+    if( amounts[ i ] ) {
+      trap_SendServerCommand( i,
+        va( "print \"%s^7 donated %d %s to you, don't forget to say 'thank you'!\n\"",
+        client->pers.netname, amounts[ i ], type ) );
+    }
+
+  G_Free( amounts );
+
+  trap_SendServerCommand( i_cl,
+    va( "print \"Donated %d %s to the cause.\n\"",
+    total-value, type ) );
+}
+
