From 043bc0248425f86ca567590c7e87bc19b7d3c251 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Sun, 4 Mar 2012 18:12:49 +0100 Subject: [PATCH] remove even more evil --- qcsrc/common/items.qc | 18 ++++++++++++++++++ qcsrc/common/items.qh | 2 ++ qcsrc/server/cl_client.qc | 2 +- qcsrc/server/g_damage.qc | 24 +++++++++++++++--------- qcsrc/server/t_items.qc | 1 - 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/qcsrc/common/items.qc b/qcsrc/common/items.qc index 3ddf8099f5..d7293ef69d 100644 --- a/qcsrc/common/items.qc +++ b/qcsrc/common/items.qc @@ -154,3 +154,21 @@ string W_FixWeaponOrder_ForceComplete(string order) return W_FixWeaponOrder(order, 1); } +void W_RandomWeapons(entity e, float n) +{ + float i, j; + WEPSET_DECLARE_A(remaining); + WEPSET_DECLARE_A(result); + WEPSET_COPY_AE(remaining, e); + WEPSET_CLEAR_A(result); + for(i = 0; i < n; ++i) + { + RandomSelection_Init(); + for(j = WEP_FIRST; j <= WEP_LAST; ++j) + if(WEPSET_CONTAINS_AW(remaining, j)) + RandomSelection_Add(world, j, string_null, 1, 1); + WEPSET_OR_AW(result, RandomSelection_chosen_float); + WEPSET_ANDNOT_AW(remaining, RandomSelection_chosen_float); + } + WEPSET_COPY_EA(e, result); +} diff --git a/qcsrc/common/items.qh b/qcsrc/common/items.qh index 89d2419ffb..6159291192 100644 --- a/qcsrc/common/items.qh +++ b/qcsrc/common/items.qh @@ -190,3 +190,5 @@ string W_NameWeaponOrder(string order); string W_FixWeaponOrder_BuildImpulseList(string o); string W_FixWeaponOrder_AllowIncomplete(string order); string W_FixWeaponOrder_ForceComplete(string order); + +void W_RandomWeapons(entity e, float n); diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 9c842d7c25..f34e22b0d9 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -758,7 +758,7 @@ void PutClientInServer (void) { if(g_weaponarena_random_with_laser) WEPSET_ANDNOT_EW(self, WEP_LASER); - self.weapons = randombits(self.weapons, g_weaponarena_random, FALSE); + W_RandomWeapons(self, g_weaponarena_random); if(g_weaponarena_random_with_laser) WEPSET_OR_EW(self, WEP_LASER); } diff --git a/qcsrc/server/g_damage.qc b/qcsrc/server/g_damage.qc index ef3b45aec5..59da8e086f 100644 --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@ -101,10 +101,9 @@ void UpdateFrags(entity player, float f) // NOTE: f=0 means still count as a (positive) kill, but count no frags for it void W_SwitchWeapon_Force(entity e, float w); +entity GiveFrags_randomweapons; void GiveFrags (entity attacker, entity targ, float f, float deathtype) { - WEPSET_DECLARE_A(w); - // TODO route through PlayerScores instead if(gameover) return; @@ -150,20 +149,27 @@ void GiveFrags (entity attacker, entity targ, float f, float deathtype) } else { + if(!GiveFrags_randomweapons) + { + GiveFrags_randomweapons = spawn(); + GiveFrags_randomweapons.classname = "GiveFrags_randomweapons"; + } + if(inWarmupStage) - WEPSET_COPY_AA(w, warmup_start_weapons); + WEPSET_COPY_EA(GiveFrags_randomweapons, warmup_start_weapons); else - WEPSET_COPY_AA(w, start_weapons); + WEPSET_COPY_EA(GiveFrags_randomweapons, start_weapons); // all others (including the culprit): remove - WEPSET_ANDNOT_AE(w, attacker); - WEPSET_ANDNOT_AW(w, culprit); + WEPSET_ANDNOT_EE(GiveFrags_randomweapons, attacker); + WEPSET_ANDNOT_EW(GiveFrags_randomweapons, culprit); // among the remaining ones, choose one by random - _WS_w = randombits(_WS_w, 1, FALSE); // FIXME - if(!WEPSET_EMPTY_A(w)) + W_RandomWeapons(GiveFrags_randomweapons, 1); + + if(!WEPSET_EMPTY_E(GiveFrags_randomweapons)) { - WEPSET_OR_EA(attacker, w); + WEPSET_OR_EE(attacker, GiveFrags_randomweapons); WEPSET_ANDNOT_EW(attacker, culprit); } } diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index c62601cc6c..288f1bbb81 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -348,7 +348,6 @@ float Item_GiveTo(entity item, entity player) float pickedup; float it; float i; - entity e; // if nothing happens to player, just return without taking the item pickedup = FALSE; -- 2.39.2