]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/mutator_spawn_near_teammate.qc
Merge branch 'Mario/rifle_arena' into Mario/mutators
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_spawn_near_teammate.qc
index 36e7db1181e3c30515fb00ec9e98e24d5c723773..4d0746dec28fe6c9235937e86597fc06ee1f5ff5 100644 (file)
@@ -1,25 +1,50 @@
 float autocvar_g_spawn_near_teammate_distance;
+.entity msnt_lookat;
 
-MUTATOR_HOOKFUNCTION(msnt_Spawn_Score) {
+MUTATOR_HOOKFUNCTION(msnt_Spawn_Score)
+{
        entity p;
 
+       spawn_spot.msnt_lookat = world;
+
        if(!teamplay)
                return 0;
 
+       RandomSelection_Init();
        FOR_EACH_PLAYER(p) if(p != self) if(p.team == self.team) if(!p.deadflag)
        {
-               if(vlen(spawn_score_spot.origin - p.origin) > autocvar_g_spawn_near_teammate_distance)
+               float l = vlen(spawn_spot.origin - p.origin);
+               if(l > autocvar_g_spawn_near_teammate_distance)
                        continue;
-               if(!checkpvs(spawn_score_spot.origin, p))
+               if(l < 48)
                        continue;
+               if(!checkpvs(spawn_spot.origin, p))
+                       continue;
+               RandomSelection_Add(p, 0, string_null, 1, 1);
+       }
+
+       if(RandomSelection_chosen_ent)
+       {
+               spawn_spot.msnt_lookat = RandomSelection_chosen_ent;
+               spawn_score_x += SPAWN_PRIO_NEAR_TEAMMATE_FOUND;
+       }
+       else if(self.team == spawn_spot.team)
+               spawn_score_x += SPAWN_PRIO_NEAR_TEAMMATE_SAMETEAM; // prefer same team, if we can't find a spawn near teammate
+
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(msnt_PlayerSpawn)
+{
+       if(spawn_spot.msnt_lookat)
+       {
+               self.angles = vectoangles(spawn_spot.msnt_lookat.origin - self.origin);
+               self.angles_x = -self.angles_x;
                /*
-               if(self == nextent(world))
-               {
-                       te_explosion(p.origin);
-                       print(p.netname, " should be nearby\n");
-               }
+               sprint(self, "You should be looking at ", spawn_spot.msnt_lookat.netname, "^7.\n");
+               sprint(self, "distance: ", vtos(spawn_spot.msnt_lookat.origin - self.origin), "\n");
+               sprint(self, "angles: ", vtos(self.angles), "\n");
                */
-               spawn_score_x += SPAWN_PRIO_NEAR_TEAMMATE;
        }
 
        return 0;
@@ -28,6 +53,7 @@ MUTATOR_HOOKFUNCTION(msnt_Spawn_Score) {
 MUTATOR_DEFINITION(mutator_spawn_near_teammate)
 {
        MUTATOR_HOOK(Spawn_Score, msnt_Spawn_Score, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerSpawn, msnt_PlayerSpawn, CBC_ORDER_ANY);
 
        return 0;
 }