diff -ru old/src/game/g_buildable.c new/src/game/g_buildable.c
--- old/src/game/g_buildable.c	2007-06-23 02:20:21.000000000 +0200
+++ new/src/game/g_buildable.c	2007-06-23 22:17:45.000000000 +0200
@@ -156,6 +156,68 @@
 
 /*
 ================
+G_FindGenerator
+
+return the nearest generator, or NULL if isn't
+================
+*/
+gentity_t* G_FindGenerator( buildableTeam_t team, vec3_t origin )
+{
+  gentity_t *ent;
+  gentity_t *closestPower = NULL;
+  int       distance = 0;
+  int       i;
+  int       minDistance = 10000;
+  int       main_generator = 0;
+
+  vec3_t    temp_v;
+
+  //iterate through entities
+  for ( i = 1, ent = g_entities + i; i < level.num_entities; i++, ent++ )
+  {
+    if( ent->s.eType != ET_BUILDABLE )
+      continue;
+
+    //if entity is a power item calculate the distance to it
+    if( ((( ent->s.modelindex == BA_H_REACTOR || ent->s.modelindex == BA_H_REPEATER ) && team == PTE_HUMANS) ||
+        ((ent->s.modelindex == BA_A_OVERMIND || ent->s.modelindex == BA_A_SPAWN ) && team == PTE_ALIENS )) &&
+        ent->spawned )
+    {
+      VectorSubtract( origin, ent->s.origin, temp_v );
+      distance = VectorLength( temp_v );
+
+      if(
+          (ent->powered &&
+           ent->s.modelindex == BA_H_REACTOR &&
+           distance <= REACTOR_BASESIZE ) ||
+          (ent->spawned &&
+           ent->s.modelindex == BA_A_OVERMIND &&
+           distance <= CREEP_BASESIZE) 
+        )
+      {
+          main_generator = 1;
+          closestPower = ent;
+          minDistance = distance;
+      }
+      else if( !main_generator && distance < minDistance && 
+          ((team == PTE_HUMANS && ent->powered ) ||
+           (team == PTE_ALIENS && ent->spawned )) &&
+          (( ent->s.modelindex == BA_H_REPEATER &&
+            distance <= REPEATER_BASESIZE ) ||
+          ( ent->s.modelindex == BA_A_SPAWN &&
+            distance <= CREEP_BASESIZE ) ) )
+      {
+          closestPower = ent;
+          minDistance = distance;
+      }
+    }
+  }
+
+  return closestPower;
+}
+
+/*
+================
 G_FindPower
 
 attempt to find power for self, return qtrue if successful
@@ -169,6 +231,7 @@
   int       distance = 0;
   int       minDistance = 10000;
   vec3_t    temp_v;
+  int       main_generator = 0;
 
   if( self->biteam != BIT_HUMANS )
     return qfalse;
@@ -197,11 +260,16 @@
       VectorSubtract( self->s.origin, ent->s.origin, temp_v );
       distance = VectorLength( temp_v );
 
-      if( distance < minDistance && ent->powered &&
-          ( ( ent->s.modelindex == BA_H_REACTOR &&
-            distance <= REACTOR_BASESIZE ) ||
-          ( ent->s.modelindex == BA_H_REPEATER &&
-            distance <= REPEATER_BASESIZE ) ) ) {
+      if( ent->s.modelindex == BA_H_REACTOR && distance <= REACTOR_BASESIZE && ent->powered)
+      {
+          main_generator = 1;
+          closestPower = ent;
+          minDistance = distance;
+      }
+      else if( !main_generator && distance < minDistance && ent->powered &&
+          ent->s.modelindex == BA_H_REPEATER &&
+          distance <= REPEATER_BASESIZE )
+      {
 
           closestPower = ent;
           minDistance = distance;
@@ -385,6 +453,7 @@
   int       distance = 0;
   int       minDistance = 10000;
   vec3_t    temp_v;
+  int main_generator = 0;
 
   //don't check for creep if flying through the air
   if( self->s.groundEntityNum == -1 )
@@ -403,7 +472,14 @@
       {
         VectorSubtract( self->s.origin, ent->s.origin, temp_v );
         distance = VectorLength( temp_v );
-        if( distance < minDistance )
+      
+        if( ent->s.modelindex == BA_A_OVERMIND)
+        {
+          main_generator = 1;
+          closestSpawn = ent;
+          minDistance = distance;
+        }
+        else if( !main_generator && distance < minDistance )
         {
           closestSpawn = ent;
           minDistance = distance;
@@ -2613,6 +2689,20 @@
 
 /*
 ===============
+G_SufficientGeneratorBPAvailable
+
+Determine if nearest generator has enough build points can 
+be released for the buildable
+===============
+*/
+static qboolean G_SufficientGeneratorBPAvailable( gentity_t*       generator,
+                                         int             buildPoints )
+{
+  return generator->buildpoints >= buildPoints;
+}
+
+/*
+===============
 G_SufficientBPAvailable
 
 Determine if enough build points can be released for the buildable
@@ -2846,6 +2936,7 @@
   {
     level.numBuildablesForRemoval = 0;
   }
+
   if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS )
   {
     //alien criteria
@@ -3000,7 +3091,7 @@
           break;
         }
         if( tempent->s.modelindex == buildable )
-          level.markedBuildables[ level.numBuildablesForRemoval++ ] = tempent;	
+          level.markedBuildables[ level.numBuildablesForRemoval++ ] = tempent;
       }
     }
 
@@ -3008,6 +3099,20 @@
       reason = IBE_NOPOWER;
   }
 
+  if(buildable != BA_A_SPAWN && buildable != BA_A_OVERMIND && buildable != BA_H_REACTOR && buildable != BA_H_REPEATER)
+  {
+    tempent = G_FindGenerator(ent->client->ps.stats[ STAT_PTEAM ], origin);
+    if( reason == IBE_NONE &&
+        (!tempent || !G_SufficientGeneratorBPAvailable(tempent, buildPoints))
+      )
+    {
+        if(ent->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS)
+            reason = IBE_NOPOWER;
+        else
+            reason = IBE_NOASSERT;
+    }
+  }
+
   //this item does not fit here
   if( reason == IBE_NONE && ( tr2.fraction < 1.0 || tr3.fraction < 1.0 ) )
     return IBE_NOROOM;
@@ -3111,6 +3216,7 @@
       built->die = ASpawn_Die;
       built->think = ASpawn_Think;
       built->pain = ASpawn_Pain;
+      built->buildpoints = g_eggBuildPoints.integer;
       break;
 
     case BA_A_BARRICADE:
@@ -3148,6 +3254,7 @@
       built->die = ASpawn_Die;
       built->think = AOvermind_Think;
       built->pain = ASpawn_Pain;
+      built->buildpoints = g_overmindBuildPoints.integer;
       break;
 
     case BA_A_HOVEL:
@@ -3193,6 +3300,7 @@
       built->die = HSpawn_Die;
       built->use = HRepeater_Use;
       built->powered = built->active = qtrue;
+      built->buildpoints = g_reactorBuildPoints.integer;
       break;
 
     case BA_H_REPEATER:
@@ -3200,6 +3308,7 @@
       built->die = HSpawn_Die;
       built->use = HRepeater_Use;
       built->count = -1;
+      built->buildpoints = g_repeaterBuildPoints.integer;
       break;
 
     default:
Seulement dans new/src/game: .g_buildable.c.swp
diff -ru old/src/game/g_local.h new/src/game/g_local.h
--- old/src/game/g_local.h	2007-06-23 02:20:21.000000000 +0200
+++ new/src/game/g_local.h	2007-06-23 03:20:56.000000000 +0200
@@ -198,6 +198,7 @@
   gentity_t         *parentNode;        // for creep and defence/spawn dependencies
   qboolean          active;             // for power repeater, but could be useful elsewhere
   qboolean          powered;            // for human buildables
+  int               buildpoints;        // buildpoints remains to this generator
   int               builtBy;            // clientNum of person that built this
   gentity_t         *dccNode;           // controlling dcc
   gentity_t         *overmindNode;      // controlling overmind
@@ -733,6 +734,7 @@
 gentity_t         *G_CheckSpawnPoint( int spawnNum, vec3_t origin, vec3_t normal,
                     buildable_t spawn, vec3_t spawnOrigin );
 
+gentity_t*        G_FindGenerator( buildableTeam_t team, vec3_t origin );
 qboolean          G_IsPowered( vec3_t origin );
 qboolean          G_IsDCCBuilt( void );
 qboolean          G_IsOvermindBuilt( void );
@@ -1138,6 +1140,11 @@
 
 extern  vmCvar_t  g_humanBuildPoints;
 extern  vmCvar_t  g_alienBuildPoints;
+extern  vmCvar_t  g_reactorBuildPoints;
+extern  vmCvar_t  g_repeaterBuildPoints;
+extern  vmCvar_t  g_overmindBuildPoints;
+extern  vmCvar_t  g_eggBuildPoints;
+extern  vmCvar_t  g_zoneBuildPoints;
 extern  vmCvar_t  g_humanStage;
 extern  vmCvar_t  g_humanKills;
 extern  vmCvar_t  g_humanMaxStage;
diff -ru old/src/game/g_main.c new/src/game/g_main.c
--- old/src/game/g_main.c	2007-06-23 02:20:21.000000000 +0200
+++ new/src/game/g_main.c	2007-06-23 13:00:45.000000000 +0200
@@ -92,6 +92,11 @@
 vmCvar_t  g_minNameChangePeriod;
 vmCvar_t  g_maxNameChanges;
 
+vmCvar_t  g_reactorBuildPoints;
+vmCvar_t  g_repeaterBuildPoints;
+vmCvar_t  g_overmindBuildPoints;
+vmCvar_t  g_eggBuildPoints;
+vmCvar_t  g_zoneBuildPoints;
 vmCvar_t  g_humanBuildPoints;
 vmCvar_t  g_alienBuildPoints;
 vmCvar_t  g_humanStage;
@@ -237,6 +242,11 @@
 
   { &g_humanBuildPoints, "g_humanBuildPoints", DEFAULT_HUMAN_BUILDPOINTS, 0, 0, qfalse  },
   { &g_alienBuildPoints, "g_alienBuildPoints", DEFAULT_ALIEN_BUILDPOINTS, 0, 0, qfalse  },
+  { &g_zoneBuildPoints, "g_zoneBuildPoints", "0", 0, 0, qfalse  },
+  { &g_reactorBuildPoints, "g_reactorBuildPoints", "100", 0, 0, qfalse  },
+  { &g_repeaterBuildPoints, "g_repeaterBuildPoints", "50", 0, 0, qfalse  },
+  { &g_overmindBuildPoints, "g_overmindBuildPoints", "100", 0, 0, qfalse  },
+  { &g_eggBuildPoints, "g_eggBuildPoints", "50", 0, 0, qfalse  },
   { &g_humanStage, "g_humanStage", "0", 0, 0, qfalse  },
   { &g_humanKills, "g_humanKills", "0", 0, 0, qfalse  },
   { &g_humanMaxStage, "g_humanMaxStage", DEFAULT_HUMAN_MAX_STAGE, 0, 0, qfalse  },
@@ -1087,6 +1097,7 @@
   gentity_t   *ent;
   int         localHTP = g_humanBuildPoints.integer,
               localATP = g_alienBuildPoints.integer;
+  int buildPoints;
 
   if( g_suddenDeathTime.integer )
   {
@@ -1154,6 +1165,20 @@
 
   for( i = 1, ent = g_entities + i ; i < level.num_entities ; i++, ent++ )
   {
+    buildable = ent->s.modelindex;
+
+    if(buildable == BA_H_REACTOR)
+      ent->buildpoints = g_reactorBuildPoints.integer;
+    else if(buildable == BA_H_REPEATER)
+      ent->buildpoints = g_repeaterBuildPoints.integer;
+    else if(buildable == BA_A_OVERMIND)
+      ent->buildpoints = g_overmindBuildPoints.integer;
+    else if(buildable == BA_A_SPAWN)
+      ent->buildpoints = g_eggBuildPoints.integer;
+  }
+
+  for( i = 1, ent = g_entities + i ; i < level.num_entities ; i++, ent++ )
+  {
     if( !ent->inuse )
       continue;
 
@@ -1172,15 +1197,20 @@
 
       if( !level.suddenDeath || BG_FindReplaceableTestForBuildable( buildable ) )
       {
+        buildPoints = BG_FindBuildPointsForBuildable( buildable );
+
+		if(ent->parentNode && ent->s.modelindex != BA_A_SPAWN)
+		  ent->parentNode->buildpoints -= buildPoints;
+
         if( BG_FindTeamForBuildable( buildable ) == BIT_HUMANS )
         {
-          level.humanBuildPoints -= BG_FindBuildPointsForBuildable( buildable );
+          level.humanBuildPoints -= buildPoints;
           if( ent->powered )
-            level.humanBuildPointsPowered -= BG_FindBuildPointsForBuildable( buildable );
+            level.humanBuildPointsPowered -= buildPoints;
         }
         else
         {
-          level.alienBuildPoints -= BG_FindBuildPointsForBuildable( buildable );
+          level.alienBuildPoints -= buildPoints;
         }
       }
     }
