From: Rudolf Polzer Date: Sat, 17 Dec 2011 16:45:57 +0000 (+0100) Subject: g_weapon_stay 2: ghost items "refill" ammo only X-Git-Tag: xonotic-v0.6.0~74^2~94^2~5^2~4 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=637fc4e59414931b58828c1706aa6e7d444614ef;p=xonotic%2Fxonotic-data.pk3dir.git g_weapon_stay 2: ghost items "refill" ammo only --- diff --git a/qcsrc/server/cl_weapons.qc b/qcsrc/server/cl_weapons.qc index c16be3748..a7592b4cb 100644 --- a/qcsrc/server/cl_weapons.qc +++ b/qcsrc/server/cl_weapons.qc @@ -220,7 +220,25 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto self = oldself; if(startitem_failed) return string_null; - if(doreduce) + if(doreduce && g_weapon_stay == 2) + { + for(i = 0, j = 1; i < 24; ++i, j *= 2) + { + if(wa & j) + { + ammofield = Item_CounterField(j); + wep.ammofield = 0; + + // if our weapon is loaded, give its load back to the player + if(self.(weapon_load[self.weapon]) > 0) + { + own.ammofield += self.(weapon_load[self.weapon]); + self.(weapon_load[self.weapon]) = -1; // schedule the weapon for reloading + } + } + } + } + else if(doreduce) { for(i = 0, j = 1; i < 24; ++i, j *= 2) { diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index dfe1a5cb0..3715e08c8 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -281,6 +281,41 @@ void Item_ScheduleInitialRespawn(entity e) Item_ScheduleRespawnIn(e, game_starttime - time + ITEM_RESPAWNTIME_INITIAL(e)); } +float Item_GiveAmmoTo(entity item, entity player, .float ammofield, float ammomax) +{ + if (!item.ammofield) + return FALSE; + + if (item.spawnshieldtime) + { + if ((player.ammofield < ammomax) || item.pickup_anyway) + { + player.ammofield = bound(player.ammofield, ammomax, player.ammofield + item.ammo_cells); + goto YEAH; + } + } + else if(g_weapon_stay == 2) + { + float mi = min(item.ammofield, ammomax); + if ((player.ammofield < mi) || item.pickup_anyway) + { + player.ammofield = max(player.ammofield, mi); + goto YEAH; + } + } + + return FALSE; + +:YEAH + if(ammofield == ammo_fuel) + player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + autocvar_g_balance_pause_fuel_rot); + if(ammofield == health) + player.pauserothealth_finished = max(player.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot); + if(ammofield == armorvalue) + player.pauserotarmor_finished = max(player.pauserotarmor_finished, time + autocvar_g_balance_pause_armor_rot); + return TRUE; +} + float Item_GiveTo(entity item, entity player) { float _switchweapon; @@ -297,23 +332,8 @@ float Item_GiveTo(entity item, entity player) { float prevcells = player.ammo_cells; - if(item.spawnshieldtime) - { - if (item.ammo_fuel) - if (player.ammo_fuel < g_pickup_fuel_max) - { - pickedup = TRUE; - player.ammo_fuel = bound(player.ammo_fuel, g_pickup_fuel_max, player.ammo_fuel + item.ammo_fuel); - player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + autocvar_g_balance_pause_fuel_rot); - } - - if (item.ammo_cells) - if (player.ammo_cells < g_pickup_cells_max) - { - pickedup = TRUE; - player.ammo_cells = bound(player.ammo_cells, g_pickup_cells_max, player.ammo_cells + item.ammo_cells); - } - } + Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max); + Item_GiveAmmoTo(item, player, ammo_cells, 999); if(player.ammo_cells > prevcells) { @@ -385,40 +405,13 @@ float Item_GiveTo(entity item, entity player) if not(player.weapons & W_WeaponBit(player.switchweapon)) _switchweapon = TRUE; - if(item.spawnshieldtime) - { - if (item.ammo_shells) - if ((player.ammo_shells < g_pickup_shells_max) || item.pickup_anyway) - { - pickedup = TRUE; - player.ammo_shells = bound(player.ammo_shells, g_pickup_shells_max, player.ammo_shells + item.ammo_shells); - } - if (item.ammo_nails) - if ((player.ammo_nails < g_pickup_nails_max) || item.pickup_anyway) - { - pickedup = TRUE; - player.ammo_nails = bound(player.ammo_nails, g_pickup_nails_max, player.ammo_nails + item.ammo_nails); - } - if (item.ammo_rockets) - if ((player.ammo_rockets < g_pickup_rockets_max) || item.pickup_anyway) - { - pickedup = TRUE; - player.ammo_rockets = bound(player.ammo_rockets, g_pickup_rockets_max, player.ammo_rockets + item.ammo_rockets); - } - if (item.ammo_cells) - if ((player.ammo_cells < g_pickup_cells_max) || item.pickup_anyway) - { - pickedup = TRUE; - player.ammo_cells = bound(player.ammo_cells, g_pickup_cells_max, player.ammo_cells + item.ammo_cells); - } - if (item.ammo_fuel) - if ((player.ammo_fuel < g_pickup_fuel_max) || item.pickup_anyway) - { - pickedup = TRUE; - player.ammo_fuel = bound(player.ammo_fuel, g_pickup_fuel_max, player.ammo_fuel + item.ammo_fuel); - player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + autocvar_g_balance_pause_fuel_rot); - } - } + Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max); + Item_GiveAmmoTo(item, player, ammo_shells, g_pickup_shells_max); + Item_GiveAmmoTo(item, player, ammo_nails, g_pickup_nails_max); + Item_GiveAmmoTo(item, player, ammo_rockets, g_pickup_rockets_max); + Item_GiveAmmoTo(item, player, ammo_cells, g_pickup_cells_max); + Item_GiveAmmoTo(item, player, health, item.max_health); + Item_GiveAmmoTo(item, player, armorvalue, item.max_armorvalue); if (item.flags & FL_WEAPON) if ((it = item.weapons - (item.weapons & player.weapons)) || (g_pickup_weapons_anyway)) @@ -439,7 +432,7 @@ float Item_GiveTo(entity item, entity player) sprint (player, strcat("You got the ^2", item.netname, "\n")); } - if (item.strength_finished) + if (item.strength_finished) { pickedup = TRUE; player.strength_finished = max(player.strength_finished, time) + autocvar_g_balance_powerup_strength_time; @@ -449,21 +442,6 @@ float Item_GiveTo(entity item, entity player) pickedup = TRUE; player.invincible_finished = max(player.invincible_finished, time) + autocvar_g_balance_powerup_invincible_time; } - - if (item.health) - if ((player.health < item.max_health) || item.pickup_anyway) - { - pickedup = TRUE; - player.health = bound(player.health, item.max_health, player.health + item.health); - player.pauserothealth_finished = max(player.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot); - } - if (item.armorvalue) - if ((player.armorvalue < item.max_armorvalue) || item.pickup_anyway) - { - pickedup = TRUE; - player.armorvalue = bound(player.armorvalue, item.max_armorvalue, player.armorvalue + item.armorvalue); - player.pauserotarmor_finished = max(player.pauserotarmor_finished, time + autocvar_g_balance_pause_armor_rot); - } } :skip