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"
// =========
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);
});
}
{
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)
{