i’ve fixed the "player perk buff and graphics" — i merged the two. also, if anyone can figure out why on die rise with the who's who perk, when dying in who's who and being revived, some of the bonus perks don’t apply — but they do when going down and being revived with quick revive.
#include maps\mp\zombies\_zm_utility;
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_perks;
init()
{
level thread on_player_connect();
}
on_player_connect()
{
level endon("end_game");
while (true)
{
level waittill("connected", player);
player._retain_perks = 0;
player._jug_hp_set = false;
player thread reconnect_perk_manager(); // ✅ Core system to catch all spawns
}
}
reconnect_perk_manager()
{
self endon("disconnect");
while (true)
{
self waittill("spawned_player");
// Always re-thread logic (covers Who’s Who revive, normal revive, Quick Revive)
self thread on_player_spawned();
self thread watch_for_respawn();
wait_network_frame();
if (!isDefined(self.whoswho))
{
self thread sq_give_player_all_perks();
}
else
{
self thread wait_for_whoswho_revive_then_restore();
}
}
}
on_player_spawned()
{
self endon("disconnect");
self notify("sq_clean_threads");
// Gameplay Tweaks
SetDvar("player_clipSizeMultiplier", "2");
SetDvar("perk_weapRateMultiplier", "0.65");
SetDvar("perk_weapSpreadMultiplier", "0.25");
SetDvar("player_backSpeedScale", "1");
SetDvar("player_strafeSpeedScale", "1");
SetDvar("player_useMovementRestrict", "0");
// Visual Clarity
self setClientDvar("r_dof_enable", 0);
self setClientDvar("r_lodBiasRigid", -1000);
self setClientDvar("r_lodBiasSkinned", -1000);
self setClientDvar("r_lodScaleRigid", 1);
self setClientDvar("r_lodScaleSkinned", 1);
self setClientDvar("sm_sunquality", 2);
}
watch_for_respawn()
{
self endon("disconnect");
while (true)
{
self waittill_either("spawned_player", "player_revived");
wait_network_frame();
if (!isDefined(self.whoswho))
{
self thread sq_give_player_all_perks();
wait 0.5;
self thread apply_bonus_perks();
if (self hasperk("specialty_armorvest"))
{
self setmaxhealth(level.zombie_vars["zombie_perk_juggernaut_health"]);
self._jug_hp_set = true;
}
}
}
}
wait_for_whoswho_revive_then_restore()
{
self endon("disconnect");
while (isDefined(self.whoswho) && self.whoswho)
wait 0.1;
wait 0.5;
self thread sq_give_player_all_perks();
self thread apply_bonus_perks();
if (self hasperk("specialty_armorvest"))
{
self setmaxhealth(level.zombie_vars["zombie_perk_juggernaut_health"]);
self._jug_hp_set = true;
}
}
sq_give_player_all_perks()
{
if (!isdefined(level.sq_perks_ready))
{
flag_wait("initial_blackscreen_passed");
flag_wait("initial_players_connected");
level.sq_perks_ready = true;
}
while (self.afterlife && IsDefined(self.afterlife))
wait 0.05;
if (!isdefined(level._all_perk_list))
{
level._all_perk_list = [];
if (level.script != "zm_tomb")
{
machines = getentarray("zombie_vending", "targetname");
for (i = 0; i < machines.size; i++)
{
if (machines[i].script_noteworthy == "specialty_weapupgrade")
continue;
level._all_perk_list[level._all_perk_list.size] = machines[i].script_noteworthy;
}
}
else
{
level._all_perk_list = level._random_perk_machine_perk_list;
}
}
foreach (perk in level._all_perk_list)
{
if (IsDefined(self.perk_purchased) && self.perk_purchased == perk)
continue;
if (self hasperk(perk) || self has_perk_paused(perk))
continue;
self give_perk(perk, 0);
self notify("perk_acquired", perk);
wait 0.05;
}
self thread apply_bonus_perks();
if ((self hasperk("specialty_armorvest")) && (!isDefined(self._jug_hp_set) || !self._jug_hp_set))
{
self setmaxhealth(level.zombie_vars["zombie_perk_juggernaut_health"]);
self._jug_hp_set = true;
}
}
apply_bonus_perks()
{
self notify("stop_bonus_perks");
self endon("stop_bonus_perks");
bonus_perks = array(
"specialty_flakjacket",
"specialty_unlimitedsprint",
"specialty_fasttoss",
"specialty_fastweaponswitch",
"specialty_fastladderclimb",
"specialty_fastmantle",
"specialty_stalker",
"specialty_sprintrecovery",
"specialty_deadshot",
"specialty_fallheight"
);
foreach (perk in bonus_perks)
{
attempts = 0;
while (!(self hasperk(perk)) && attempts < 5)
{
self give_perk(perk, 0);
self notify("perk_acquired", perk);
wait 0.05;
attempts++;
}
}
}