]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into terencehill/lms_updates
authorterencehill <piuntn@gmail.com>
Mon, 13 Sep 2021 21:58:36 +0000 (23:58 +0200)
committerterencehill <piuntn@gmail.com>
Mon, 13 Sep 2021 21:58:36 +0000 (23:58 +0200)
# Conflicts:
# qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc

1  2 
gamemodes-server.cfg
qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc

index e97ae1a01a5f979c4354fe16e71fa8badd8629f2,17b90c624fde8f8af9a50534ad5e69fae6e27ead..d89511ab161f0361271f33e3c894ef3f30d8d831
@@@ -446,21 -446,9 +446,21 @@@ set g_lms 0 "Last Man Standing: everyon
  set g_lms_lives_override -1
  set g_lms_extra_lives 0
  set g_lms_regenerate 0
- set g_lms_last_join 3 "if g_lms_join_anytime is false, new players can only join if the worst active player has more than (fraglimit - g_lms_last_join) lives"
- set g_lms_join_anytime 1      "if true, new players can join, but get same amount of lives as the worst player"
+ set g_lms_last_join 3 "if g_lms_join_anytime is 0, new players can only join if the worst active player has (fraglimit - g_lms_last_join) or more lives; in other words, new players can no longer join once the worst player loses more than g_lms_last_join lives"
+ set g_lms_join_anytime 1      "1: new players can join, but get same amount of lives as the worst player; 0: new players can only join if the worst active player has (fraglimit - g_lms_last_join) or more lives"
  set g_lms_weaponarena "most_available" "starting weapons - takes the same options as g_weaponarena"
 +set g_lms_leader_wp_lives 2 "show waypoints for players leading by this number of lives"
 +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"
 +set g_lms_dynamic_vampire 1 "attackers receive a fraction of health removed from enemies based on the number of lives less than the enemy"
 +set g_lms_dynamic_vampire_factor_base 0.1 "base vampire factor"
 +set g_lms_dynamic_vampire_factor_increase 0.1 "increase vampire factor by this fraction for each life less than the enemy"
 +set g_lms_dynamic_vampire_factor_max 0.5 "max vampire factor"
 +set g_lms_dynamic_vampire_min_lives_diff 2 "number of lives the attacker must have less than the enemy to receive the base fraction of health"
  
  
  // =========
index 41673a7d77135ae5f2c0ae84923a22a49c812370,e9ddb4e815ef2a10344f2e0cd11c4aeb17d86d6c..018f75e361743684c89c83cfbbe10a564595be33
@@@ -137,12 -123,26 +137,28 @@@ MUTATOR_HOOKFUNCTION(lms, reset_map_glo
  MUTATOR_HOOKFUNCTION(lms, reset_map_players)
  {
        FOREACH_CLIENT(true, {
+               if (it.frags == FRAGS_PLAYER_OUT_OF_GAME)
+               {
+                       // players who forfeited (rank >= 256) become spectators
+                       if (it.lms_spectate_warning == 2)
+                               it.frags = FRAGS_SPECTATOR;
+                       else
+                               it.frags = FRAGS_PLAYER;
+               }
+               CS(it).killcount = 0;
+               it.lmsplayer = 0;
+               it.lms_spectate_warning = 0;
+               GameRules_scoring_add(it, LMS_RANK, -GameRules_scoring_add(it, LMS_RANK, 0));
+               GameRules_scoring_add(it, LMS_LIVES, -GameRules_scoring_add(it, LMS_LIVES, 0));
+               if (it.frags != FRAGS_PLAYER)
+                       continue;
                TRANSMUTE(Player, it);
-               it.frags = FRAGS_PLAYER;
-               GameRules_scoring_add(it, LMS_LIVES, LMS_NewPlayerLives());
                PutClientInServer(it);
 +              if (it.waypointsprite_attachedforcarrier)
 +                      WaypointSprite_Kill(it.waypointsprite_attachedforcarrier);
        });
  }
  
@@@ -180,23 -228,31 +244,17 @@@ MUTATOR_HOOKFUNCTION(lms, ForbidSpawn
  {
        entity player = M_ARGV(0, entity);
  
-       if(warmup_stage)
+       if (warmup_stage || lms_AddPlayer(player))
                return false;
-       if(player.frags == FRAGS_SPECTATOR || GameRules_scoring_add(player, LMS_LIVES, 0) <= 0)
-       {
-               Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_LMS_NOLIVES);
-               return true;
-       }
-       return false;
- }
  
- MUTATOR_HOOKFUNCTION(lms, PlayerDies)
- {
+       return true;
  }
  
 -MUTATOR_HOOKFUNCTION(lms, PlayerDies)
 -{
 -      entity frag_target = M_ARGV(2, entity);
 -
 -      float tl = GameRules_scoring_add(frag_target, LMS_LIVES, 0);
 -      if (tl <= 0)
 -      {
 -              frag_target.respawn_flags = RESPAWN_SILENT;
 -              // prevent unwanted sudden rejoin as spectator and movement of spectator camera
 -              frag_target.respawn_time = time + 2;
 -      }
 -      frag_target.respawn_flags |= RESPAWN_FORCE;
 -}
 -
  void lms_RemovePlayer(entity player)
  {
-       static int quitters = 0;
+       if (warmup_stage || time < game_starttime)
+               return;
        float player_rank = GameRules_scoring_add(player, LMS_RANK, 0);
        if (!player_rank)
        {