]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/gamemode_freezetag.qc
Merge branch 'master' into TimePath/deathtypes
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / gamemode_freezetag.qc
index f5c76f16f93e6591b238c25ab5c4701324afd58d..6eb2128f3bdaa0a96e6b02437e5947ef189a16cb 100644 (file)
@@ -1,13 +1,11 @@
-.float freezetag_frozen_time;
-.float freezetag_frozen_timeout;
-#define ICE_MAX_ALPHA 1
-#define ICE_MIN_ALPHA 0.1
-float freezetag_teams;
+#include "gamemode_freezetag.qh"
 
-#define SP_FREEZETAG_REVIVALS 4
+#include "gamemode.qh"
+
+const float SP_FREEZETAG_REVIVALS = 4;
 void freezetag_ScoreRules(float teams)
 {
-       ScoreRules_basics(teams, SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_PRIMARY, TRUE); // SFL_SORT_PRIO_PRIMARY
+       ScoreRules_basics(teams, SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_PRIMARY, true); // SFL_SORT_PRIO_PRIMARY
        ScoreInfo_SetLabel_PlayerScore(SP_FREEZETAG_REVIVALS, "revivals", 0);
        ScoreRules_basics_end();
 }
@@ -39,9 +37,9 @@ void freezetag_count_alive_players()
 #define FREEZETAG_ALIVE_TEAMS() ((redalive > 0) + (bluealive > 0) + (yellowalive > 0) + (pinkalive > 0))
 #define FREEZETAG_ALIVE_TEAMS_OK() (FREEZETAG_ALIVE_TEAMS() == freezetag_teams)
 
-float prev_missing_teams_mask;
 float freezetag_CheckTeams()
 {
+       static float prev_missing_teams_mask;
        if(FREEZETAG_ALIVE_TEAMS_OK())
        {
                if(prev_missing_teams_mask > 0)
@@ -135,7 +133,7 @@ float freezetag_CheckWinner()
 }
 
 entity freezetag_LastPlayerForTeam()
-{
+{SELFPARAM();
        entity pl, last_pl = world;
        FOR_EACH_PLAYER(pl)
        {
@@ -163,7 +161,7 @@ void freezetag_LastPlayerForTeam_Notify()
 }
 
 void freezetag_Add_Score(entity attacker)
-{
+{SELFPARAM();
        if(attacker == self)
        {
                // you froze your own dumb self
@@ -181,14 +179,14 @@ void freezetag_Add_Score(entity attacker)
 }
 
 void freezetag_Freeze(entity attacker)
-{
+{SELFPARAM();
        if(self.frozen)
                return;
 
        if(autocvar_g_freezetag_frozen_maxtime > 0)
                self.freezetag_frozen_timeout = time + autocvar_g_freezetag_frozen_maxtime;
 
-       Freeze(self, 0, 1, TRUE);
+       Freeze(self, 0, 1, true);
 
        freezetag_count_alive_players();
 
@@ -196,7 +194,7 @@ void freezetag_Freeze(entity attacker)
 }
 
 void freezetag_Unfreeze(entity attacker)
-{
+{SELFPARAM();
        self.freezetag_frozen_time = 0;
        self.freezetag_frozen_timeout = 0;
 
@@ -205,9 +203,9 @@ void freezetag_Unfreeze(entity attacker)
 
 float freezetag_isEliminated(entity e)
 {
-       if(e.frozen == 1 || e.deadflag != DEAD_NO)
-               return TRUE;
-       return FALSE;
+       if(IS_PLAYER(e) && (e.frozen == 1 || e.deadflag != DEAD_NO))
+               return true;
+       return false;
 }
 
 
@@ -219,7 +217,7 @@ void() havocbot_role_ft_freeing;
 void() havocbot_role_ft_offense;
 
 void havocbot_goalrating_freeplayers(float ratingscale, vector org, float sradius)
-{
+{SELFPARAM();
        entity head;
        float distance;
 
@@ -245,7 +243,7 @@ void havocbot_goalrating_freeplayers(float ratingscale, vector org, float sradiu
 }
 
 void havocbot_role_ft_offense()
-{
+{SELFPARAM();
        entity head;
        float unfrozen;
 
@@ -266,7 +264,7 @@ void havocbot_role_ft_offense()
        // If only one left on team or if role has timed out then start trying to free players.
        if (((unfrozen == 0) && (!self.frozen)) || (time > self.havocbot_role_timeout))
        {
-               dprint("changing role to freeing\n");
+               LOG_TRACE("changing role to freeing\n");
                self.havocbot_role = havocbot_role_ft_freeing;
                self.havocbot_role_timeout = 0;
                return;
@@ -286,7 +284,7 @@ void havocbot_role_ft_offense()
 }
 
 void havocbot_role_ft_freeing()
-{
+{SELFPARAM();
        if(self.deadflag != DEAD_NO)
                return;
 
@@ -295,7 +293,7 @@ void havocbot_role_ft_freeing()
 
        if (time > self.havocbot_role_timeout)
        {
-               dprint("changing role to offense\n");
+               LOG_TRACE("changing role to offense\n");
                self.havocbot_role = havocbot_role_ft_offense;
                self.havocbot_role_timeout = 0;
                return;
@@ -320,7 +318,7 @@ void havocbot_role_ft_freeing()
 // ==============
 
 MUTATOR_HOOKFUNCTION(freezetag_RemovePlayer)
-{
+{SELFPARAM();
        self.health = 0; // neccessary to update correctly alive stats
        if(!self.frozen)
                freezetag_LastPlayerForTeam_Notify();
@@ -330,7 +328,7 @@ MUTATOR_HOOKFUNCTION(freezetag_RemovePlayer)
 }
 
 MUTATOR_HOOKFUNCTION(freezetag_PlayerDies)
-{
+{SELFPARAM();
        if(round_handler_IsActive())
        if(round_handler_CountdownRunning())
        {
@@ -343,7 +341,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies)
        // Cases DEATH_TEAMCHANGE and DEATH_AUTOTEAMCHANGE are needed to fix a bug whe
        // you succeed changing team through the menu: you both really die (gibbing) and get frozen
        if(ITEM_DAMAGE_NEEDKILL(frag_deathtype)
-               || frag_deathtype == DEATH_TEAMCHANGE || frag_deathtype == DEATH_AUTOTEAMCHANGE)
+               || frag_deathtype == DEATH_TEAMCHANGE.m_id || frag_deathtype == DEATH_AUTOTEAMCHANGE.m_id)
        {
                // let the player die, he will be automatically frozen when he respawns
                if(self.frozen != 1)
@@ -384,7 +382,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies)
 }
 
 MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn)
-{
+{SELFPARAM();
        if(self.freezetag_frozen_timeout == -1) // if PlayerSpawn is called by reset_map_players
                return 1; // do nothing, round is starting right now
 
@@ -407,13 +405,15 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn)
 }
 
 MUTATOR_HOOKFUNCTION(freezetag_reset_map_players)
-{
-       FOR_EACH_PLAYER(self)
+{SELFPARAM();
+       entity e;
+       FOR_EACH_PLAYER(e)
        {
-               self.killcount = 0;
-               self.freezetag_frozen_timeout = -1;
+               e.killcount = 0;
+               e.freezetag_frozen_timeout = -1;
+               setself(e);
                PutClientInServer();
-               self.freezetag_frozen_timeout = 0;
+               e.freezetag_frozen_timeout = 0;
        }
        freezetag_count_alive_players();
        return 1;
@@ -425,9 +425,8 @@ MUTATOR_HOOKFUNCTION(freezetag_GiveFragsForKill)
        return 1;
 }
 
-.float reviving; // temp var
 MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
-{
+{SELFPARAM();
        float n;
 
        if(gameover)
@@ -465,7 +464,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
                        if(!o)
                                o = other;
                        if(self.frozen == 1)
-                               other.reviving = TRUE;
+                               other.reviving = true;
                        ++n;
                }
        }
@@ -509,7 +508,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
                        if(other.reviving)
                        {
                                other.revive_progress = self.revive_progress;
-                               other.reviving = FALSE;
+                               other.reviving = false;
                        }
                }
        }
@@ -526,8 +525,23 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
        return 1;
 }
 
-MUTATOR_HOOKFUNCTION(freezetag_BotRoles)
+MUTATOR_HOOKFUNCTION(freezetag_SetStartItems)
 {
+       start_items &= ~IT_UNLIMITED_AMMO;
+       //start_health       = warmup_start_health       = cvar("g_lms_start_health");
+       //start_armorvalue   = warmup_start_armorvalue   = cvar("g_lms_start_armor");
+       start_ammo_shells  = warmup_start_ammo_shells  = cvar("g_lms_start_ammo_shells");
+       start_ammo_nails   = warmup_start_ammo_nails   = cvar("g_lms_start_ammo_nails");
+       start_ammo_rockets = warmup_start_ammo_rockets = cvar("g_lms_start_ammo_rockets");
+       start_ammo_cells   = warmup_start_ammo_cells   = cvar("g_lms_start_ammo_cells");
+       start_ammo_plasma  = warmup_start_ammo_plasma  = cvar("g_lms_start_ammo_plasma");
+       start_ammo_fuel    = warmup_start_ammo_fuel    = cvar("g_lms_start_ammo_fuel");
+
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_BotRoles)
+{SELFPARAM();
        if (!self.deadflag)
        {
                if (random() < 0.5)
@@ -536,13 +550,13 @@ MUTATOR_HOOKFUNCTION(freezetag_BotRoles)
                        self.havocbot_role = havocbot_role_ft_offense;
        }
 
-       return TRUE;
+       return true;
 }
 
 MUTATOR_HOOKFUNCTION(freezetag_GetTeamCount)
 {
        ret_float = freezetag_teams;
-       return 0;
+       return false;
 }
 
 void freezetag_Initialize()
@@ -573,6 +587,7 @@ MUTATOR_DEFINITION(gamemode_freezetag)
        MUTATOR_HOOK(reset_map_players, freezetag_reset_map_players, CBC_ORDER_ANY);
        MUTATOR_HOOK(GiveFragsForKill, freezetag_GiveFragsForKill, CBC_ORDER_FIRST);
        MUTATOR_HOOK(PlayerPreThink, freezetag_PlayerPreThink, CBC_ORDER_FIRST);
+       MUTATOR_HOOK(SetStartItems, freezetag_SetStartItems, CBC_ORDER_ANY);
        MUTATOR_HOOK(HavocBot_ChooseRole, freezetag_BotRoles, CBC_ORDER_ANY);
        MUTATOR_HOOK(GetTeamCount, freezetag_GetTeamCount, CBC_ORDER_EXCLUSIVE);
 
@@ -592,7 +607,7 @@ MUTATOR_DEFINITION(gamemode_freezetag)
 
        MUTATOR_ONREMOVE
        {
-               print("This is a game type and it cannot be removed at runtime.");
+               LOG_INFO("This is a game type and it cannot be removed at runtime.");
                return -1;
        }