From 82b4d369b087f95924653a9ef89bbfff1ea83848 Mon Sep 17 00:00:00 2001 From: Jbleezy Date: Sat, 27 Jan 2024 05:11:58 -0800 Subject: [PATCH] Mule Kick: save additional weapon slot properly Search & Rez: fix Mule Kick weapon not being saved if alive on round restart --- scripts/zm/_zm_reimagined.gsc | 56 ++++++++++- scripts/zm/replaced/_zm.gsc | 113 +++++++++++----------- scripts/zm/replaced/_zm_game_module.gsc | 12 ++- scripts/zm/replaced/_zm_perks.gsc | 4 + scripts/zm/replaced/_zm_weap_emp_bomb.gsc | 2 +- 5 files changed, 122 insertions(+), 65 deletions(-) diff --git a/scripts/zm/_zm_reimagined.gsc b/scripts/zm/_zm_reimagined.gsc index 00a4f92b..a03d7ebe 100644 --- a/scripts/zm/_zm_reimagined.gsc +++ b/scripts/zm/_zm_reimagined.gsc @@ -2637,14 +2637,18 @@ additionalprimaryweapon_indicator() vars = []; vars["prev_weapon_name"] = ""; + self.weapon_slots = []; + self.weapon_to_take_by_losing_specialty_additionalprimaryweapon = undefined; + while (1) { wait 0.05; - if (!is_player_valid(self) || !self hasPerk("specialty_additionalprimaryweapon")) + if (!self hasPerk("specialty_additionalprimaryweapon")) { if (vars["prev_weapon_name"] != "") { + self.weapon_to_take_by_losing_specialty_additionalprimaryweapon = undefined; self setClientDvar("additionalPrimaryWeaponName", ""); vars["prev_weapon_name"] = ""; } @@ -2663,12 +2667,55 @@ additionalprimaryweapon_indicator() } } - vars["size"] = vars["primary_weapons_that_can_be_taken"].size; + for (i = 0; i < self.weapon_slots.size; i++) + { + if (!self hasWeapon(self.weapon_slots[i])) + { + self.weapon_slots[i] = undefined; + } + } - if (vars["size"] < 3) + // remove any trailing undefined slots + for (i = self.weapon_slots.size - 1; i >= 0; i--) + { + if (isDefined(self.weapon_slots[i])) + { + break; + } + + arrayRemoveIndex(self.weapon_slots[i], i); + } + + for (i = 0; i < vars["primary_weapons_that_can_be_taken"].size; i++) + { + vars["weapon"] = vars["primary_weapons_that_can_be_taken"][i]; + + if (!isInArray(self.weapon_slots, vars["weapon"])) + { + vars["added"] = 0; + + for (j = 0; j < self.weapon_slots.size; j++) + { + if (!isDefined(self.weapon_slots[j])) + { + vars["added"] = 1; + self.weapon_slots[j] = vars["weapon"]; + break; + } + } + + if (!vars["added"]) + { + self.weapon_slots[self.weapon_slots.size] = vars["weapon"]; + } + } + } + + if (vars["primary_weapons_that_can_be_taken"].size < 3) { if (vars["prev_weapon_name"] != "") { + self.weapon_to_take_by_losing_specialty_additionalprimaryweapon = undefined; self setClientDvar("additionalPrimaryWeaponName", ""); vars["prev_weapon_name"] = ""; } @@ -2676,11 +2723,12 @@ additionalprimaryweapon_indicator() continue; } - vars["weapon"] = vars["primary_weapons_that_can_be_taken"][vars["size"] - 1]; + vars["weapon"] = self.weapon_slots[self.weapon_slots.size - 1]; vars["weapon_name"] = getweapondisplayname(vars["weapon"]); if (vars["prev_weapon_name"] != vars["weapon_name"]) { + self.weapon_to_take_by_losing_specialty_additionalprimaryweapon = vars["weapon"]; self setClientDvar("additionalPrimaryWeaponName", vars["weapon_name"]); vars["prev_weapon_name"] = vars["weapon_name"]; } diff --git a/scripts/zm/replaced/_zm.gsc b/scripts/zm/replaced/_zm.gsc index 171321f5..e7463e49 100644 --- a/scripts/zm/replaced/_zm.gsc +++ b/scripts/zm/replaced/_zm.gsc @@ -1215,72 +1215,71 @@ take_additionalprimaryweapon() self.a_saved_weapon = undefined; if (isdefined(self._retain_perks) && self._retain_perks || isdefined(self._retain_perks_array) && (isdefined(self._retain_perks_array["specialty_additionalprimaryweapon"]) && self._retain_perks_array["specialty_additionalprimaryweapon"])) - return weapon_to_take; + return undefined; - primary_weapons_that_can_be_taken = []; - primaryweapons = self getweaponslistprimaries(); + weapon_to_take = self.weapon_to_take_by_losing_specialty_additionalprimaryweapon; - for (i = 0; i < primaryweapons.size; i++) + if (!isDefined(weapon_to_take) || !self hasWeapon(weapon_to_take)) { - if (maps\mp\zombies\_zm_weapons::is_weapon_included(primaryweapons[i]) || maps\mp\zombies\_zm_weapons::is_weapon_upgraded(primaryweapons[i])) - primary_weapons_that_can_be_taken[primary_weapons_that_can_be_taken.size] = primaryweapons[i]; + return undefined; } - pwtcbt = primary_weapons_that_can_be_taken.size; + self.a_saved_weapon = maps\mp\zombies\_zm_weapons::get_player_weapondata(self, weapon_to_take); - while (pwtcbt >= 3) + name = self.a_saved_weapon["name"]; + dw_name = weaponDualWieldWeaponName(name); + alt_name = weaponAltWeaponName(name); + + clip_missing = weaponClipSize(name) - self.a_saved_weapon["clip"]; + + if (clip_missing > self.a_saved_weapon["stock"]) { - weapon_to_take = primary_weapons_that_can_be_taken[pwtcbt - 1]; - pwtcbt--; - - self.a_saved_weapon = maps\mp\zombies\_zm_weapons::get_player_weapondata(self, weapon_to_take); - - name = self.a_saved_weapon["name"]; - dw_name = weaponDualWieldWeaponName(name); - alt_name = weaponAltWeaponName(name); - - clip_missing = weaponClipSize(name) - self.a_saved_weapon["clip"]; - - if (clip_missing > self.a_saved_weapon["stock"]) - { - clip_missing = self.a_saved_weapon["stock"]; - } - - self.a_saved_weapon["clip"] += clip_missing; - self.a_saved_weapon["stock"] -= clip_missing; - - if (dw_name != "none") - { - clip_dualwield_missing = weaponClipSize(dw_name) - self.a_saved_weapon["lh_clip"]; - - if (clip_dualwield_missing > self.a_saved_weapon["stock"]) - { - clip_dualwield_missing = self.a_saved_weapon["stock"]; - } - - self.a_saved_weapon["lh_clip"] += clip_dualwield_missing; - self.a_saved_weapon["stock"] -= clip_dualwield_missing; - } - - if (alt_name != "none") - { - clip_alt_missing = weaponClipSize(alt_name) - self.a_saved_weapon["alt_clip"]; - - if (clip_alt_missing > self.a_saved_weapon["alt_stock"]) - { - clip_alt_missing = self.a_saved_weapon["alt_stock"]; - } - - self.a_saved_weapon["alt_clip"] += clip_alt_missing; - self.a_saved_weapon["alt_stock"] -= clip_alt_missing; - } - - if (weapon_to_take == self getcurrentweapon()) - self switchtoweapon(primary_weapons_that_can_be_taken[0]); - - self takeweapon(weapon_to_take); + clip_missing = self.a_saved_weapon["stock"]; } + self.a_saved_weapon["clip"] += clip_missing; + self.a_saved_weapon["stock"] -= clip_missing; + + if (dw_name != "none") + { + clip_dualwield_missing = weaponClipSize(dw_name) - self.a_saved_weapon["lh_clip"]; + + if (clip_dualwield_missing > self.a_saved_weapon["stock"]) + { + clip_dualwield_missing = self.a_saved_weapon["stock"]; + } + + self.a_saved_weapon["lh_clip"] += clip_dualwield_missing; + self.a_saved_weapon["stock"] -= clip_dualwield_missing; + } + + if (alt_name != "none") + { + clip_alt_missing = weaponClipSize(alt_name) - self.a_saved_weapon["alt_clip"]; + + if (clip_alt_missing > self.a_saved_weapon["alt_stock"]) + { + clip_alt_missing = self.a_saved_weapon["alt_stock"]; + } + + self.a_saved_weapon["alt_clip"] += clip_alt_missing; + self.a_saved_weapon["alt_stock"] -= clip_alt_missing; + } + + if (weapon_to_take == self getcurrentweapon()) + { + for (i = 0; i < self.weapon_slots.size; i++) + { + if (isdefined(self.weapon_slots[i]) && self.weapon_slots[i] != weapon_to_take) + { + self switchtoweapon(self.weapon_slots[i]); + break; + } + } + } + + self takeweapon(weapon_to_take); + return weapon_to_take; } diff --git a/scripts/zm/replaced/_zm_game_module.gsc b/scripts/zm/replaced/_zm_game_module.gsc index c26ac411..8354d33e 100644 --- a/scripts/zm/replaced/_zm_game_module.gsc +++ b/scripts/zm/replaced/_zm_game_module.gsc @@ -154,13 +154,17 @@ round_end(winner) foreach (player in players) { - // don't spawn tombstone powerup on next down - player.hasperkspecialtytombstone = undefined; - if (is_player_valid(player)) { // don't give perk player notify("perk_abort_drinking"); + + // stop active perks + foreach (perk in player.perks_active) + { + player notify(perk + "_stop"); + } + // save weapons player [[level._game_module_player_laststand_callback]](); } @@ -269,6 +273,8 @@ zombie_goto_round(target_round) game["allies_spawnpoints_randomized"] = undefined; set_game_var("switchedsides", !get_game_var("switchedsides")); + waittillframeend; // wait for active perks to be stopped + maps\mp\zombies\_zm_game_module::respawn_players(); wait 0.05; // let all players fully respawn diff --git a/scripts/zm/replaced/_zm_perks.gsc b/scripts/zm/replaced/_zm_perks.gsc index 70b7ba34..afada185 100644 --- a/scripts/zm/replaced/_zm_perks.gsc +++ b/scripts/zm/replaced/_zm_perks.gsc @@ -875,6 +875,10 @@ perk_think(perk) } break; + + case "specialty_scavenger": + self.hasperkspecialtytombstone = undefined; + break; } if (isDefined(level._custom_perks[perk]) && isDefined(level._custom_perks[perk].player_thread_take)) diff --git a/scripts/zm/replaced/_zm_weap_emp_bomb.gsc b/scripts/zm/replaced/_zm_weap_emp_bomb.gsc index 1dfa1185..4763b90d 100644 --- a/scripts/zm/replaced/_zm_weap_emp_bomb.gsc +++ b/scripts/zm/replaced/_zm_weap_emp_bomb.gsc @@ -300,7 +300,7 @@ player_perk_pause(perk) if (issubstr(perk, "specialty_scavenger")) { - self.hasperkspecialtytombstone = 0; + self.hasperkspecialtytombstone = undefined; } if (isDefined(level._custom_perks[perk]) && isDefined(level._custom_perks[perk].player_thread_take))