]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/mutator/gamemode_lms.qc
Merge branch 'master' into terencehill/hud_fixes
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator / gamemode_lms.qc
index 575bc69040474805daee2fef54347a3887dd6f3e..4f84c5abbcb6c71994884d3a68e13f2ef703c5c8 100644 (file)
@@ -1,3 +1,4 @@
+#include "gamemode_lms.qh"
 #ifndef GAMEMODE_LMS_H
 #define GAMEMODE_LMS_H
 
@@ -44,8 +45,9 @@ float LMS_NewPlayerLives();
 
 #ifdef IMPLEMENTATION
 
-#include "../../campaign.qh"
-#include "../../command/cmd.qh"
+#include <common/mutators/mutator/instagib/items.qc>
+#include <server/campaign.qh>
+#include <server/command/cmd.qh>
 
 int autocvar_g_lms_extra_lives;
 bool autocvar_g_lms_join_anytime;
@@ -71,24 +73,23 @@ float LMS_NewPlayerLives()
        return bound(1, lms_lowest_lives, fl);
 }
 
+void ClearWinners();
+
 // LMS winning condition: game terminates if and only if there's at most one
 // one player who's living lives. Top two scores being equal cancels the time
 // limit.
-float WinningCondition_LMS()
+int WinningCondition_LMS()
 {
        entity head, head2;
-       float have_player;
-       float have_players;
-       float l;
+       bool have_player = false;
+       bool have_players = false;
 
-       have_player = false;
-       have_players = false;
-       l = LMS_NewPlayerLives();
+       int l = LMS_NewPlayerLives();
 
-       head = find(world, classname, "player");
+       head = find(world, classname, STR_PLAYER);
        if(head)
                have_player = true;
-       head2 = find(head, classname, "player");
+       head2 = find(head, classname, STR_PLAYER);
        if(head2)
                have_players = true;
 
@@ -160,15 +161,9 @@ MUTATOR_HOOKFUNCTION(lms, reset_map_global)
 }
 
 MUTATOR_HOOKFUNCTION(lms, reset_map_players)
-{SELFPARAM();
-       entity e;
+{
        if(restart_mapalreadyrestarted || (time < game_starttime))
-       FOR_EACH_CLIENT(e)
-       if(IS_PLAYER(e))
-       {
-               WITH(entity, self, e, PlayerScore_Add(e, SP_LMS_LIVES, LMS_NewPlayerLives()));
-       }
-
+       FOREACH_CLIENT(IS_PLAYER(it), LAMBDA(PlayerScore_Add(it, SP_LMS_LIVES, LMS_NewPlayerLives())));
        return false;
 }
 
@@ -178,17 +173,14 @@ MUTATOR_HOOKFUNCTION(lms, PutClientInServer)
        // FIXME fix LMS scoring for new system
        if(PlayerScore_Add(self, SP_LMS_RANK, 0) > 0)
        {
-               self.classname = STR_OBSERVER;
+               TRANSMUTE(Observer, self);
                Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_LMS_NOLIVES);
        }
-
-       return false;
 }
 
 MUTATOR_HOOKFUNCTION(lms, PlayerDies)
-{SELFPARAM();
-       self.respawn_flags |= RESPAWN_FORCE;
-
+{
+       frag_target.respawn_flags |= RESPAWN_FORCE;
        return false;
 }
 
@@ -214,15 +206,16 @@ MUTATOR_HOOKFUNCTION(lms, ClientDisconnect)
 }
 
 MUTATOR_HOOKFUNCTION(lms, MakePlayerObserver)
-{SELFPARAM();
-       lms_RemovePlayer(self);
-       return false;
+{
+    SELFPARAM();
+       lms_RemovePlayer(this);
+       return true;  // prevent team reset
 }
 
 MUTATOR_HOOKFUNCTION(lms, ClientConnect)
 {SELFPARAM();
-       self.classname = STR_PLAYER;
-       campaign_bots_may_start = 1;
+       TRANSMUTE(Player, self);
+       campaign_bots_may_start = true;
 
        if(PlayerScore_Add(self, SP_LMS_LIVES, LMS_NewPlayerLives()) <= 0)
        {
@@ -343,18 +336,17 @@ MUTATOR_HOOKFUNCTION(lms, ItemTouch)
 
 MUTATOR_HOOKFUNCTION(lms, Bot_FixCount, CBC_ORDER_EXCLUSIVE)
 {
-       entity head;
-       FOR_EACH_REALCLIENT(head)
-       {
+       FOREACH_CLIENT(IS_REAL_CLIENT(it), LAMBDA(
                ++bot_activerealplayers;
                ++bot_realplayers;
-       }
+       ));
 
        return true;
 }
 
 MUTATOR_HOOKFUNCTION(lms, ClientCommand_Spectate)
 {
+    SELFPARAM();
        if(self.lms_spectate_warning)
        {
                // for the forfeit message...