]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/client.qc
Merge branch 'master' into 'Mario/status_effects'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / client.qc
index d80bdffa78d8aaf09e9e7a6faea3479aa5b49438..7217c4b87b0df4ae0f2105bd633ca8a4abbca118 100644 (file)
@@ -23,6 +23,7 @@
 #include <common/mutators/mutator/instagib/sv_instagib.qh>
 #include <common/mutators/mutator/nades/nades.qh>
 #include <common/mutators/mutator/overkill/oknex.qh>
+#include <common/mutators/mutator/status_effects/_mod.qh>
 #include <common/mutators/mutator/waypoints/all.qh>
 #include <common/net_linked.qh>
 #include <common/net_notice.qh>
@@ -335,9 +336,6 @@ void PutObserverInServer(entity this)
        this.scale = 0;
        this.fade_time = 0;
        this.pain_finished = 0;
-       STAT(STRENGTH_FINISHED, this) = 0;
-       STAT(INVINCIBLE_FINISHED, this) = 0;
-       STAT(SUPERWEAPONS_FINISHED, this) = 0;
        STAT(AIR_FINISHED, this) = 0;
        //this.dphitcontentsmask = 0;
        this.dphitcontentsmask = DPCONTENTS_SOLID;
@@ -373,7 +371,6 @@ void PutObserverInServer(entity this)
        this.punchangle = '0 0 0';
        this.punchvector = '0 0 0';
        this.oldvelocity = this.velocity;
-       this.fire_endtime = -1;
        this.event_damage = func_null;
        this.event_heal = func_null;
 
@@ -593,8 +590,6 @@ void PutPlayerInServer(entity this)
 
        PS(this).dual_weapons = '0 0 0';
 
-       STAT(SUPERWEAPONS_FINISHED, this) = (STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS) ? time + autocvar_g_balance_superweapons_time : 0;
-
        this.items = start_items;
 
        this.spawnshieldtime = time + autocvar_g_spawnshieldtime;
@@ -641,16 +636,9 @@ void PutPlayerInServer(entity this)
        this.punchangle = '0 0 0';
        this.punchvector = '0 0 0';
 
-       STAT(STRENGTH_FINISHED, this) = 0;
-       STAT(INVINCIBLE_FINISHED, this) = 0;
-       this.fire_endtime = -1;
        STAT(REVIVE_PROGRESS, this) = 0;
        this.revival_time = 0;
 
-       // TODO: we can't set these in the PlayerSpawn hook since the target code is called before it!
-       STAT(BUFFS, this) = 0;
-       STAT(BUFF_TIME, this) = 0;
-
        STAT(AIR_FINISHED, this) = 0;
        this.waterlevel = WATERLEVEL_NONE;
        this.watertype = CONTENT_EMPTY;
@@ -753,6 +741,10 @@ void PutPlayerInServer(entity this)
                }
        });
 
+       Unfreeze(this, false);
+
+       MUTATOR_CALLHOOK(PlayerSpawn, this, spot);
+
        {
                string s = spot.target;
                if(g_assault || g_race) // TODO: make targeting work in assault & race without this hack
@@ -762,10 +754,6 @@ void PutPlayerInServer(entity this)
                        spot.target = s;
        }
 
-       Unfreeze(this, false);
-
-       MUTATOR_CALLHOOK(PlayerSpawn, this, spot);
-
        if (autocvar_spawn_debug)
        {
                sprint(this, strcat("spawnpoint origin:  ", vtos(spot.origin), "\n"));
@@ -1476,7 +1464,7 @@ void player_powerups(entity this)
        else
                this.modelflags &= ~MF_ROCKET;
 
-       this.effects &= ~(EF_RED | EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT | EF_FLAME | EF_NODEPTHTEST);
+       this.effects &= ~(EF_RED | EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT | EF_NODEPTHTEST);
 
        if (IS_DEAD(this))
                player_powerups_remove_all(this);
@@ -1487,16 +1475,13 @@ void player_powerups(entity this)
        // add a way to see what the items were BEFORE all of these checks for the mutator hook
        int items_prev = this.items;
 
-       Fire_ApplyDamage(this);
-       Fire_ApplyEffect(this);
-
        if (!MUTATOR_IS_ENABLED(mutator_instagib))
        {
                if (this.items & ITEM_Strength.m_itemid)
                {
-                       play_countdown(this, STAT(STRENGTH_FINISHED, this), SND_POWEROFF);
+                       play_countdown(this, StatusEffects_gettime(STATUSEFFECT_Strength, this), SND_POWEROFF);
                        this.effects = this.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT);
-                       if (time > STAT(STRENGTH_FINISHED, this))
+                       if (time > StatusEffects_gettime(STATUSEFFECT_Strength, this))
                        {
                                this.items = this.items - (this.items & ITEM_Strength.m_itemid);
                                //Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_POWERDOWN_STRENGTH, this.netname);
@@ -1505,7 +1490,7 @@ void player_powerups(entity this)
                }
                else
                {
-                       if (time < STAT(STRENGTH_FINISHED, this))
+                       if (time < StatusEffects_gettime(STATUSEFFECT_Strength, this))
                        {
                                this.items = this.items | ITEM_Strength.m_itemid;
                                if(!g_cts)
@@ -1515,9 +1500,9 @@ void player_powerups(entity this)
                }
                if (this.items & ITEM_Shield.m_itemid)
                {
-                       play_countdown(this, STAT(INVINCIBLE_FINISHED, this), SND_POWEROFF);
+                       play_countdown(this, StatusEffects_gettime(STATUSEFFECT_Shield, this), SND_POWEROFF);
                        this.effects = this.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT);
-                       if (time > STAT(INVINCIBLE_FINISHED, this))
+                       if (time > StatusEffects_gettime(STATUSEFFECT_Shield, this))
                        {
                                this.items = this.items - (this.items & ITEM_Shield.m_itemid);
                                //Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_POWERDOWN_SHIELD, this.netname);
@@ -1526,7 +1511,7 @@ void player_powerups(entity this)
                }
                else
                {
-                       if (time < STAT(INVINCIBLE_FINISHED, this))
+                       if (time < StatusEffects_gettime(STATUSEFFECT_Shield, this))
                        {
                                this.items = this.items | ITEM_Shield.m_itemid;
                                if(!g_cts)
@@ -1538,7 +1523,7 @@ void player_powerups(entity this)
                {
                        if (!(STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS))
                        {
-                               STAT(SUPERWEAPONS_FINISHED, this) = 0;
+                               StatusEffects_remove(STATUSEFFECT_Superweapons, this, STATUSEFFECT_REMOVE_NORMAL);
                                this.items = this.items - (this.items & IT_SUPERWEAPON);
                                //Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_SUPERWEAPON_LOST, this.netname);
                                Send_Notification(NOTIF_ONE, this, MSG_CENTER, CENTER_SUPERWEAPON_LOST);
@@ -1549,8 +1534,8 @@ void player_powerups(entity this)
                        }
                        else
                        {
-                               play_countdown(this, STAT(SUPERWEAPONS_FINISHED, this), SND_POWEROFF);
-                               if (time > STAT(SUPERWEAPONS_FINISHED, this))
+                               play_countdown(this, StatusEffects_gettime(STATUSEFFECT_Superweapons, this), SND_POWEROFF);
+                               if (time > StatusEffects_gettime(STATUSEFFECT_Superweapons, this))
                                {
                                        this.items = this.items - (this.items & IT_SUPERWEAPON);
                                        STAT(WEAPONS, this) &= ~WEPSET_SUPERWEAPONS;
@@ -1561,7 +1546,7 @@ void player_powerups(entity this)
                }
                else if(STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS)
                {
-                       if (time < STAT(SUPERWEAPONS_FINISHED, this) || (this.items & IT_UNLIMITED_SUPERWEAPONS))
+                       if (time < StatusEffects_gettime(STATUSEFFECT_Superweapons, this) || (this.items & IT_UNLIMITED_SUPERWEAPONS))
                        {
                                this.items = this.items | IT_SUPERWEAPON;
                                if(!(this.items & IT_UNLIMITED_SUPERWEAPONS))
@@ -1573,13 +1558,14 @@ void player_powerups(entity this)
                        }
                        else
                        {
-                               STAT(SUPERWEAPONS_FINISHED, this) = 0;
+                               if(StatusEffects_active(STATUSEFFECT_Superweapons, this))
+                                       StatusEffects_remove(STATUSEFFECT_Superweapons, this, STATUSEFFECT_REMOVE_TIMEOUT);
                                STAT(WEAPONS, this) &= ~WEPSET_SUPERWEAPONS;
                        }
                }
-               else
+               else if(StatusEffects_active(STATUSEFFECT_Superweapons, this)) // cheaper to check than to update each frame!
                {
-                       STAT(SUPERWEAPONS_FINISHED, this) = 0;
+                       StatusEffects_remove(STATUSEFFECT_Superweapons, this, STATUSEFFECT_REMOVE_CLEAR);
                }
        }
 
@@ -1769,9 +1755,6 @@ void SpectateCopy(entity this, entity spectatee)
        this.items = spectatee.items;
        STAT(LAST_PICKUP, this) = STAT(LAST_PICKUP, spectatee);
        STAT(HIT_TIME, this) = STAT(HIT_TIME, spectatee);
-       STAT(STRENGTH_FINISHED, this) = STAT(STRENGTH_FINISHED, spectatee);
-       STAT(INVINCIBLE_FINISHED, this) = STAT(INVINCIBLE_FINISHED, spectatee);
-       STAT(SUPERWEAPONS_FINISHED, this) = STAT(SUPERWEAPONS_FINISHED, spectatee);
        STAT(AIR_FINISHED, this) = STAT(AIR_FINISHED, spectatee);
        STAT(PRESSED_KEYS, this) = STAT(PRESSED_KEYS, spectatee);
        STAT(WEAPONS, this) = STAT(WEAPONS, spectatee);