From d04d6277af4b83e28ef8827f3584ce929bd8d89b Mon Sep 17 00:00:00 2001 From: Jbleezy Date: Sat, 27 Jan 2024 15:56:32 -0800 Subject: [PATCH] Mule Kick: move weapon slot update into separate function Mule Kick: update weapon slots right before taking additional weapon Mule Kick: update weapon slots if player does not have Mule Kick Mule Kick: don't update weapon slots if player is spectating --- scripts/zm/_zm_reimagined.gsc | 160 +++++++++++++++++++++------------- scripts/zm/replaced/_zm.gsc | 2 + 2 files changed, 100 insertions(+), 62 deletions(-) diff --git a/scripts/zm/_zm_reimagined.gsc b/scripts/zm/_zm_reimagined.gsc index a03d7ebe..86c7cff7 100644 --- a/scripts/zm/_zm_reimagined.gsc +++ b/scripts/zm/_zm_reimagined.gsc @@ -2637,18 +2637,27 @@ 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 (self.sessionstate == "spectator") + { + if (vars["prev_weapon_name"] != "") + { + self setClientDvar("additionalPrimaryWeaponName", ""); + vars["prev_weapon_name"] = ""; + } + + continue; + } + + self additionalprimaryweapon_update_weapon_slots(); + 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"] = ""; } @@ -2656,66 +2665,12 @@ additionalprimaryweapon_indicator() continue; } - vars["primary_weapons_that_can_be_taken"] = []; - vars["primaryweapons"] = self getweaponslistprimaries(); + vars["weapon"] = self.weapon_to_take_by_losing_specialty_additionalprimaryweapon; - for (i = 0; i < vars["primaryweapons"].size; i++) - { - if (maps\mp\zombies\_zm_weapons::is_weapon_included(vars["primaryweapons"][i]) || maps\mp\zombies\_zm_weapons::is_weapon_upgraded(vars["primaryweapons"][i])) - { - vars["primary_weapons_that_can_be_taken"][vars["primary_weapons_that_can_be_taken"].size] = vars["primaryweapons"][i]; - } - } - - for (i = 0; i < self.weapon_slots.size; i++) - { - if (!self hasWeapon(self.weapon_slots[i])) - { - self.weapon_slots[i] = undefined; - } - } - - // 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 (!isDefined(vars["weapon"])) { if (vars["prev_weapon_name"] != "") { - self.weapon_to_take_by_losing_specialty_additionalprimaryweapon = undefined; self setClientDvar("additionalPrimaryWeaponName", ""); vars["prev_weapon_name"] = ""; } @@ -2723,18 +2678,99 @@ additionalprimaryweapon_indicator() continue; } - 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"]; } } } +additionalprimaryweapon_update_weapon_slots() +{ + if (!isDefined(self.weapon_slots)) + { + self.weapon_slots = []; + } + + vars = []; + vars["primaries_that_can_be_taken"] = []; + vars["primaries"] = self getweaponslistprimaries(); + + for (i = 0; i < vars["primaries"].size; i++) + { + if (maps\mp\zombies\_zm_weapons::is_weapon_included(vars["primaries"][i]) || maps\mp\zombies\_zm_weapons::is_weapon_upgraded(vars["primaries"][i])) + { + vars["primaries_that_can_be_taken"][vars["primaries_that_can_be_taken"].size] = vars["primaries"][i]; + } + } + + for (i = 0; i < self.weapon_slots.size; i++) + { + if (!self hasWeapon(self.weapon_slots[i])) + { + self.weapon_slots[i] = undefined; + } + } + + // 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["primaries_that_can_be_taken"].size; i++) + { + vars["weapon"] = vars["primaries_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"]; + } + } + } + + vars["num_weapons"] = 0; + + for (i = 0; i < self.weapon_slots.size; i++) + { + if (isDefined(self.weapon_slots[i])) + { + vars["num_weapons"]++; + } + } + + if (vars["num_weapons"] >= 3) + { + self.weapon_to_take_by_losing_specialty_additionalprimaryweapon = self.weapon_slots[self.weapon_slots.size - 1]; + } + else + { + self.weapon_to_take_by_losing_specialty_additionalprimaryweapon = undefined; + } +} + additionalprimaryweapon_stowed_weapon_refill() { self endon("disconnect"); diff --git a/scripts/zm/replaced/_zm.gsc b/scripts/zm/replaced/_zm.gsc index e7463e49..ea8df7f8 100644 --- a/scripts/zm/replaced/_zm.gsc +++ b/scripts/zm/replaced/_zm.gsc @@ -1217,6 +1217,8 @@ take_additionalprimaryweapon() 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 undefined; + self scripts\zm\_zm_reimagined::additionalprimaryweapon_update_weapon_slots(); + weapon_to_take = self.weapon_to_take_by_losing_specialty_additionalprimaryweapon; if (!isDefined(weapon_to_take) || !self hasWeapon(weapon_to_take))