X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fclient.qc;h=bb92c6ba066ee3a25b809fa9d79d76dfc9967ef7;hp=3592f33ad929f3588a2c190bd903c8804aece1da;hb=cbaaedf5e63f6f24948c6f83d302c9ea9125a32c;hpb=909bca4321ebb4211612f8099c2865e1c6787415 diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index 3592f33ad9..bb92c6ba06 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -334,10 +334,10 @@ void PutObserverInServer(entity this) this.fade_time = 0; this.pain_frame = 0; this.pain_finished = 0; - this.strength_finished = 0; - this.invincible_finished = 0; - this.superweapons_finished = 0; - this.air_finished_stat = 0; + STAT(STRENGTH_FINISHED, this) = 0; + STAT(INVINCIBLE_FINISHED, this) = 0; + STAT(SUPERWEAPONS_FINISHED, this) = 0; + this.air_finished = 0; //this.dphitcontentsmask = 0; this.dphitcontentsmask = DPCONTENTS_SOLID; if (autocvar_g_playerclip_collisions) @@ -589,7 +589,7 @@ void PutPlayerInServer(entity this) PS(this).dual_weapons = '0 0 0'; - this.superweapons_finished = (STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS) ? time + autocvar_g_balance_superweapons_time : 0; + STAT(SUPERWEAPONS_FINISHED, this) = (STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS) ? time + autocvar_g_balance_superweapons_time : 0; this.items = start_items; @@ -638,8 +638,8 @@ void PutPlayerInServer(entity this) this.punchangle = '0 0 0'; this.punchvector = '0 0 0'; - this.strength_finished = 0; - this.invincible_finished = 0; + STAT(STRENGTH_FINISHED, this) = 0; + STAT(INVINCIBLE_FINISHED, this) = 0; this.fire_endtime = -1; STAT(REVIVE_PROGRESS, this) = 0; this.revival_time = 0; @@ -648,7 +648,7 @@ void PutPlayerInServer(entity this) STAT(BUFFS, this) = 0; STAT(BUFF_TIME, this) = 0; - this.air_finished = time + autocvar_g_balance_contents_drowndelay; + this.air_finished = 0; this.waterlevel = WATERLEVEL_NONE; this.watertype = CONTENT_EMPTY; @@ -1415,9 +1415,9 @@ void player_powerups(entity this) { if (this.items & ITEM_Strength.m_itemid) { - play_countdown(this, this.strength_finished, SND_POWEROFF); + play_countdown(this, STAT(STRENGTH_FINISHED, this), SND_POWEROFF); this.effects = this.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT); - if (time > this.strength_finished) + if (time > STAT(STRENGTH_FINISHED, this)) { this.items = this.items - (this.items & ITEM_Strength.m_itemid); //Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_POWERDOWN_STRENGTH, this.netname); @@ -1426,7 +1426,7 @@ void player_powerups(entity this) } else { - if (time < this.strength_finished) + if (time < STAT(STRENGTH_FINISHED, this)) { this.items = this.items | ITEM_Strength.m_itemid; if(!g_cts) @@ -1436,9 +1436,9 @@ void player_powerups(entity this) } if (this.items & ITEM_Shield.m_itemid) { - play_countdown(this, this.invincible_finished, SND_POWEROFF); + play_countdown(this, STAT(INVINCIBLE_FINISHED, this), SND_POWEROFF); this.effects = this.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT); - if (time > this.invincible_finished) + if (time > STAT(INVINCIBLE_FINISHED, this)) { this.items = this.items - (this.items & ITEM_Shield.m_itemid); //Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_POWERDOWN_SHIELD, this.netname); @@ -1447,7 +1447,7 @@ void player_powerups(entity this) } else { - if (time < this.invincible_finished) + if (time < STAT(INVINCIBLE_FINISHED, this)) { this.items = this.items | ITEM_Shield.m_itemid; if(!g_cts) @@ -1459,7 +1459,7 @@ void player_powerups(entity this) { if (!(STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS)) { - this.superweapons_finished = 0; + STAT(SUPERWEAPONS_FINISHED, this) = 0; 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); @@ -1470,8 +1470,8 @@ void player_powerups(entity this) } else { - play_countdown(this, this.superweapons_finished, SND_POWEROFF); - if (time > this.superweapons_finished) + play_countdown(this, STAT(SUPERWEAPONS_FINISHED, this), SND_POWEROFF); + if (time > STAT(SUPERWEAPONS_FINISHED, this)) { this.items = this.items - (this.items & IT_SUPERWEAPON); STAT(WEAPONS, this) &= ~WEPSET_SUPERWEAPONS; @@ -1482,7 +1482,7 @@ void player_powerups(entity this) } else if(STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS) { - if (time < this.superweapons_finished || (this.items & IT_UNLIMITED_SUPERWEAPONS)) + if (time < STAT(SUPERWEAPONS_FINISHED, this) || (this.items & IT_UNLIMITED_SUPERWEAPONS)) { this.items = this.items | IT_SUPERWEAPON; if(!(this.items & IT_UNLIMITED_SUPERWEAPONS)) @@ -1494,13 +1494,13 @@ void player_powerups(entity this) } else { - this.superweapons_finished = 0; + STAT(SUPERWEAPONS_FINISHED, this) = 0; STAT(WEAPONS, this) &= ~WEPSET_SUPERWEAPONS; } } else { - this.superweapons_finished = 0; + STAT(SUPERWEAPONS_FINISHED, this) = 0; } } @@ -1537,7 +1537,7 @@ float CalcRot(float current, float stable, float rotfactor, float rotframetime) return max(stable, current + (stable - current) * rotfactor * rotframetime); } -void RotRegen(entity this, int res, float regenstable, float regenfactor, float regenlinear, float regenframetime, float rotstable, float rotfactor, float rotlinear, float rotframetime, float limit) +void RotRegen(entity this, int res, float regenstable, float regenfactor, float regenlinear, float regenframetime, float rotstable, float rotfactor, float rotlinear, float rotframetime, float limit_mod) { float old = GetResource(this, res); float current = old; @@ -1558,6 +1558,7 @@ void RotRegen(entity this, int res, float regenstable, float regenfactor, float } } + float limit = GetResourceLimit(this, res) * limit_mod; if(current > limit) current = limit; @@ -1592,24 +1593,16 @@ void player_regen(entity this) if(!mutator_returnvalue) if(!STAT(FROZEN, this)) { - float mina, maxa, limith, limita; - maxa = autocvar_g_balance_armor_rotstable; - mina = autocvar_g_balance_armor_regenstable; - limith = GetResourceLimit(this, RES_HEALTH); - limita = GetResourceLimit(this, RES_ARMOR); - - regen_health_rotstable = regen_health_rotstable * max_mod; - regen_health_stable = regen_health_stable * max_mod; - limith = limith * limit_mod; - limita = limita * limit_mod; + float maxa = autocvar_g_balance_armor_rotstable; + float mina = autocvar_g_balance_armor_regenstable; RotRegen(this, RES_ARMOR, mina, autocvar_g_balance_armor_regen, autocvar_g_balance_armor_regenlinear, regen_mod * frametime * (time > this.pauseregen_finished), maxa, autocvar_g_balance_armor_rot, autocvar_g_balance_armor_rotlinear, - rot_mod * frametime * (time > this.pauserotarmor_finished), limita); + rot_mod * frametime * (time > this.pauserotarmor_finished), limit_mod); - RotRegen(this, RES_HEALTH, regen_health_stable, regen_health, regen_health_linear, - regen_mod * frametime * (time > this.pauseregen_finished), regen_health_rotstable, regen_health_rot, regen_health_rotlinear, - rot_mod * frametime * (time > this.pauserothealth_finished), limith); + RotRegen(this, RES_HEALTH, regen_health_stable * max_mod, regen_health, regen_health_linear, + regen_mod * frametime * (time > this.pauseregen_finished), regen_health_rotstable * max_mod, regen_health_rot, regen_health_rotlinear, + rot_mod * frametime * (time > this.pauserothealth_finished), limit_mod); } // if player rotted to death... die! @@ -1624,15 +1617,12 @@ void player_regen(entity this) if (!(this.items & IT_UNLIMITED_AMMO)) { - float minf, maxf, limitf; - - maxf = autocvar_g_balance_fuel_rotstable; - minf = autocvar_g_balance_fuel_regenstable; - limitf = GetResourceLimit(this, RES_FUEL); + float maxf = autocvar_g_balance_fuel_rotstable; + float minf = autocvar_g_balance_fuel_regenstable; RotRegen(this, RES_FUEL, minf, autocvar_g_balance_fuel_regen, autocvar_g_balance_fuel_regenlinear, frametime * (time > this.pauseregen_finished) * ((this.items & ITEM_JetpackRegen.m_itemid) != 0), - maxf, autocvar_g_balance_fuel_rot, autocvar_g_balance_fuel_rotlinear, frametime * (time > this.pauserotfuel_finished), limitf); + maxf, autocvar_g_balance_fuel_rot, autocvar_g_balance_fuel_rotlinear, frametime * (time > this.pauserotfuel_finished), 1); } } @@ -1692,10 +1682,10 @@ 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); - this.strength_finished = spectatee.strength_finished; - this.invincible_finished = spectatee.invincible_finished; - this.superweapons_finished = spectatee.superweapons_finished; - this.air_finished_stat = spectatee.air_finished_stat; + STAT(STRENGTH_FINISHED, this) = STAT(STRENGTH_FINISHED, spectatee); + STAT(INVINCIBLE_FINISHED, this) = STAT(INVINCIBLE_FINISHED, spectatee); + STAT(SUPERWEAPONS_FINISHED, this) = STAT(SUPERWEAPONS_FINISHED, spectatee); + this.air_finished = spectatee.air_finished; STAT(PRESSED_KEYS, this) = STAT(PRESSED_KEYS, spectatee); STAT(WEAPONS, this) = STAT(WEAPONS, spectatee); this.punchangle = spectatee.punchangle; @@ -1999,11 +1989,11 @@ int nJoinAllowed(entity this, entity ignore) else if(currentlyPlaying < player_limit) free_slots = min(maxclients - totalClients, player_limit - currentlyPlaying); - static float join_prevent_msg_time = 0; - if(this && ignore && !free_slots && time > join_prevent_msg_time) + static float msg_time = 0; + if(this && !this.caplayer && ignore && !free_slots && time > msg_time) { Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_JOIN_PREVENT); - join_prevent_msg_time = time + 3; + msg_time = time + 0.5; } return free_slots; @@ -2281,7 +2271,8 @@ void ObserverThink(entity this) if(this.flags & FL_SPAWNING) { this.flags &= ~FL_SPAWNING; - Join(this); + if(joinAllowed(this)) + Join(this); return; } } @@ -2620,22 +2611,23 @@ void DrownPlayer(entity this) if (this.waterlevel != WATERLEVEL_SUBMERGED || this.vehicle) { - if(this.air_finished < time) + if(this.air_finished && this.air_finished < time) PlayerSound(this, playersound_gasp, CH_PLAYER, VOL_BASE, VOICETYPE_PLAYERSOUND); - this.air_finished = time + autocvar_g_balance_contents_drowndelay; - this.air_finished_stat = 0; + this.air_finished = 0; } - else if (this.air_finished < time) - { // drown! - if (this.pain_finished < time) - { - Damage (this, NULL, NULL, autocvar_g_balance_contents_playerdamage_drowning * autocvar_g_balance_contents_damagerate, DEATH_DROWN.m_id, DMG_NOWEP, this.origin, '0 0 0'); - this.pain_finished = time + 0.5; + else + { + if (!this.air_finished) + this.air_finished = time + autocvar_g_balance_contents_drowndelay; + if (this.air_finished < time) + { // drown! + if (this.pain_finished < time) + { + Damage (this, NULL, NULL, autocvar_g_balance_contents_playerdamage_drowning * autocvar_g_balance_contents_damagerate, DEATH_DROWN.m_id, DMG_NOWEP, this.origin, '0 0 0'); + this.pain_finished = time + 0.5; + } } - this.air_finished_stat = this.air_finished; } - else - this.air_finished_stat = this.air_finished; } .bool move_qcphysics;