X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Ft_items.qc;h=28ea1add9f998c8b52f9f463d6e7ca8bc73f50d2;hp=320895b77059c39469f6dcd76086948f57e77a5c;hb=69eda62d02bc02ff50547bad514af3f7ce487413;hpb=16bb4a51347c40ae0655bba054bc7cf201538e45 diff --git a/qcsrc/common/t_items.qc b/qcsrc/common/t_items.qc index 320895b770..28ea1add9f 100644 --- a/qcsrc/common/t_items.qc +++ b/qcsrc/common/t_items.qc @@ -746,14 +746,14 @@ float Item_GiveAmmoTo(entity item, entity player, int resource_type, float ammom { return false; } - GiveResourceWithLimit(player, resource_type, amount, ammomax); + GiveOrTakeResourceWithLimit(player, resource_type, amount, ammomax); return true; } if (g_weapon_stay != 2) { return false; } - GiveResourceWithLimit(player, resource_type, amount, min(amount, ammomax)); + GiveOrTakeResourceWithLimit(player, resource_type, amount, min(amount, ammomax)); return true; } @@ -828,7 +828,8 @@ float Item_GiveTo(entity item, entity player) { pickedup = true; player.items |= its; - Send_Notification(NOTIF_ONE, player, MSG_INFO, INFO_ITEM_WEAPON_GOT, item.netname); + // TODO: we probably want to show a message in the console, but not this one! + //Send_Notification(NOTIF_ONE, player, MSG_INFO, INFO_ITEM_WEAPON_GOT, item.netname); } if (item.strength_finished) @@ -1074,12 +1075,12 @@ float ammo_pickupevalfunc(entity player, entity item) if(item.itemdef.instanceOfWeaponPickup) { entity ammo = NULL; - if(item.ammo_shells) { need_shells = true; ammo = ITEM_Shells; } - else if(item.ammo_nails) { need_nails = true; ammo = ITEM_Bullets; } - else if(item.ammo_rockets) { need_rockets = true; ammo = ITEM_Rockets; } - else if(item.ammo_cells) { need_cells = true; ammo = ITEM_Cells; } - else if(item.ammo_plasma) { need_plasma = true; ammo = ITEM_Plasma; } - else if(item.ammo_fuel) { need_fuel = true; ammo = ITEM_JetpackFuel; } + if(GetResourceAmount(item, RESOURCE_SHELLS)) { need_shells = true; ammo = ITEM_Shells; } + else if(GetResourceAmount(item, RESOURCE_BULLETS)) { need_nails = true; ammo = ITEM_Bullets; } + else if(GetResourceAmount(item, RESOURCE_ROCKETS)) { need_rockets = true; ammo = ITEM_Rockets; } + else if(GetResourceAmount(item, RESOURCE_CELLS)) { need_cells = true; ammo = ITEM_Cells; } + else if(GetResourceAmount(item, RESOURCE_PLASMA)) { need_plasma = true; ammo = ITEM_Plasma; } + else if(GetResourceAmount(item, RESOURCE_FUEL)) { need_fuel = true; ammo = ITEM_JetpackFuel; } if(!ammo) return 0; @@ -1107,23 +1108,23 @@ float ammo_pickupevalfunc(entity player, entity item) float noammorating = 0.5; - if ((need_shells) && (item.ammo_shells) && (GetResourceAmount(player, RESOURCE_SHELLS) < g_pickup_shells_max)) - c = item.ammo_shells / max(noammorating, GetResourceAmount(player, RESOURCE_SHELLS)); + if ((need_shells) && GetResourceAmount(item, RESOURCE_SHELLS) && (GetResourceAmount(player, RESOURCE_SHELLS) < g_pickup_shells_max)) + c = GetResourceAmount(item, RESOURCE_SHELLS) / max(noammorating, GetResourceAmount(player, RESOURCE_SHELLS)); - if ((need_nails) && (item.ammo_nails) && (GetResourceAmount(player, RESOURCE_BULLETS) < g_pickup_nails_max)) - c = item.ammo_nails / max(noammorating, GetResourceAmount(player, RESOURCE_BULLETS)); + if ((need_nails) && GetResourceAmount(item, RESOURCE_BULLETS) && (GetResourceAmount(player, RESOURCE_BULLETS) < g_pickup_nails_max)) + c = GetResourceAmount(item, RESOURCE_BULLETS) / max(noammorating, GetResourceAmount(player, RESOURCE_BULLETS)); - if ((need_rockets) && (item.ammo_rockets) && (GetResourceAmount(player, RESOURCE_ROCKETS) < g_pickup_rockets_max)) - c = item.ammo_rockets / max(noammorating, GetResourceAmount(player, RESOURCE_ROCKETS)); + if ((need_rockets) && GetResourceAmount(item, RESOURCE_ROCKETS) && (GetResourceAmount(player, RESOURCE_ROCKETS) < g_pickup_rockets_max)) + c = GetResourceAmount(item, RESOURCE_ROCKETS) / max(noammorating, GetResourceAmount(player, RESOURCE_ROCKETS)); - if ((need_cells) && (item.ammo_cells) && (GetResourceAmount(player, RESOURCE_CELLS) < g_pickup_cells_max)) - c = item.ammo_cells / max(noammorating, GetResourceAmount(player, RESOURCE_CELLS)); + if ((need_cells) && GetResourceAmount(item, RESOURCE_CELLS) && (GetResourceAmount(player, RESOURCE_CELLS) < g_pickup_cells_max)) + c = GetResourceAmount(item, RESOURCE_CELLS) / max(noammorating, GetResourceAmount(player, RESOURCE_CELLS)); - if ((need_plasma) && (item.ammo_plasma) && (GetResourceAmount(player, RESOURCE_PLASMA) < g_pickup_plasma_max)) - c = item.ammo_plasma / max(noammorating, GetResourceAmount(player, RESOURCE_PLASMA)); + if ((need_plasma) && GetResourceAmount(item, RESOURCE_PLASMA) && (GetResourceAmount(player, RESOURCE_PLASMA) < g_pickup_plasma_max)) + c = GetResourceAmount(item, RESOURCE_PLASMA) / max(noammorating, GetResourceAmount(player, RESOURCE_PLASMA)); - if ((need_fuel) && (item.ammo_fuel) && (GetResourceAmount(player, RESOURCE_FUEL) < g_pickup_fuel_max)) - c = item.ammo_fuel / max(noammorating, GetResourceAmount(player, RESOURCE_FUEL)); + if ((need_fuel) && GetResourceAmount(item, RESOURCE_FUEL) && (GetResourceAmount(player, RESOURCE_FUEL) < g_pickup_fuel_max)) + c = GetResourceAmount(item, RESOURCE_FUEL) / max(noammorating, GetResourceAmount(player, RESOURCE_FUEL)); rating *= min(c, 2); if(wpn) @@ -1136,8 +1137,8 @@ float healtharmor_pickupevalfunc(entity player, entity item) float c = 0; float rating = item.bot_pickupbasevalue; - float itemarmor = item.armorvalue; - float itemhealth = item.health; + float itemarmor = GetResourceAmount(item, RESOURCE_ARMOR); + float itemhealth = GetResourceAmount(item, RESOURCE_HEALTH); if(item.item_group) { @@ -1145,11 +1146,11 @@ float healtharmor_pickupevalfunc(entity player, entity item) itemhealth *= min(4, item.item_group_count); } - if (itemarmor && (player.armorvalue < item.max_armorvalue)) - c = itemarmor / max(1, player.armorvalue * 2/3 + player.health * 1/3); + if (itemarmor && (GetResourceAmount(player, RESOURCE_ARMOR) < item.max_armorvalue)) + c = itemarmor / max(1, GetResourceAmount(player, RESOURCE_ARMOR) * 2/3 + GetResourceAmount(player, RESOURCE_HEALTH) * 1/3); - if (itemhealth && (player.health < item.max_health)) - c = itemhealth / max(1, player.health); + if (itemhealth && (GetResourceAmount(player, RESOURCE_HEALTH) < item.max_health)) + c = itemhealth / max(1, GetResourceAmount(player, RESOURCE_HEALTH)); rating *= min(2, c); return rating; @@ -1338,7 +1339,7 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default if(def.instanceOfPowerup) this.ItemStatus |= ITS_ANIMATE1; - if(this.armorvalue || this.health) + if(GetResourceAmount(this, RESOURCE_ARMOR) || GetResourceAmount(this, RESOURCE_HEALTH)) this.ItemStatus |= ITS_ANIMATE2; } @@ -1558,14 +1559,14 @@ spawnfunc(target_items) 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(this.ammo_shells != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, this.ammo_shells), "shells"); - if(this.ammo_nails != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, this.ammo_nails), "nails"); - if(this.ammo_rockets != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, this.ammo_rockets), "rockets"); - if(this.ammo_cells != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, this.ammo_cells), "cells"); - if(this.ammo_plasma != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, this.ammo_plasma), "plasma"); - if(this.ammo_fuel != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, this.ammo_fuel), "fuel"); - if(this.health != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, this.health), "health"); - if(this.armorvalue != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, this.armorvalue), "armor"); + if(GetResourceAmount(this, RESOURCE_SHELLS) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResourceAmount(this, RESOURCE_SHELLS)), "shells"); + if(GetResourceAmount(this, RESOURCE_BULLETS) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResourceAmount(this, RESOURCE_BULLETS)), "nails"); + if(GetResourceAmount(this, RESOURCE_ROCKETS) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResourceAmount(this, RESOURCE_ROCKETS)), "rockets"); + if(GetResourceAmount(this, RESOURCE_CELLS) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResourceAmount(this, RESOURCE_CELLS)), "cells"); + if(GetResourceAmount(this, RESOURCE_PLASMA) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResourceAmount(this, RESOURCE_PLASMA)), "plasma"); + if(GetResourceAmount(this, RESOURCE_FUEL) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResourceAmount(this, RESOURCE_FUEL)), "fuel"); + if(GetResourceAmount(this, RESOURCE_HEALTH) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResourceAmount(this, RESOURCE_HEALTH)), "health"); + if(GetResourceAmount(this, RESOURCE_ARMOR) != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, GetResourceAmount(this, RESOURCE_ARMOR)), "armor"); FOREACH(Buffs, it != BUFF_Null, this.netname = sprintf("%s %s%d %s", this.netname, itemprefix, !!(STAT(BUFFS, this) & (it.m_itemid)), it.m_name)); FOREACH(Weapons, it != WEP_Null, this.netname = sprintf("%s %s%d %s", this.netname, itemprefix, !!(STAT(WEAPONS, this) & (it.m_wepset)), it.netname)); } @@ -1665,6 +1666,31 @@ void GiveRot(entity e, float v0, float v1, .float rotfield, float rottime, .floa else if(v0 > v1) e.(regenfield) = max(e.(regenfield), time + regentime); } +bool GiveResourceValue(entity e, int resource_type, int op, int val) +{ + int v0 = GetResourceAmount(e, resource_type); + switch (op) + { + case OP_SET: + SetResourceAmount(e, resource_type, val); + break; + case OP_MIN: + SetResourceAmount(e, resource_type, max(v0, val)); // min 100 cells = at least 100 cells + break; + case OP_MAX: + SetResourceAmount(e, resource_type, min(v0, val)); + break; + case OP_PLUS: + SetResourceAmount(e, resource_type, v0 + val); + break; + case OP_MINUS: + SetResourceAmount(e, resource_type, v0 - val); + break; + } + int v1 = GetResourceAmount(e, resource_type); + return v0 != v1; +} + float GiveItems(entity e, float beginarg, float endarg) { float got, i, val, op; @@ -1697,14 +1723,14 @@ float GiveItems(entity e, float beginarg, float endarg) PREGIVE(e, strength_finished); PREGIVE(e, invincible_finished); PREGIVE(e, superweapons_finished); - PREGIVE(e, ammo_nails); - PREGIVE(e, ammo_cells); - PREGIVE(e, ammo_plasma); - PREGIVE(e, ammo_shells); - PREGIVE(e, ammo_rockets); - PREGIVE(e, ammo_fuel); - PREGIVE(e, armorvalue); - PREGIVE(e, health); + PREGIVE_RESOURCE(e, RESOURCE_BULLETS); + PREGIVE_RESOURCE(e, RESOURCE_CELLS); + PREGIVE_RESOURCE(e, RESOURCE_PLASMA); + PREGIVE_RESOURCE(e, RESOURCE_SHELLS); + PREGIVE_RESOURCE(e, RESOURCE_ROCKETS); + PREGIVE_RESOURCE(e, RESOURCE_FUEL); + PREGIVE_RESOURCE(e, RESOURCE_ARMOR); + PREGIVE_RESOURCE(e, RESOURCE_HEALTH); for(i = beginarg; i < endarg; ++i) { @@ -1741,19 +1767,19 @@ float GiveItems(entity e, float beginarg, float endarg) got += GiveBit(e, items, IT_UNLIMITED_AMMO, op, val); case "all": got += GiveBit(e, items, ITEM_Jetpack.m_itemid, op, val); - got += GiveValue(e, health, op, val); - got += GiveValue(e, armorvalue, op, val); + got += GiveResourceValue(e, RESOURCE_HEALTH, op, val); + got += GiveResourceValue(e, RESOURCE_ARMOR, op, val); case "allweapons": FOREACH(Weapons, it != WEP_Null && !(it.spawnflags & WEP_FLAG_MUTATORBLOCKED), got += GiveWeapon(e, it.m_id, op, val)); //case "allbuffs": // all buffs makes a player god, do not want! //FOREACH(Buffs, it != BUFF_Null, got += GiveBuff(e, it.m_itemid, op, val)); case "allammo": - got += GiveValue(e, ammo_cells, op, val); - got += GiveValue(e, ammo_plasma, op, val); - got += GiveValue(e, ammo_shells, op, val); - got += GiveValue(e, ammo_nails, op, val); - got += GiveValue(e, ammo_rockets, op, val); - got += GiveValue(e, ammo_fuel, op, val); + got += GiveResourceValue(e, RESOURCE_CELLS, op, val); + got += GiveResourceValue(e, RESOURCE_PLASMA, op, val); + got += GiveResourceValue(e, RESOURCE_SHELLS, op, val); + got += GiveResourceValue(e, RESOURCE_BULLETS, op, val); + got += GiveResourceValue(e, RESOURCE_ROCKETS, op, val); + got += GiveResourceValue(e, RESOURCE_FUEL, op, val); break; case "unlimited_ammo": got += GiveBit(e, items, IT_UNLIMITED_AMMO, op, val); @@ -1780,29 +1806,29 @@ float GiveItems(entity e, float beginarg, float endarg) got += GiveValue(e, superweapons_finished, op, val); break; case "cells": - got += GiveValue(e, ammo_cells, op, val); + got += GiveResourceValue(e, RESOURCE_CELLS, op, val); break; case "plasma": - got += GiveValue(e, ammo_plasma, op, val); + got += GiveResourceValue(e, RESOURCE_PLASMA, op, val); break; case "shells": - got += GiveValue(e, ammo_shells, op, val); + got += GiveResourceValue(e, RESOURCE_SHELLS, op, val); break; case "nails": case "bullets": - got += GiveValue(e, ammo_nails, op, val); + got += GiveResourceValue(e, RESOURCE_BULLETS, op, val); break; case "rockets": - got += GiveValue(e, ammo_rockets, op, val); + got += GiveResourceValue(e, RESOURCE_ROCKETS, op, val); break; case "health": - got += GiveValue(e, health, op, val); + got += GiveResourceValue(e, RESOURCE_HEALTH, op, val); break; case "armor": - got += GiveValue(e, armorvalue, op, val); + got += GiveResourceValue(e, RESOURCE_ARMOR, op, val); break; case "fuel": - got += GiveValue(e, ammo_fuel, op, val); + got += GiveResourceValue(e, RESOURCE_FUEL, op, val); break; default: FOREACH(Buffs, it != BUFF_Null && Buff_UndeprecateName(cmd) == it.m_name, @@ -1833,14 +1859,14 @@ float GiveItems(entity e, float beginarg, float endarg) POSTGIVE_VALUE(e, strength_finished, 1, SND_POWERUP, SND_POWEROFF); POSTGIVE_VALUE(e, invincible_finished, 1, SND_Shield, SND_POWEROFF); //POSTGIVE_VALUE(e, superweapons_finished, 1, SND_Null, SND_Null); - POSTGIVE_VALUE(e, ammo_nails, 0, SND_ITEMPICKUP, SND_Null); - POSTGIVE_VALUE(e, ammo_cells, 0, SND_ITEMPICKUP, SND_Null); - POSTGIVE_VALUE(e, ammo_plasma, 0, SND_ITEMPICKUP, SND_Null); - POSTGIVE_VALUE(e, ammo_shells, 0, SND_ITEMPICKUP, SND_Null); - POSTGIVE_VALUE(e, ammo_rockets, 0, SND_ITEMPICKUP, SND_Null); - POSTGIVE_VALUE_ROT(e, ammo_fuel, 1, pauserotfuel_finished, autocvar_g_balance_pause_fuel_rot, pauseregen_finished, autocvar_g_balance_pause_fuel_regen, SND_ITEMPICKUP, SND_Null); - POSTGIVE_VALUE_ROT(e, armorvalue, 1, pauserotarmor_finished, autocvar_g_balance_pause_armor_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, SND_ARMOR25, SND_Null); - POSTGIVE_VALUE_ROT(e, health, 1, pauserothealth_finished, autocvar_g_balance_pause_health_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, SND_MEGAHEALTH, SND_Null); + POSTGIVE_RESOURCE(e, RESOURCE_BULLETS, 0, SND_ITEMPICKUP, SND_Null); + POSTGIVE_RESOURCE(e, RESOURCE_CELLS, 0, SND_ITEMPICKUP, SND_Null); + POSTGIVE_RESOURCE(e, RESOURCE_PLASMA, 0, SND_ITEMPICKUP, SND_Null); + POSTGIVE_RESOURCE(e, RESOURCE_SHELLS, 0, SND_ITEMPICKUP, SND_Null); + POSTGIVE_RESOURCE(e, RESOURCE_ROCKETS, 0, SND_ITEMPICKUP, SND_Null); + POSTGIVE_RESOURCE_ROT(e, RESOURCE_FUEL, 1, pauserotfuel_finished, autocvar_g_balance_pause_fuel_rot, pauseregen_finished, autocvar_g_balance_pause_fuel_regen, SND_ITEMPICKUP, SND_Null); + POSTGIVE_RESOURCE_ROT(e, RESOURCE_ARMOR, 1, pauserotarmor_finished, autocvar_g_balance_pause_armor_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, SND_ARMOR25, SND_Null); + POSTGIVE_RESOURCE_ROT(e, RESOURCE_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(WEAPONS, e) & WEPSET_SUPERWEAPONS)