From: terencehill Date: Tue, 12 May 2020 19:26:36 +0000 (+0200) Subject: Fixes the superweapons portion of #2422 "target_items issues" X-Git-Tag: xonotic-v0.8.5~1078 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=cbaaedf5e63f6f24948c6f83d302c9ea9125a32c;p=xonotic%2Fxonotic-data.pk3dir.git Fixes the superweapons portion of #2422 "target_items issues" --- diff --git a/qcsrc/common/t_items.qc b/qcsrc/common/t_items.qc index d3f113d03..e1d9d583b 100644 --- a/qcsrc/common/t_items.qc +++ b/qcsrc/common/t_items.qc @@ -836,7 +836,7 @@ bool Item_GiveTo(entity item, entity player) if (item.superweapons_finished) { pickedup = true; - player.superweapons_finished = max(player.superweapons_finished, time) + item.superweapons_finished; + STAT(SUPERWEAPONS_FINISHED, player) = max(STAT(SUPERWEAPONS_FINISHED, player), time) + item.superweapons_finished; } // always eat teamed entities @@ -1719,14 +1719,14 @@ float GiveItems(entity e, float beginarg, float endarg) STAT(STRENGTH_FINISHED, e) = max(0, STAT(STRENGTH_FINISHED, e) - time); STAT(INVINCIBLE_FINISHED, e) = max(0, STAT(INVINCIBLE_FINISHED, e) - time); - e.superweapons_finished = max(0, e.superweapons_finished - time); + STAT(SUPERWEAPONS_FINISHED, e) = max(0, STAT(SUPERWEAPONS_FINISHED, e) - time); STAT(BUFF_TIME, e) = max(0, STAT(BUFF_TIME, e) - time); PREGIVE(e, items); PREGIVE_WEAPONS(e); PREGIVE(e, stat_STRENGTH_FINISHED); PREGIVE(e, stat_INVINCIBLE_FINISHED); - PREGIVE(e, superweapons_finished); + PREGIVE(e, stat_SUPERWEAPONS_FINISHED); PREGIVE_RESOURCE(e, RES_BULLETS); PREGIVE_RESOURCE(e, RES_CELLS); PREGIVE_RESOURCE(e, RES_PLASMA); @@ -1767,7 +1767,7 @@ float GiveItems(entity e, float beginarg, float endarg) got += GiveBit(e, items, ITEM_JetpackRegen.m_itemid, op, val); got += GiveValue(e, stat_STRENGTH_FINISHED, op, val); got += GiveValue(e, stat_INVINCIBLE_FINISHED, op, val); - got += GiveValue(e, superweapons_finished, op, val); + got += GiveValue(e, stat_SUPERWEAPONS_FINISHED, op, val); got += GiveBit(e, items, IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS, op, val); case "all": got += GiveBit(e, items, ITEM_Jetpack.m_itemid, op, val); @@ -1808,7 +1808,7 @@ float GiveItems(entity e, float beginarg, float endarg) got += GiveValue(e, stat_INVINCIBLE_FINISHED, op, val); break; case "superweapons": - got += GiveValue(e, superweapons_finished, op, val); + got += GiveValue(e, stat_SUPERWEAPONS_FINISHED, op, val); break; case "cells": got += GiveResourceValue(e, RES_CELLS, op, val); @@ -1863,7 +1863,7 @@ float GiveItems(entity e, float beginarg, float endarg) }); POSTGIVE_VALUE(e, stat_STRENGTH_FINISHED, 1, SND_POWERUP, SND_POWEROFF); POSTGIVE_VALUE(e, stat_INVINCIBLE_FINISHED, 1, SND_Shield, SND_POWEROFF); - //POSTGIVE_VALUE(e, superweapons_finished, 1, SND_Null, SND_Null); + //POSTGIVE_VALUE(e, stat_SUPERWEAPONS_FINISHED, 1, SND_Null, SND_Null); POSTGIVE_RESOURCE(e, RES_BULLETS, 0, SND_ITEMPICKUP, SND_Null); POSTGIVE_RESOURCE(e, RES_CELLS, 0, SND_ITEMPICKUP, SND_Null); POSTGIVE_RESOURCE(e, RES_PLASMA, 0, SND_ITEMPICKUP, SND_Null); @@ -1873,9 +1873,9 @@ float GiveItems(entity e, float beginarg, float endarg) POSTGIVE_RES_ROT(e, RES_ARMOR, 1, pauserotarmor_finished, autocvar_g_balance_pause_armor_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, SND_ARMOR25, SND_Null); POSTGIVE_RES_ROT(e, RES_HEALTH, 1, pauserothealth_finished, autocvar_g_balance_pause_health_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, SND_MEGAHEALTH, SND_Null); - if(e.superweapons_finished <= 0) + if(STAT(SUPERWEAPONS_FINISHED, e) <= 0) if(!g_weaponarena && (STAT(WEAPONS, e) & WEPSET_SUPERWEAPONS)) - e.superweapons_finished = autocvar_g_balance_superweapons_time; + STAT(SUPERWEAPONS_FINISHED, e) = autocvar_g_balance_superweapons_time; if(STAT(STRENGTH_FINISHED, e) <= 0) STAT(STRENGTH_FINISHED, e) = 0; @@ -1885,10 +1885,10 @@ float GiveItems(entity e, float beginarg, float endarg) STAT(INVINCIBLE_FINISHED, e) = 0; else STAT(INVINCIBLE_FINISHED, e) += time; - if(e.superweapons_finished <= 0) - e.superweapons_finished = 0; + if(STAT(SUPERWEAPONS_FINISHED, e) <= 0) + STAT(SUPERWEAPONS_FINISHED, e) = 0; else - e.superweapons_finished += time; + STAT(SUPERWEAPONS_FINISHED, e) += time; if(STAT(BUFF_TIME, e) <= 0) STAT(BUFF_TIME, e) = 0; else diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index 734dbc9f5..bb92c6ba0 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -336,7 +336,7 @@ void PutObserverInServer(entity this) this.pain_finished = 0; STAT(STRENGTH_FINISHED, this) = 0; STAT(INVINCIBLE_FINISHED, this) = 0; - this.superweapons_finished = 0; + STAT(SUPERWEAPONS_FINISHED, this) = 0; this.air_finished = 0; //this.dphitcontentsmask = 0; this.dphitcontentsmask = DPCONTENTS_SOLID; @@ -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; @@ -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; } } @@ -1684,7 +1684,7 @@ void SpectateCopy(entity this, entity 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); - this.superweapons_finished = spectatee.superweapons_finished; + 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); diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index c7ed5a568..9d7421987 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -50,7 +50,7 @@ float server_is_dedicated; .float pain_frame; //" .float crouch; // Crouching or not? -const .float superweapons_finished = _STAT(SUPERWEAPONS_FINISHED); +.float superweapons_finished; // NOTE: this field is used only by map entities, it does not directly apply the superweapons stat const .float air_finished = _STAT(AIR_FINISHED); .float cnt; // used in too many places diff --git a/qcsrc/server/weapons/throwing.qc b/qcsrc/server/weapons/throwing.qc index 7e8a061f0..ba039fc10 100644 --- a/qcsrc/server/weapons/throwing.qc +++ b/qcsrc/server/weapons/throwing.qc @@ -67,15 +67,15 @@ float W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vector }); if(superweapons <= 1) { - wep.superweapons_finished = own.superweapons_finished; - own.superweapons_finished = 0; + wep.superweapons_finished = STAT(SUPERWEAPONS_FINISHED, own); + STAT(SUPERWEAPONS_FINISHED, own) = 0; } else { - float timeleft = own.superweapons_finished - time; + float timeleft = STAT(SUPERWEAPONS_FINISHED, own) - time; float weptimeleft = timeleft / superweapons; wep.superweapons_finished = time + weptimeleft; - own.superweapons_finished -= weptimeleft; + STAT(SUPERWEAPONS_FINISHED, own) -= weptimeleft; } } }