]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/cl_client.qc
Make sure a vote is actually running before trying to count it when a client leaves
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / cl_client.qc
index 32ec6eb03c9ec32963287fa2075975639c9f307a..de2603437e253f69e2c2322706a55ba846f8c92f 100644 (file)
@@ -103,14 +103,7 @@ void ClientData_Touch(entity e)
        e.clientdata.SendFlags = 1;
 
        // make it spectatable
-       entity e2;
-       FOR_EACH_REALCLIENT(e2)
-       {
-               if(e2 != e)
-                       if(IS_SPEC(e2))
-                               if(e2.enemy == e)
-                                       e2.clientdata.SendFlags = 1;
-       }
+       FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != e && IS_SPEC(it) && it.enemy == e, LAMBDA(it.clientdata.SendFlags = 1));
 }
 
 .string netname_previous;
@@ -216,7 +209,7 @@ void PutObserverInServer()
        if(self.vehicle)
                vehicles_exit(VHEF_RELEASE);
 
-       WaypointSprite_PlayerDead();
+       WaypointSprite_PlayerDead(self);
 
        if(!mutator_returnvalue)  // mutator prevents resetting teams
                self.team = -1;  // move this as it is needed to log the player spectating in eventlog
@@ -280,7 +273,7 @@ void PutObserverInServer()
        self.crouch = false;
        self.revival_time = 0;
 
-       setorigin (self, (spot.origin + PL_VIEW_OFS)); // offset it so that the spectator spawns higher off the ground, looks better this way
+       setorigin (self, (spot.origin + STAT(PL_VIEW_OFS, NULL))); // offset it so that the spectator spawns higher off the ground, looks better this way
        self.prevorigin = self.origin;
        self.items = 0;
        self.weapons = '0 0 0';
@@ -289,7 +282,7 @@ void PutObserverInServer()
        setmodel(self, MDL_Null);
        self.drawonlytoclient = self;
 
-       setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY
+       setsize (self, STAT(PL_CROUCH_MIN, NULL), STAT(PL_CROUCH_MAX, NULL)); // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY
        self.view_ofs = '0 0 0'; // so that your view doesn't go into the ceiling with MOVETYPE_FLY_WORLDONLY, previously "PL_VIEW_OFS"
 
        PS(self).m_weapon = WEP_Null;
@@ -549,8 +542,8 @@ void PutClientInServer()
                this.drawonlytoclient = NULL;
 
                this.crouch = false;
-               this.view_ofs = PL_VIEW_OFS;
-               setsize(this, PL_MIN, PL_MAX);
+               this.view_ofs = STAT(PL_VIEW_OFS, NULL);
+               setsize(this, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL));
                this.spawnorigin = spot.origin;
                setorigin(this, spot.origin + '0 0 1' * (1 - this.mins.z - 24));
                // don't reset back to last position, even if new position is stuck in solid
@@ -738,21 +731,21 @@ Called when a client types 'kill' in the console
 */
 
 .float clientkill_nexttime;
-void ClientKill_Now_TeamChange()
-{SELFPARAM();
-       if(self.killindicator_teamchange == -1)
+void ClientKill_Now_TeamChange(entity this)
+{
+       if(this.killindicator_teamchange == -1)
        {
-               JoinBestTeam( self, false, true );
+               JoinBestTeam( this, false, true );
        }
-       else if(self.killindicator_teamchange == -2)
+       else if(this.killindicator_teamchange == -2)
        {
                if(blockSpectators)
-                       Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_SPECTATE_WARNING, autocvar_g_maxplayers_spectator_blocktime);
-               PutObserverInServer();
+                       Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_SPECTATE_WARNING, autocvar_g_maxplayers_spectator_blocktime);
+               WITH(entity, self, this, PutObserverInServer());
        }
        else
-               SV_ChangeTeam(self.killindicator_teamchange - 1);
-       self.killindicator_teamchange = 0;
+               WITH(entity, self, this, SV_ChangeTeam(this.killindicator_teamchange - 1));
+       this.killindicator_teamchange = 0;
 }
 
 void ClientKill_Now()
@@ -773,7 +766,7 @@ void ClientKill_Now()
        self.killindicator = world;
 
        if(self.killindicator_teamchange)
-               ClientKill_Now_TeamChange();
+               ClientKill_Now_TeamChange(self);
 
        if(IS_PLAYER(self))
                Damage(self, self, self, 100000, DEATH_KILL.m_id, self.origin, '0 0 0');
@@ -842,13 +835,13 @@ void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2
 
     if(!self.killindicator)
        {
-               if(self.deadflag == DEAD_NO)
+               if(!IS_DEAD(self))
                {
                        killtime = max(killtime, self.clientkill_nexttime - time);
                        self.clientkill_nexttime = time + killtime + autocvar_g_balance_kill_antispam;
                }
 
-               if(killtime <= 0 || !IS_PLAYER(self) || self.deadflag != DEAD_NO)
+               if(killtime <= 0 || !IS_PLAYER(self) || IS_DEAD(self))
                {
                        ClientKill_Now();
                }
@@ -923,7 +916,7 @@ void ClientKill ()
 {SELFPARAM();
        if(gameover) return;
        if(self.player_blocked) return;
-       if(self.frozen) return;
+       if(STAT(FROZEN, self)) return;
 
        ClientKill_TeamChange(0);
 }
@@ -1085,7 +1078,7 @@ void ClientConnect()
 
        this.netname_previous = strzone(this.netname);
 
-       Send_Notification(NOTIF_ALL, NULL, MSG_INFO, (teamplay ? APP_TEAM_ENT_4(this, INFO_JOIN_CONNECT_TEAM_) : INFO_JOIN_CONNECT), this.netname);
+       Send_Notification(NOTIF_ALL, NULL, MSG_INFO, ((teamplay && IS_PLAYER(this)) ? APP_TEAM_ENT_4(this, INFO_JOIN_CONNECT_TEAM_) : INFO_JOIN_CONNECT), this.netname);
 
        stuffcmd(this, clientstuff, "\n");
        stuffcmd(this, "cl_particles_reloadeffects\n"); // TODO do we still need this?
@@ -1251,6 +1244,9 @@ void ClientDisconnect ()
 
        self.playerid = 0;
        ReadyCount();
+       if(vote_called)
+       if(IS_REAL_CLIENT(self))
+               VoteCount(false);
 
        // free cvars
        GetCvars(-1);
@@ -1270,7 +1266,7 @@ void ChatBubbleThink()
 
        self.mdl = "";
 
-       if ( !self.owner.deadflag && IS_PLAYER(self.owner) )
+       if ( !IS_DEAD(self.owner) && IS_PLAYER(self.owner) )
        {
                if ( self.owner.active_minigame )
                        self.mdl = "models/sprites/minigame_busy.iqm";
@@ -1337,7 +1333,7 @@ void respawn()
                        SUB_SetFade (self, time + autocvar_g_respawn_ghosts_maxtime / 2 + random () * (autocvar_g_respawn_ghosts_maxtime - autocvar_g_respawn_ghosts_maxtime / 2), 1.5);
        }
 
-       CopyBody(1);
+       CopyBody(self, 1);
 
        self.effects |= EF_NODRAW; // prevent another CopyBody
        PutClientInServer();
@@ -1356,14 +1352,14 @@ void player_powerups ()
        // add a way to see what the items were BEFORE all of these checks for the mutator hook
        int items_prev = self.items;
 
-       if((self.items & IT_USING_JETPACK) && !self.deadflag && !gameover)
+       if((self.items & IT_USING_JETPACK) && !IS_DEAD(self) && !gameover)
                self.modelflags |= MF_ROCKET;
        else
                self.modelflags &= ~MF_ROCKET;
 
        self.effects &= ~(EF_RED | EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT | EF_FLAME | EF_NODEPTHTEST);
 
-       if((self.alpha < 0 || self.deadflag) && !self.vehicle) // don't apply the flags if the player is gibbed
+       if((self.alpha < 0 || IS_DEAD(self)) && !self.vehicle) // don't apply the flags if the player is gibbed
                return;
 
        Fire_ApplyDamage(self);
@@ -1530,7 +1526,7 @@ void player_regen ()
        regen_health_stable = autocvar_g_balance_health_regenstable;
        regen_health_rotstable = autocvar_g_balance_health_rotstable;
        if(!MUTATOR_CALLHOOK(PlayerRegen))
-       if(!self.frozen)
+       if(!STAT(FROZEN, self))
        {
                float mina, maxa, limith, limita;
                maxa = autocvar_g_balance_armor_rotstable;
@@ -1559,7 +1555,7 @@ void player_regen ()
                if(self.vehicle)
                        vehicles_exit(VHEF_RELEASE);
                if(self.event_damage)
-                       self.event_damage(self, self, 1, DEATH_ROT.m_id, self.origin, '0 0 0');
+                       self.event_damage(self, self, self, 1, DEATH_ROT.m_id, self.origin, '0 0 0');
        }
 
        if (!(self.items & IT_UNLIMITED_WEAPON_AMMO))
@@ -1647,7 +1643,7 @@ void SpectateCopy(entity this, entity spectatee)
        self.dmg_inflictor = spectatee.dmg_inflictor;
        self.v_angle = spectatee.v_angle;
        self.angles = spectatee.v_angle;
-       self.frozen = spectatee.frozen;
+       STAT(FROZEN, self) = STAT(FROZEN, spectatee);
        self.revive_progress = spectatee.revive_progress;
        if(!self.BUTTON_USE)
                self.fixangle = true;
@@ -1740,12 +1736,12 @@ bool Spectate(entity pl)
 
 bool SpectateNext()
 {SELFPARAM();
-       other = find(self.enemy, classname, "player");
+       other = find(self.enemy, classname, STR_PLAYER);
 
        if (MUTATOR_CALLHOOK(SpectateNext, self, other))
                other = spec_player;
        else if (!other)
-               other = find(other, classname, "player");
+               other = find(other, classname, STR_PLAYER);
 
        if(other) { SetSpectatee(self, other); }
 
@@ -1755,7 +1751,7 @@ bool SpectateNext()
 bool SpectatePrev()
 {SELFPARAM();
        // NOTE: chain order is from the highest to the lower entnum (unlike find)
-       other = findchain(classname, "player");
+       other = findchain(classname, STR_PLAYER);
        if (!other) // no player
                return false;
 
@@ -1798,7 +1794,7 @@ Update a respawn countdown display.
 void ShowRespawnCountdown()
 {SELFPARAM();
        float number;
-       if(self.deadflag == DEAD_NO) // just respawned?
+       if(!IS_DEAD(self)) // just respawned?
                return;
        else
        {
@@ -1834,7 +1830,7 @@ void LeaveSpectatorMode()
 
                        PutClientInServer();
 
-                       if(IS_PLAYER(self)) { Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_JOIN_PLAY, self.netname); }
+                       if(IS_PLAYER(self)) { Send_Notification(NOTIF_ALL, world, MSG_INFO, ((teamplay && this.team != -1) ? APP_TEAM_ENT_4(this, INFO_JOIN_PLAY_TEAM_) : INFO_JOIN_PLAY), self.netname); }
                }
                else
                        stuffcmd(self, "menu_showteamselect\n");
@@ -2056,17 +2052,17 @@ void PlayerUseKey()
        }
        else if(autocvar_g_vehicles_enter)
        {
-               if(!self.frozen)
-               if(self.deadflag == DEAD_NO)
+               if(!STAT(FROZEN, self))
+               if(!IS_DEAD(self))
                if(!gameover)
                {
                        entity head, closest_target = world;
-                       head = WarpZone_FindRadius(self.origin, autocvar_g_vehicles_enter_radius, TRUE);
+                       head = WarpZone_FindRadius(self.origin, autocvar_g_vehicles_enter_radius, true);
 
                        while(head) // find the closest acceptable target to enter
                        {
                                if(head.vehicle_flags & VHF_ISVEHICLE)
-                               if(head.deadflag == DEAD_NO)
+                               if(!IS_DEAD(head))
                                if(!head.owner || ((head.vehicle_flags & VHF_MULTISLOT) && SAME_TEAM(head.owner, self)))
                                if(head.takedamage != DAMAGE_NO)
                                {
@@ -2184,7 +2180,7 @@ void PlayerPreThink ()
                self.max_armorvalue = 0;
        }
 
-       if(self.frozen == 2)
+       if(STAT(FROZEN, self) == 2)
        {
                self.revive_progress = bound(0, self.revive_progress + frametime * self.revive_speed, 1);
                self.health = max(1, self.revive_progress * start_health);
@@ -2193,7 +2189,7 @@ void PlayerPreThink ()
                if(self.revive_progress >= 1)
                        Unfreeze(self);
        }
-       else if(self.frozen == 3)
+       else if(STAT(FROZEN, self) == 3)
        {
                self.revive_progress = bound(0, self.revive_progress - frametime * self.revive_speed, 1);
                self.health = max(0, autocvar_g_nades_ice_health + (start_health-autocvar_g_nades_ice_health) * self.revive_progress );
@@ -2202,7 +2198,7 @@ void PlayerPreThink ()
                {
                        if(self.vehicle)
                                vehicles_exit(VHEF_RELEASE);
-                       self.event_damage(self, self.frozen_by, 1, DEATH_NADE_ICE_FREEZE.m_id, self.origin, '0 0 0');
+                       self.event_damage(self, self, self.frozen_by, 1, DEATH_NADE_ICE_FREEZE.m_id, self.origin, '0 0 0');
                }
                else if ( self.revive_progress <= 0 )
                        Unfreeze(self);
@@ -2214,14 +2210,14 @@ void PlayerPreThink ()
        if(time > self.last_vehiclecheck)
        if(IS_PLAYER(self))
        if(!gameover)
-       if(!self.frozen)
+       if(!STAT(FROZEN, self))
        if(!self.vehicle)
-       if(self.deadflag == DEAD_NO)
+       if(!IS_DEAD(self))
        {
                entity veh;
                for(veh = world; (veh = findflags(veh, vehicle_flags, VHF_ISVEHICLE)); )
                if(vlen(veh.origin - self.origin) < autocvar_g_vehicles_enter_radius)
-               if(veh.deadflag == DEAD_NO)
+               if(!IS_DEAD(veh))
                if(veh.takedamage != DAMAGE_NO)
                if((veh.vehicle_flags & VHF_MULTISLOT) && SAME_TEAM(veh.owner, self))
                        Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_VEHICLE_ENTER_GUNNER);
@@ -2268,7 +2264,7 @@ void PlayerPreThink ()
                        player_powerups();
                }
 
-               if (self.deadflag != DEAD_NO)
+               if (IS_DEAD(self))
                {
                        if(self.personal && g_race_qualifying)
                        {
@@ -2340,7 +2336,7 @@ void PlayerPreThink ()
                        do_crouch = 0;
                if(self.vehicle)
                        do_crouch = 0;
-               if(self.frozen)
+               if(STAT(FROZEN, self))
                        do_crouch = 0;
 
                // WEAPONTODO: THIS SHIT NEEDS TO GO EVENTUALLY
@@ -2404,7 +2400,7 @@ void PlayerPreThink ()
                secrets_setstatus();
 
                // monsters status
-               monsters_setstatus();
+               monsters_setstatus(self);
 
                self.dmg_team = max(0, self.dmg_team - autocvar_g_teamdamage_resetspeed * frametime);
 
@@ -2472,7 +2468,7 @@ void PlayerPreThink ()
 
 void DrownPlayer(entity this)
 {
-       if(this.deadflag != DEAD_NO)
+       if(IS_DEAD(this))
                return;
 
        if (this.waterlevel != WATERLEVEL_SUBMERGED)