X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Ft_items.qc;h=d9bd7bdc9606d8b1399bc89efabede0f952d0c78;hb=e42b2d213c9c5fdb4ecd86e792364fdfc1d97853;hp=1029f7865682df59cdde8d83500552bd0503a8b7;hpb=bac31b218e747443d2e4c1f8d6b26b2bb71dddb8;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/t_items.qc b/qcsrc/common/t_items.qc index 1029f7865..d9bd7bdc9 100644 --- a/qcsrc/common/t_items.qc +++ b/qcsrc/common/t_items.qc @@ -174,8 +174,7 @@ NET_HANDLE(ENT_CLIENT_ITEM, bool isnew) if(sf & ISF_SIZE) { - float use_bigsize = ReadByte(); - setsize(this, '-16 -16 0', (use_bigsize) ? '16 16 48' : '16 16 32'); + setsize(this, '-16 -16 0', '16 16 48'); } if(sf & ISF_STATUS) // need to read/write status first so model can handle simple, fb etc. @@ -205,8 +204,6 @@ NET_HANDLE(ENT_CLIENT_ITEM, bool isnew) this.solid = SOLID_TRIGGER; //this.flags |= FL_ITEM; - bool use_bigsize = ReadByte(); - this.fade_end = ReadShort(); this.fade_start = ReadShort(); if(!warpzone_warpzones_exist && this.fade_start && !autocvar_cl_items_nofade) @@ -257,7 +254,7 @@ NET_HANDLE(ENT_CLIENT_ITEM, bool isnew) precache_model(this.mdl); _setmodel(this, this.mdl); - setsize(this, '-16 -16 0', (use_bigsize) ? '16 16 48' : '16 16 32'); + setsize(this, '-16 -16 0', '16 16 48'); } if(sf & ISF_COLORMAP) @@ -326,19 +323,14 @@ bool ItemSend(entity this, entity to, int sf) WriteAngle(MSG_ENTITY, this.angles_z); } - if(sf & ISF_SIZE) - { - Pickup p = this.itemdef; - WriteByte(MSG_ENTITY, p.instanceOfPowerup || p.instanceOfHealth || p.instanceOfArmor); - } + // sets size on the client, unused on server + //if(sf & ISF_SIZE) if(sf & ISF_STATUS) WriteByte(MSG_ENTITY, this.ItemStatus); if(sf & ISF_MODEL) { - Pickup p = this.itemdef; - WriteByte(MSG_ENTITY, p.instanceOfPowerup || p.instanceOfHealth || p.instanceOfArmor); WriteShort(MSG_ENTITY, this.fade_end); WriteShort(MSG_ENTITY, this.fade_start); @@ -743,7 +735,11 @@ bool Item_GiveAmmoTo(entity item, entity player, int res_type, float ammomax) return false; } else if (g_weapon_stay == 2) + { ammomax = min(amount, ammomax); + if(player_amount >= ammomax) + return false; + } else return false; if (amount < 0) @@ -1482,10 +1478,11 @@ spawnfunc(target_items) if(!this.superweapons_finished) this.superweapons_finished = autocvar_g_balance_superweapons_time; + string str; int n = tokenize_console(this.netname); if(argv(0) == "give") { - this.netname = substring(this.netname, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)); + str = substring(this.netname, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)); } else { @@ -1553,27 +1550,29 @@ spawnfunc(target_items) itemprefix = valueprefix = string_null; } - this.netname = ""; - this.netname = sprintf("%s %s%d %s", this.netname, itemprefix, boolean(this.items & IT_UNLIMITED_AMMO), "unlimited_weapon_ammo"); - this.netname = sprintf("%s %s%d %s", this.netname, itemprefix, boolean(this.items & IT_UNLIMITED_SUPERWEAPONS), "unlimited_superweapons"); - this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, this.strength_finished * boolean(this.items & ITEM_Strength.m_itemid), "strength"); - this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, this.invincible_finished * boolean(this.items & ITEM_Shield.m_itemid), "invincible"); - this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, this.superweapons_finished * boolean(this.items & IT_SUPERWEAPON), "superweapons"); - this.netname = sprintf("%s %s%d %s", this.netname, itemprefix, boolean(this.items & ITEM_Jetpack.m_itemid), "jetpack"); - this.netname = sprintf("%s %s%d %s", this.netname, itemprefix, boolean(this.items & ITEM_JetpackRegen.m_itemid), "fuel_regen"); - if(GetResource(this, RES_SHELLS) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResource(this, RES_SHELLS)), "shells"); - if(GetResource(this, RES_BULLETS) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResource(this, RES_BULLETS)), "nails"); - if(GetResource(this, RES_ROCKETS) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResource(this, RES_ROCKETS)), "rockets"); - if(GetResource(this, RES_CELLS) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResource(this, RES_CELLS)), "cells"); - if(GetResource(this, RES_PLASMA) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResource(this, RES_PLASMA)), "plasma"); - if(GetResource(this, RES_FUEL) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResource(this, RES_FUEL)), "fuel"); - if(GetResource(this, RES_HEALTH) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResource(this, RES_HEALTH)), "health"); - if(GetResource(this, RES_ARMOR) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResource(this, RES_ARMOR)), "armor"); - FOREACH(Buffs, it != BUFF_Null && (STAT(BUFFS, this) & it.m_itemid), this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, STAT(BUFF_TIME, this)), it.netname)); - FOREACH(Weapons, it != WEP_Null, this.netname = sprintf("%s %s%d %s", this.netname, itemprefix, !!(STAT(WEAPONS, this) & (it.m_wepset)), it.netname)); - } - this.netname = strzone(this.netname); - //print(this.netname, "\n"); + str = ""; + str = sprintf("%s %s%d %s", str, itemprefix, boolean(this.items & IT_UNLIMITED_AMMO), "unlimited_weapon_ammo"); + str = sprintf("%s %s%d %s", str, itemprefix, boolean(this.items & IT_UNLIMITED_SUPERWEAPONS), "unlimited_superweapons"); + str = sprintf("%s %s%d %s", str, valueprefix, this.strength_finished * boolean(this.items & ITEM_Strength.m_itemid), "strength"); + str = sprintf("%s %s%d %s", str, valueprefix, this.invincible_finished * boolean(this.items & ITEM_Shield.m_itemid), "invincible"); + str = sprintf("%s %s%d %s", str, valueprefix, this.superweapons_finished * boolean(this.items & IT_SUPERWEAPON), "superweapons"); + str = sprintf("%s %s%d %s", str, itemprefix, boolean(this.items & ITEM_Jetpack.m_itemid), "jetpack"); + str = sprintf("%s %s%d %s", str, itemprefix, boolean(this.items & ITEM_JetpackRegen.m_itemid), "fuel_regen"); + float res; + res = GetResource(this, RES_SHELLS); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "shells"); + res = GetResource(this, RES_BULLETS); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "nails"); + res = GetResource(this, RES_ROCKETS); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "rockets"); + res = GetResource(this, RES_CELLS); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "cells"); + res = GetResource(this, RES_PLASMA); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "plasma"); + res = GetResource(this, RES_FUEL); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "fuel"); + res = GetResource(this, RES_HEALTH); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "health"); + res = GetResource(this, RES_ARMOR); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "armor"); + // HACK: buffs share a single timer, so we need to include enabled buffs AFTER disabled ones to avoid loss + FOREACH(Buffs, it != BUFF_Null && !(STAT(BUFFS, this) & it.m_itemid), str = sprintf("%s %s%d %s", str, valueprefix, max(0, STAT(BUFF_TIME, this)), it.netname)); + FOREACH(Buffs, it != BUFF_Null && (STAT(BUFFS, this) & it.m_itemid), str = sprintf("%s %s%d %s", str, valueprefix, max(0, STAT(BUFF_TIME, this)), it.netname)); + FOREACH(Weapons, it != WEP_Null, str = sprintf("%s %s%d %s", str, itemprefix, !!(STAT(WEAPONS, this) & (it.m_wepset)), it.netname)); + } + this.netname = strzone(str); n = tokenize_console(this.netname); for(int j = 0; j < n; ++j) @@ -1671,17 +1670,19 @@ void GiveRot(entity e, float v0, float v1, .float rotfield, float rottime, .floa bool GiveResourceValue(entity e, int res_type, int op, int val) { int v0 = GetResource(e, res_type); + float new_val = 0; switch (op) { // min 100 cells = at least 100 cells - case OP_SET: SetResource(e, res_type, val); break; - case OP_MIN: SetResource(e, res_type, max(v0, val)); break; - case OP_MAX: SetResource(e, res_type, min(v0, val)); break; - case OP_PLUS: SetResource(e, res_type, v0 + val); break; - case OP_MINUS: SetResource(e, res_type, v0 - val); break; - } - int v1 = GetResource(e, res_type); - return v0 != v1; + case OP_SET: new_val = val; break; + case OP_MIN: new_val = max(v0, val); break; + case OP_MAX: new_val = min(v0, val); break; + case OP_PLUS: new_val = v0 + val; break; + case OP_MINUS: new_val = v0 - val; break; + default: return false; + } + + return SetResourceExplicit(e, res_type, new_val); } float GiveItems(entity e, float beginarg, float endarg)