// limit.
int WinningCondition_LMS()
{
- entity head, head2;
- bool have_player = false;
- bool have_players = false;
-
- int l = LMS_NewPlayerLives();
-
- head = find(NULL, classname, STR_PLAYER);
- if(head)
- have_player = true;
- head2 = find(head, classname, STR_PLAYER);
- if(head2)
- have_players = true;
+ entity first_player = NULL;
+ int total_players = 0;
+ FOREACH_CLIENT(IS_PLAYER(it), {
+ if (!total_players)
+ first_player = it;
+ ++total_players;
+ });
- if(have_player)
+ if (total_players)
{
- // we have at least one player
- if(have_players)
+ if (total_players > 1)
{
// two or more active players - continue with the game
+
+ if (autocvar_g_campaign)
+ {
+ FOREACH_CLIENT(IS_REAL_CLIENT(it), {
+ float pl_lives = GameRules_scoring_add(it, LMS_LIVES, 0);
+ if (!pl_lives)
+ return WINNING_YES; // human player lost, game over
+ break;
+ });
+ }
}
else
{
ClearWinners();
SetWinners(winning, 0); // NOTE: exactly one player is still "player", so this works out
- if(l)
+ if (LMS_NewPlayerLives())
{
// game still running (that is, nobody got removed from the game by a frag yet)? then continue
return WINNING_NO;
{
// a winner!
// and assign him his first place
- GameRules_scoring_add(head, LMS_RANK, 1);
+ GameRules_scoring_add(first_player, LMS_RANK, 1);
if(warmup_stage)
return WINNING_NO;
else
else
{
// nobody is playing at all...
- if(l)
+ if (LMS_NewPlayerLives())
{
// wait for players...
}
MUTATOR_HOOKFUNCTION(lms, MakePlayerObserver)
{
- entity player = M_ARGV(0, entity);
+ entity player = M_ARGV(0, entity);
+
+ if (!IS_PLAYER(player))
+ return true;
lms_RemovePlayer(player);
return true; // prevent team reset
{
entity player = M_ARGV(0, entity);
- TRANSMUTE(Player, player);
- campaign_bots_may_start = true;
-
if(GameRules_scoring_add(player, LMS_LIVES, LMS_NewPlayerLives()) <= 0)
{
GameRules_scoring_add(player, LMS_RANK, 666); // mark as forced spectator for the hud code
}
}
+MUTATOR_HOOKFUNCTION(lms, AutoJoinOnConnection)
+{
+ if(autocvar_g_campaign)
+ return false;
+ return true;
+}
+
MUTATOR_HOOKFUNCTION(lms, PlayerPreThink)
{
entity player = M_ARGV(0, entity);
return true;
}
-MUTATOR_HOOKFUNCTION(lms, FilterItem)
+MUTATOR_HOOKFUNCTION(lms, FilterItemDefinition)
{
- entity item = M_ARGV(0, entity);
+ entity definition = M_ARGV(0, entity);
- if(autocvar_g_lms_extra_lives)
- if(item.itemdef == ITEM_ExtraLife)
+ if (autocvar_g_lms_extra_lives && definition == ITEM_ExtraLife)
+ {
return false;
-
+ }
return true;
}
MUTATOR_HOOKFUNCTION(lms, ClientCommand_Spectate)
{
- entity player = M_ARGV(0, entity);
+ entity player = M_ARGV(0, entity);
if(warmup_stage || player.lms_spectate_warning)
{