From: terencehill Date: Sat, 25 Apr 2020 21:07:30 +0000 (+0200) Subject: LMS: increase player respawn delay based on the number of lives less than the leader... X-Git-Tag: xonotic-v0.8.6~426^2~19 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=51397bdd2c6787063159537ce2d9f274bf82ab7a;p=xonotic%2Fxonotic-data.pk3dir.git LMS: 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) --- diff --git a/gamemodes-server.cfg b/gamemodes-server.cfg index 1dec3b681..a466211a3 100644 --- a/gamemodes-server.cfg +++ b/gamemodes-server.cfg @@ -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" // ========= diff --git a/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc b/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc index af4937b9d..d31938591 100644 --- a/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc +++ b/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc @@ -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;