]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
LMS: increase player respawn delay based on the number of lives less than the leader...
authorterencehill <piuntn@gmail.com>
Sat, 25 Apr 2020 21:07:30 +0000 (23:07 +0200)
committerterencehill <piuntn@gmail.com>
Sat, 25 Apr 2020 21:07:30 +0000 (23:07 +0200)
gamemodes-server.cfg
qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc

index 1dec3b681ff073ce6dc3c9cd3a56efe28e810482..a466211a322d056bf397f57a90f43463946b73fe 100644 (file)
@@ -445,6 +445,9 @@ set g_lms_leader_wp_lives 2 "show waypoints for players leading by this number o
 set g_lms_leader_wp_max_relative 0.5 "show waypoints for leaders only if they are max this fraction of total players"
 set g_lms_leader_wp_time 5 "show waypoints for leaders only for this amount of time"
 set g_lms_leader_wp_time_repeat 30 "periodically show again waypoints for leaders after this amount of time"
+set g_lms_dynamic_respawn_delay 1 "increase player respawn delay based on the number of lives less than the leader (NOTE: delay doesn't increase when only 2 players are left alive)"
+set g_lms_dynamic_respawn_delay_base 2 "base player respawn delay"
+set g_lms_dynamic_respawn_delay_increase 3 "increase base player respawn delay by this amount of time for each life less than the leader"
 
 
 // =========
index af4937b9dac0e838f6905e2d5e005e4e4b10b854..d31938591d14f234176b814a6c88ab5f588c8a90 100644 (file)
@@ -12,6 +12,9 @@ int autocvar_g_lms_leader_wp_lives;
 float autocvar_g_lms_leader_wp_max_relative;
 float autocvar_g_lms_leader_wp_time;
 float autocvar_g_lms_leader_wp_time_repeat;
+float autocvar_g_lms_dynamic_respawn_delay;
+float autocvar_g_lms_dynamic_respawn_delay_base;
+float autocvar_g_lms_dynamic_respawn_delay_increase;
 
 .float lms_wp_time;
 
@@ -162,6 +165,33 @@ MUTATOR_HOOKFUNCTION(lms, PutClientInServer)
        }
 }
 
+MUTATOR_HOOKFUNCTION(lms, CalculateRespawnTime)
+{
+       entity player = M_ARGV(0, entity);
+       player.respawn_flags |= RESPAWN_FORCE;
+
+       if (autocvar_g_lms_dynamic_respawn_delay <= 0)
+               return false;
+
+       int pl_lives = GameRules_scoring_add(player, LMS_LIVES, 0);
+       int max_lives = 0;
+       int pl_cnt = 0;
+       FOREACH_CLIENT(it != player && IS_PLAYER(it) && it.frags != FRAGS_PLAYER_OUT_OF_GAME, {
+               int lives = GameRules_scoring_add(it, LMS_LIVES, 0);
+               if (lives > max_lives)
+                       max_lives = lives;
+               pl_cnt++;
+       });
+
+       // min delay with only 2 players
+       if (pl_cnt == 1) // player wasn't counted
+               max_lives = 0;
+
+       player.respawn_time = time + autocvar_g_lms_dynamic_respawn_delay_base +
+               autocvar_g_lms_dynamic_respawn_delay_increase * max(0, max_lives - pl_lives);
+       return true;
+}
+
 MUTATOR_HOOKFUNCTION(lms, ForbidSpawn)
 {
        entity player = M_ARGV(0, entity);
@@ -178,13 +208,6 @@ MUTATOR_HOOKFUNCTION(lms, ForbidSpawn)
        return false;
 }
 
-MUTATOR_HOOKFUNCTION(lms, PlayerDies)
-{
-       entity frag_target = M_ARGV(2, entity);
-
-       frag_target.respawn_flags |= RESPAWN_FORCE;
-}
-
 void lms_RemovePlayer(entity player)
 {
        static int quitters = 0;