X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Ft_items.qc;h=674793bca16c70ef4bb53c3a21032f2623e3b640;hb=0c6b993abfdde30411dc771643b8d25b8377cb50;hp=2c42e472847794b4440be0d2675886ebd0014bca;hpb=c4d74d87a80b9cbbac1d6bfcaa6f15bac5ee0db5;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/t_items.qc b/qcsrc/common/t_items.qc index 2c42e4728..674793bca 100644 --- a/qcsrc/common/t_items.qc +++ b/qcsrc/common/t_items.qc @@ -671,7 +671,119 @@ void Item_ScheduleInitialRespawn(entity e) Item_ScheduleRespawnIn(e, max(0, game_starttime - time) + ((e.respawntimestart) ? e.respawntimestart : ITEM_RESPAWNTIME_INITIAL(e))); } -float Item_GiveAmmoTo(entity item, entity player, .float ammotype, float ammomax, float mode) +void GivePlayerResource(entity player, .float resource_type, float amount) +{ + if (amount == 0) + { + return; + } + switch (resource_type) + { + case health: + { + // Ugly hack. We do not check if health goes beyond hard limit since + // currently it is done in player_regen. We need to bring back this + // check when other code is ported to this function. + player.health = bound(player.health, player.health + amount, + autocvar_g_balance_health_limit); + // Correct code: + //player.health = bound(player.health, player.health + amount, + // min(autocvar_g_balance_health_limit, + // RESOURCE_AMOUNT_HARD_LIMIT)); + player.pauserothealth_finished = max(player.pauserothealth_finished, + time + autocvar_g_balance_pause_health_rot); + return; + } + case armorvalue: + { + // Ugly hack. We do not check if armor goes beyond hard limit since + // currently it is done in player_regen. We need to bring back this + // check when other code is ported to this function. + player.armorvalue = bound(player.armorvalue, player.armorvalue + + amount, autocvar_g_balance_armor_limit); + // Correct code: + //player.armorvalue = bound(player.armorvalue, player.armorvalue + + // amount, min(autocvar_g_balance_armor_limit, + // RESOURCE_AMOUNT_HARD_LIMIT)); + player.pauserotarmor_finished = max(player.pauserotarmor_finished, + time + autocvar_g_balance_pause_armor_rot); + return; + } + case ammo_shells: + case ammo_nails: + case ammo_rockets: + case ammo_cells: + case ammo_plasma: + { + GivePlayerAmmo(player, resource_type, amount); + return; + } + case ammo_fuel: + { + player.ammo_fuel = bound(player.ammo_fuel, player.ammo_fuel + + amount, min(g_pickup_fuel_max, RESOURCE_AMOUNT_HARD_LIMIT)); + player.pauserotfuel_finished = max(player.pauserotfuel_finished, + time + autocvar_g_balance_pause_fuel_rot); + return; + } + } +} + +void GivePlayerHealth(entity player, float amount) +{ + GivePlayerResource(player, health, amount); +} + +void GivePlayerArmor(entity player, float amount) +{ + GivePlayerResource(player, armorvalue, amount); +} + +void GivePlayerAmmo(entity player, .float ammotype, float amount) +{ + if (amount == 0) + { + return; + } + float maxvalue = RESOURCE_AMOUNT_HARD_LIMIT; + switch (ammotype) + { + case ammo_shells: + { + maxvalue = g_pickup_shells_max; + break; + } + case ammo_cells: + { + maxvalue = g_pickup_cells_max; + break; + } + case ammo_rockets: + { + maxvalue = g_pickup_rockets_max; + break; + } + case ammo_plasma: + { + maxvalue = g_pickup_plasma_max; + break; + } + case ammo_nails: + { + maxvalue = g_pickup_nails_max; + break; + } + } + player.(ammotype) = min(player.(ammotype) + amount, + min(maxvalue, RESOURCE_AMOUNT_HARD_LIMIT)); +} + +void GivePlayerFuel(entity player, float amount) +{ + GivePlayerResource(player, ammo_fuel, amount); +} + +float Item_GiveAmmoTo(entity item, entity player, .float ammotype, float ammomax) { if (!item.(ammotype)) return false; @@ -680,8 +792,13 @@ float Item_GiveAmmoTo(entity item, entity player, .float ammotype, float ammomax { if ((player.(ammotype) < ammomax) || item.pickup_anyway > 0) { - player.(ammotype) = bound(player.(ammotype), ammomax, player.(ammotype) + item.(ammotype)); - goto YEAH; + float amount = item.(ammotype); + if ((player.(ammotype) + amount) > ammomax) + { + amount = ammomax - player.(ammotype); + } + GivePlayerResource(player, ammotype, amount); + return true; } } else if(g_weapon_stay == 2) @@ -689,29 +806,11 @@ float Item_GiveAmmoTo(entity item, entity player, .float ammotype, float ammomax float mi = min(item.(ammotype), ammomax); if (player.(ammotype) < mi) { - player.(ammotype) = mi; - goto YEAH; + GivePlayerResource(player, ammotype, mi - player.(ammotype)); } + return true; } - return false; - -LABEL(YEAH) - switch(mode) - { - case ITEM_MODE_FUEL: - player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + autocvar_g_balance_pause_fuel_rot); - break; - case ITEM_MODE_HEALTH: - player.pauserothealth_finished = max(player.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot); - break; - case ITEM_MODE_ARMOR: - player.pauserotarmor_finished = max(player.pauserotarmor_finished, time + autocvar_g_balance_pause_armor_rot); - break; - default: - break; - } - return true; } float Item_GiveTo(entity item, entity player) @@ -740,16 +839,14 @@ float Item_GiveTo(entity item, entity player) } } } - - pickedup |= Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max, ITEM_MODE_FUEL); - pickedup |= Item_GiveAmmoTo(item, player, ammo_shells, g_pickup_shells_max, ITEM_MODE_NONE); - pickedup |= Item_GiveAmmoTo(item, player, ammo_nails, g_pickup_nails_max, ITEM_MODE_NONE); - pickedup |= Item_GiveAmmoTo(item, player, ammo_rockets, g_pickup_rockets_max, ITEM_MODE_NONE); - pickedup |= Item_GiveAmmoTo(item, player, ammo_cells, g_pickup_cells_max, ITEM_MODE_NONE); - pickedup |= Item_GiveAmmoTo(item, player, ammo_plasma, g_pickup_plasma_max, ITEM_MODE_NONE); - pickedup |= Item_GiveAmmoTo(item, player, health, item.max_health, ITEM_MODE_HEALTH); - pickedup |= Item_GiveAmmoTo(item, player, armorvalue, item.max_armorvalue, ITEM_MODE_ARMOR); - + pickedup |= Item_GiveAmmoTo(item, player, health, item.max_health); + pickedup |= Item_GiveAmmoTo(item, player, armorvalue, item.max_armorvalue); + pickedup |= Item_GiveAmmoTo(item, player, ammo_shells, g_pickup_shells_max); + pickedup |= Item_GiveAmmoTo(item, player, ammo_nails, g_pickup_nails_max); + pickedup |= Item_GiveAmmoTo(item, player, ammo_rockets, g_pickup_rockets_max); + pickedup |= Item_GiveAmmoTo(item, player, ammo_cells, g_pickup_cells_max); + pickedup |= Item_GiveAmmoTo(item, player, ammo_plasma, g_pickup_plasma_max); + pickedup |= Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max); if (item.itemdef.instanceOfWeaponPickup) { WepSet w;