Advertisement
Guest User

zombies ++ script that is broke

a guest
May 23rd, 2020
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 67.50 KB | None | 0 0
  1. #include maps/mp/_utility;
  2. #include common_scripts/utility;
  3. #include maps/mp/gametypes_zm/_hud_util;
  4. #include maps/mp/zombies/_zm;
  5. #include maps/mp/zombies/_zm_utility;
  6. #include maps/mp/zombies/_zm_weapons;
  7. #include maps/mp/zombies/_zm_stats;
  8. #include maps/mp/gametypes_zm/_hud_message;
  9. #include maps/mp/zombies/_zm_powerups;
  10. #include maps/mp/zombies/_zm_perks;
  11. #include maps/mp/zombies/_zm_audio;
  12. #include maps/mp/zombies/_zm_score;
  13. #include maps/mp/zombies/_zm_spawner;
  14. #include maps/mp/zombies/_zm_transit;
  15.  
  16.  
  17. init()
  18. {
  19.     startInit(); //precaching models
  20.     level thread onPlayerConnect(); //on connect
  21.     thread initCustomPowerups(); //initilize custom powerups
  22.     thread initServerDvars(); //initilize server dvars (credit JezuzLizard)
  23.     level.playerDamageStub = level.callbackplayerdamage; //damage callback for phd flopper
  24.     level.callbackplayerdamage = ::phd_flopper_dmg_check; //more damage callback stuff. everybody do the flop
  25.     isTown(); //jezuzlizard's fix for tombstone :)
  26.     //level.using_solo_revive = 0; //disables solo revive, fixing only 3 revives per game.
  27.     //level.is_forever_solo_game = 0; //changes afterlives on motd from 3 to 1
  28. }
  29. onPlayerConnect()
  30. {
  31.     level endon( "end_game" );
  32.     self endon( "disconnect" );
  33.     for (;;)
  34.     {
  35.         level waittill( "connected", player );
  36.        
  37.         player thread [[level.givecustomcharacters]]();
  38.         player thread onPlayerSpawned();
  39.         player thread spawnIfRoundOne(); //force spawns if round 1. no more spectating one player on round 1
  40.         player thread startCustomPowerups(); //start custom powerups - Credit _Ox. just edited and added more powerups.
  41.         player thread startCustomPerkMachines(); //spawns custom perk machines on the map
  42.         player thread startCustomBank(); //custom bank (this doesnt fix the bank,it just emulates it)
  43.         player thread customEasterEgg(); //not optimized code tbh
  44.     }
  45. }
  46. onPlayerSpawned()
  47. {
  48.     level endon( "end_game" );
  49.     self endon( "disconnect" );
  50.     for(;;)
  51.     {
  52.         self waittill( "spawned_player" );
  53.         if( level.enableDebugMode == 1)
  54.         {
  55.             self notify("reset_debug_binds");
  56.             self thread debugButtonMonitor();
  57.             self.score = 500000;
  58.         }
  59.         if(level.round_number >= 5 && self.score < 2500) //in case players have low score and die or players join late (Helps to aid the high round, cant afford jug or gun situation)
  60.             self.score = 2500;
  61.         else if(level.round_number >= 15 && self.score < 5000)
  62.             self.score = 5000;
  63.         wait 5;
  64.         //self EnableInvulnerability();
  65.         self giveWeapon("ray_gun_zm");
  66.         self SwitchToWeapon("ray_gun_zm");
  67.         //self thread ConnectMessages(); //just does the connect messages when you spawn in
  68.         self thread initCustomPerksOnPlayer(); //checks mapname and if it should give PHD flopper automatically
  69.     }
  70. }
  71. ConnectMessages()
  72. {
  73.     wait 5;
  74.     self connectMessage( "Welcome to ^1ZOMBIES++^7! \nDeveloped by ^5@ItsCahz"  , false );
  75.     wait 5;
  76.     self connectMessage( "Your ^2Perk Limit ^7is ^2"+level.perk_purchase_limit+" ^7perks!"  , false );
  77.     wait 5;
  78.     if(getDvar("mapname") == "zm_prison" || getDvar("mapname") == "zm_highrise" || getDvar("mapname") == "zm_buried" || getDvar("mapname") == "zm_nuked" || getDvar("mapname") == "zm_transit")
  79.     {
  80.         if(level.disableAllCustomPerks == 0) //if the perks are enabled, send the next messages
  81.         {
  82.             if(isDefined(level.customPerksAreSpawned)) //this just checks to make sure there's actually custom perk machines within the map before sending the print msg
  83.                 self connectMessage( "There are extra perk machines located within the map!"  , false );
  84.             if(isDefined(self.customPerkNum) && self.customPerkNum == 4) //if there's 4 custom perk machines loaded, wait 5 seconds so the player can read the print msg in the killfeed before
  85.                 wait 5;
  86.             if(getDvar("mapname") == "zm_highrise")
  87.             {
  88.                 if(level.enablePHDFlopper == 1)
  89.                     self connectMessage( "-^6PHD Flopper"  , false );
  90.                 if(level.enableDeadShot == 1)
  91.                     self connectMessage( "-^8Deadshot Daiquiari"  , false );
  92.                 if(level.enableStaminUp == 1)
  93.                     self connectMessage( "-^3Stamin-Up"  , false );
  94.             }
  95.             else if(getDvar("mapname") == "zm_buried")
  96.             {
  97.                 if(level.enablePHDFlopper == 1)
  98.                     self connectMessage( "-^6PHD Flopper"  , false );
  99.                 if(level.enableDeadShot == 1)
  100.                     self connectMessage( "-^8Deadshot Daiquiari"  , false );
  101.             }
  102.             else if(getDvar("mapname") == "zm_prison")
  103.             {
  104.                 if(level.enablePHDFlopper == 1)
  105.                     self connectMessage( "-^6PHD Flopper"  , false );
  106.                 if(level.enableStaminUp == 1)
  107.                     self connectMessage( "-^3Stamin-Up"  , false );
  108.             }
  109.             else if(getDvar("mapname") == "zm_nuked" || getDvar("mapname") == "zm_transit")
  110.             {
  111.                 if(level.enablePHDFlopper == 1)
  112.                     self connectMessage( "-^6PHD Flopper"  , false );
  113.                 if(level.enableDeadShot == 1)
  114.                     self connectMessage( "-^8Deadshot Daiquiari"  , false );
  115.                 if(level.enableStaminUp == 1)
  116.                     self connectMessage( "-^3Stamin-Up"  , false );
  117.                 if(level.enableMuleKick == 1)
  118.                     self connectMessage( "-^2Mule Kick"  , false );
  119.             }
  120.         }
  121.     }
  122.     else if(getDvar("mapname") != "zm_tomb" && level.disableAllCustomPerks == 0 && level.enablePHDFlopper == 1)
  123.         self connectMessage( "^6PHD Flopper ^7is ^2Enabled ^7Automatically On This Map!"  , false ); //pretty sure this would work on maps like town or farm. never tested
  124. }
  125. //EVERYTHING CAN BE TOGGLED ON/OFF IN THE DEDICATED_ZM.CFG FILE
  126. startInit()
  127. {
  128.     PrecacheModel("collision_geo_cylinder_32x128_standard");
  129.     PrecacheModel("zombie_vending_jugg");
  130.     PrecacheModel("zombie_perk_bottle_marathon");
  131.     PrecacheModel("zombie_perk_bottle_whoswho");
  132.     PrecacheModel("zombie_vending_nuke_on_lo");
  133.     PrecacheModel("p6_zm_al_vending_pap_on");
  134.     PrecacheModel("p6_anim_zm_buildable_pap");
  135.     PrecacheModel("p6_zm_al_vending_pap_on");
  136.     PrecacheModel("p6_zm_al_vending_jugg_on");
  137.     PrecacheModel("p6_zm_al_vending_sleight_on");
  138.     PrecacheModel("p6_zm_al_vending_doubletap2_on");   
  139.     PrecacheModel("p6_zm_al_vending_ads_on");
  140.     PrecacheModel("p6_zm_al_vending_nuke_on");
  141.     PrecacheModel("p6_zm_al_vending_three_gun_on");
  142.     PrecacheModel("zombie_vending_revive");
  143.     PrecacheModel("zombie_vending_doubletap2");
  144.     PrecacheModel("zombie_x2_icon");
  145.     PrecacheModel("zombie_bomb");
  146.     PrecacheModel("zombie_ammocan");
  147.     PrecacheModel("zombie_x2_icon");
  148.     PrecacheModel("zombie_skull");
  149.     PrecacheShader("specialty_deadshot_zombies");
  150.     if(isDefined(level.player_out_of_playable_area_monitor))
  151.         level.player_out_of_playable_area_monitor = false;
  152.     level.pers_sniper_misses = 9999; //sniper perma perk! never lose it hahahahahahahahaha
  153.     //level.no_end_game_check = 1;
  154.     thread gscRestart(); //JezuzLizard fix sound stuff
  155.     thread setPlayersToSpectator(); //JezuzLizard fix sound stuff
  156. }
  157. initServerDvars() //credits to JezuzLizard!!! This is a huge help in making this happen
  158. {
  159.     level.player_starting_points = getDvarIntDefault( "playerStartingPoints", 500 );
  160.     //sets the perk limit for all players
  161.     level.perk_purchase_limit = getDvarIntDefault( "perkLimit", 4 );
  162.     //sets the maximum number of zombies that can be on the map at once 32 max
  163.     level.zombie_ai_limit = getDvarIntDefault( "zombieAiLimit", 24 );
  164.     //sets the number of zombie bodies that can be on the map at once
  165.     level.zombie_actor_limit = getDvarIntDefault( "zombieActorLimit", 32 );
  166.     //enables midround hellhounds WARNING: causes permanent round pauses on maps that aren't bus depot, town or farm
  167.     level.mixed_rounds_enabled = getDvarIntDefault( "midroundDogs", 0 );
  168.     //disables the end game check WARNING: make sure to include a spectator respawner and auto revive function
  169.     level.no_end_game_check = getDvarIntDefault( "noEndGameCheck", 0 );
  170.     //sets the solo laststand pistol
  171.     level.default_solo_laststandpistol = getDvar( "soloLaststandWeapon" );
  172.     //the default laststand pistol
  173.     level.default_laststandpistol = getDvar( "coopLaststandWeapon" );
  174.     //set the starting weapon
  175.     level.start_weapon = getDvar( "startWeaponZm" );
  176.     //sets all zombies to this speed lower values result in walkers higher values sprinters
  177.     level.zombie_move_speed = getDvarIntDefault( "zombieMoveSpeed", 1 );
  178.     //locks the zombie movespeed to the above value
  179.     level.zombieMoveSpeedLocked = getDvarIntDefault( "zombieMoveSpeedLocked", 0 );
  180.     //sets whether there is a cap to the zombie movespeed active
  181.     level.zombieMoveSpeedCap = getDvarIntDefault( "zombieMoveSpeedCap", 0 );
  182.     //sets the value to the zombie movespeed cap
  183.     level.zombieMoveSpeedCapValue = getDvarIntDefault( "zombieMoveSpeedCapValue", 1 );
  184.     //sets the round number any value between 1-255
  185.     level.round_number = getDvarIntDefault( "roundNumber", 1 );
  186.     //enables the override for zombies per round
  187.     level.overrideZombieTotalPermanently = getDvarIntDefault( "overrideZombieTotalPermanently", 0 );
  188.     //sets the number of zombies per round to the value indicated
  189.     level.overrideZombieTotalPermanentlyValue = getDvarIntDefault( "overrideZombieTotalPermanentlyValue", 6 );
  190.     //enables the override for zombie health
  191.     level.overrideZombieHealthPermanently = getDvarIntDefault( "overrideZombieHealthPermanently", 0 );
  192.     //sets the health of zombies every round to the value indicated
  193.     level.overrideZombieHealthPermanentlyValue = getDvarIntDefault( "overrideZombieHealthPermanentlyValue", 150 );
  194.     //enables the health cap override so zombies health won't grow beyond the value indicated
  195.     level.overrideZombieMaxHealth = getDvarIntDefault( "overrideZombieMaxHealth", 0 );
  196.     //sets the maximum health zombie health will increase to
  197.     level.overrideZombieMaxHealthValue = getDvarIntDefault( "overrideZombieMaxHealthValue" , 150 );
  198.    
  199.     //disables walkers
  200.     level.disableWalkers = getDvarIntDefault( "disableWalkers", 0 );
  201.     if ( level.disableWalkers )
  202.     {
  203.         level.speed_change_round = undefined;
  204.     }
  205.     //set afterlives on mob to 1 like a normal coop match and sets the prices of doors on origins to be higher
  206.     level.disableSoloMode = getDvarIntDefault( "disableSoloMode", 0 );
  207.     if ( level.disableSoloMode )
  208.     {
  209.         level.is_forever_solo_game = undefined;
  210.     }
  211.     //disables all drops
  212.     level.zmPowerupsNoPowerupDrops = getDvarIntDefault( "zmPowerupsNoPowerupDrops", 0 );
  213.    
  214.     //Zombie_Vars:
  215.     //The reason zombie_vars are first set to a var is because they don't reliably set when set directly to the value of a dvar
  216.     //sets the maximum number of drops per round
  217.     level.maxPowerupsPerRound = getDvarIntDefault( "maxPowerupsPerRound", 4 );
  218.     level.zombie_vars["zombie_powerup_drop_max_per_round"] = level.maxPowerupsPerRound;
  219.     //sets the powerup drop rate lower is better
  220.     level.powerupDropRate = getDvarIntDefault( "powerupDropRate", 2000 );
  221.     level.zombie_vars["zombie_powerup_drop_increment"] = level.powerupDropRate;
  222.     //makes every zombie drop a powerup
  223.     level.zombiesAlwaysDropPowerups = getDvarIntDefault( "zombiesAlwaysDropPowerups", 0 );
  224.     level.zombie_vars[ "zombie_drop_item" ] = level.zombiesAlwaysDropPowerups;
  225.     //increase these below vars to increase drop rate
  226.     //points to the powerup increment to a powerup drop related to level.zombie_vars["zombie_powerup_drop_increment"]
  227.     level.fourPlayerPowerupScore = getDvarIntDefault( "fourPlayerPowerupScore", 50 );
  228.     level.zombie_vars[ "zombie_score_kill_4p_team" ] = level.fourPlayerPowerupScore;
  229.     //points to the powerup increment to a powerup drop related to level.zombie_vars["zombie_powerup_drop_increment"]
  230.     level.threePlayerPowerupScore = getDvarIntDefault( "threePlayerPowerupScore", 50 );
  231.     level.zombie_vars[ "zombie_score_kill_3p_team" ] = level.threePlayerPowerupScore;
  232.     //points to the powerup increment to a powerup drop related to level.zombie_vars["zombie_powerup_drop_increment"]
  233.     level.twoPlayerPowerupScore = getDvarIntDefault( "twoPlayerPowerupScore", 50 );
  234.     level.zombie_vars[ "zombie_score_kill_2p_team" ] = level.twoPlayerPowerupScore;
  235.     //points to the powerup increment to a powerup drop related to level.zombie_vars["zombie_powerup_drop_increment"]
  236.     level.onePlayerPowerupScore = getDvarIntDefault( "onePlayerPowerupScore", 50 );
  237.     level.zombie_vars[ "zombie_score_kill_1p_team" ] = level.onePlayerPowerupScore;
  238.     //points for melee kills to the powerup increment to a powerup drop
  239.     level.powerupScoreMeleeKill = getDvarIntDefault( "powerupScoreMeleeKill", 80 );
  240.     level.zombie_vars[ "zombie_score_bonus_melee" ] = level.powerupScoreMeleeKill;
  241.     //points for headshot kills to the powerup increment to a powerup drop
  242.     level.powerupScoreHeadshotKill = getDvarIntDefault( "powerupScoreHeadshotKill", 50 );
  243.     level.zombie_vars[ "zombie_score_bonus_head" ] = level.powerupScoreHeadshotKill;
  244.     //points for neck kills to the powerup increment to a powerup drop
  245.     level.powerupScoreNeckKill = getDvarIntDefault( "powerupScoreNeckKill", 20 );
  246.     level.zombie_vars[ "zombie_score_bonus_neck" ] = level.powerupScoreNeckKill;
  247.     //points for torso kills to the powerup increment to a powerup drop
  248.     level.powerupScoreTorsoKill = getDvarIntDefault( "powerupScoreTorsoKill", 10 );
  249.     level.zombie_vars[ "zombie_score_bonus_torso" ] = level.powerupScoreTorsoKill;
  250.     //sets the zombie spawnrate; max is 0.08
  251.     level.zombieSpawnRate = getDvarFloatDefault( "zombieSpawnRate", 2 );
  252.     level.zombie_vars[ "zombie_spawn_delay" ] = level.zombieSpawnRate;
  253.     //sets the zombie spawnrate multiplier increase
  254.     level.zombieSpawnRateMultiplier = getDvarFloatDefault( "zombieSpawnRateMultiplier", 0.95 );
  255.     //locks the spawnrate so it does not change throughout gameplay
  256.     level.zombieSpawnRateLocked = getDvarIntDefault( "zombieSpawnRateLocked", 0 );
  257.     //alters the number of zombies per round formula amount of zombies per round is roughly correlated to this value
  258.     //ie half as many zombies per player is half as many zombies per round
  259.     level.zombiesPerPlayer = getDvarIntDefault( "zombiesPerPlayer", 6 );
  260.     level.zombie_vars["zombie_ai_per_player"] = level.zombiesPerPlayer;
  261.     //sets the flat amount of hp the zombies gain per round not used after round 10
  262.     level.zombieHealthIncreaseFlat = getDvarIntDefault( "zombieHealthIncreaseFlat", 100 );
  263.     level.zombie_vars[ "zombie_health_increase" ] = level.zombieHealthIncreaseFlat;
  264.     //multiplies zombie health by this value every round after round 10
  265.     level.zombieHealthIncreaseMultiplier = getDvarFloatDefault( "zombieHealthIncreaseMultiplier", 0.1 );
  266.     level.zombie_vars[ "zombie_health_increase_multiplier" ] = level.zombieHealthIncreaseMultiplier;
  267.     //base zombie health before any multipliers or additions
  268.     level.zombieHealthStart = getDvarIntDefault( "zombieHealthStart", 150 );
  269.     level.zombie_vars[ "zombie_health_start" ] = level.zombieHealthStart;
  270.     //time before new runners spawn on early rounds
  271.     level.zombieNewRunnerInterval = getDvarIntDefault( "zombieNewRunnerInterval", 10 );
  272.     level.zombie_vars[ "zombie_new_runner_interval" ] = level.zombieNewRunnerInterval;
  273.     //determines level.zombie_move_speed on original
  274.     level.zombieMoveSpeedMultiplier = getDvarIntDefault( "zombieMoveSpeedMultiplier", 10 );
  275.     level.zombie_vars[ "zombie_move_speed_multiplier" ] = level.zombieMoveSpeedMultiplier;
  276.     //determines level.zombie_move_speed on easy
  277.     level.zombieMoveSpeedMultiplierEasy = getDvarIntDefault( "zombieMoveSpeedMultiplierEasy", 8 );
  278.     level.zombie_vars[ "zombie_move_speed_multiplier_easy"] = level.zombieMoveSpeedMultiplierEasy;
  279.     //affects the number of zombies per round formula
  280.     level.zombieMaxAi = getDvarIntDefault( "zombieMaxAi", 24 );
  281.     level.zombie_vars[ "zombie_max_ai" ] = level.zombieMaxAi;
  282.     //affects the check for zombies that have fallen thru the map
  283.     level.belowWorldCheck = getDvarIntDefault( "belowWorldCheck", -1000 );
  284.     level.zombie_vars[ "below_world_check" ] = level.belowWorldCheck;
  285.     //sets whether spectators respawn at the end of the round
  286.     level.customSpectatorsRespawn = getDvarIntDefault( "customSpectatorsRespawn", 1 );
  287.     level.zombie_vars[ "spectators_respawn" ] = level.customSpectatorsRespawn;
  288.     //sets the time that the game takes during the end game intermission
  289.     level.zombieIntermissionTime = getDvarIntDefault( "zombieIntermissionTime", 20 );
  290.     level.zombie_vars["zombie_intermission_time"] = level.zombieIntermissionTime;
  291.     //the time between rounds
  292.     level.zombieBetweenRoundTime = getDvarIntDefault( "zombieBetweenRoundTime", 15 );
  293.     level.zombie_vars["zombie_between_round_time"] = level.zombieBetweenRoundTime;
  294.     //time before the game starts
  295.     level.roundStartDelay = getDvarIntDefault( "roundStartDelay", 0 );
  296.     level.zombie_vars[ "game_start_delay" ] = level.roundStartDelay;
  297.     //points all players lose when a player bleeds out %10 default
  298.     level.bleedoutPointsLostAllPlayers = getDvarFloatDefault( "bleedoutPointsLostAllPlayers", 0.1 );
  299.     level.zombie_vars[ "penalty_no_revive" ] = level.bleedoutPointsLostAllPlayers;
  300.     //penalty to the player who died 10% of points by default
  301.     level.bleedoutPointsLostSelf = getDvarFloatDefault( "bleedoutPointsLostSelf", 0.1 );
  302.     level.zombie_vars[ "penalty_died" ] = level.bleedoutPointsLostSelf;
  303.     //points players lose on down %5 by default
  304.     level.downedPointsLostSelf = getDvarFloatDefault( "downedPointsLostSelf", 0.05 );
  305.     level.zombie_vars[ "penalty_downed" ] = level.downedPointsLostSelf;
  306.     //unknown
  307.     level.playerStartingLives = getDvarIntDefault( "playerStartingLives", 1 );
  308.     level.zombie_vars[ "starting_lives" ] = level.playerStartingLives;
  309.     //points earned per zombie kill in a 4 player game
  310.     level.fourPlayerScorePerZombieKill = getDvarIntDefault( "fourPlayerScorePerZombieKill", 50 );
  311.     level.zombie_vars[ "zombie_score_kill_4player" ] = level.fourPlayerScorePerZombieKill;
  312.     //points earned per zombie kill in a 3 player game
  313.     level.threePlayerScorePerZombieKill = getDvarIntDefault( "threePlayerScorePerZombieKill", 50 );
  314.     level.zombie_vars[ "zombie_score_kill_3player" ] = level.threePlayerScorePerZombieKill;
  315.     //points earned per zombie kill in a 2 player game
  316.     level.twoPlayerScorePerZombieKill = getDvarIntDefault( "twoPlayerScorePerZombieKill", 50 );
  317.     level.zombie_vars[ "zombie_score_kill_2player" ] = level.twoPlayerScorePerZombieKill;
  318.     //points earned per zombie kill in a 1 player game
  319.     level.onePlayerScorePerZombieKill = getDvarIntDefault( "onePlayerScorePerZombieKill", 50 );
  320.     level.zombie_vars[ "zombie_score_kill_1player" ] = level.onePlayerScorePerZombieKill;
  321.     //points given for a normal attack
  322.     level.pointsPerNormalAttack = getDvarIntDefault( "pointsPerNormalAttack", 10 );
  323.     level.zombie_vars[ "zombie_score_damage_normal" ] = level.pointsPerNormalAttack;
  324.     //points given for a light attack
  325.     level.pointsPerLightAttack = getDvarIntDefault( "pointsPerLightAttack", 10 );
  326.     level.zombie_vars[ "zombie_score_damage_light" ] = level.pointsPerLightAttack;
  327.     //players turn into a zombie on death WARNING: buggy as can be and is missing assets
  328.     level.shouldZombifyPlayer = getDvarIntDefault( "shouldZombifyPlayer", 0 );
  329.     level.zombie_vars[ "zombify_player" ] = level.shouldZombifyPlayer;
  330.     //points scalar for allies team
  331.     level.alliesPointsMultiplier = getDvarIntDefault( "alliesPointsMultiplier", 1 );
  332.     level.zombie_vars[ "allies" ][ "zombie_point_scalar" ] = level.alliesPointsMultiplier;
  333.     //points scalar for axis team
  334.     level.axisPointsMultiplier = getDvarIntDefault( "axisPointsMultiplier", 1 );
  335.     level.zombie_vars[ "axis" ][ "zombie_point_scalar" ] = level.axisPointsMultiplier;
  336.     //sets the radius of emps explosion lower this to 1 to render emps useless
  337.     level.empPerkExplosionRadius = getDvarIntDefault( "empPerkExplosionRadius", 420 );
  338.     level.zombie_vars[ "emp_perk_off_range" ] = level.empPerkExplosionRadius;
  339.     //sets the duration of emps on perks set to 0 for infiinite emps
  340.     level.empPerkOffDuration = getDvarIntDefault( "empPerkOffDuration", 90 );
  341.     level.zombie_vars[ "emp_perk_off_time" ] = level.empPerkOffDuration;
  342.     //riotshield health
  343.     level.riotshieldHitPoints = getDvarIntDefault( "riotshieldHitPoints", 2250 );
  344.     level.zombie_vars[ "riotshield_hit_points" ] = level.riotshieldHitPoints;
  345.     //jugg health bonus
  346.     level.juggHealthBonus = getDvarIntDefault( "juggHealthBonus", 160 );
  347.     level.zombie_vars[ "zombie_perk_juggernaut_health" ] = level.juggHealthBonus;  
  348.     //perma jugg health bonus
  349.     level.permaJuggHealthBonus = getDvarIntDefault( "permaJuggHealthBonus", 190 );
  350.     level.zombie_vars[ "zombie_perk_juggernaut_health_upgrade" ] = level.permaJuggHealthBonus;
  351.     //phd min explosion damage
  352.     level.minPhdExplosionDamage = getDvarIntDefault( "minPhdExplosionDamage", 1000 );
  353.     level.zombie_vars[ "zombie_perk_divetonuke_min_damage" ] = level.minPhdExplosionDamage;
  354.     //phd max explosion damage
  355.     level.maxPhdExplosionDamage = getDvarIntDefault( "maxPhdExplosionDamage", 5000 );
  356.     level.zombie_vars[ "zombie_perk_divetonuke_max_damage" ] = level.maxPhdExplosionDamage;
  357.     //phd explosion radius
  358.     level.phdDamageRadius = getDvarIntDefault( "phdDamageRadius", 300 );
  359.     level.zombie_vars[ "zombie_perk_divetonuke_radius" ] = level.phdDamageRadius;
  360.     //zombie counter onscreen
  361.     level.enableZombieCounter = getDvarIntDefault( "enableZombieCounter", 1 );
  362.     level.zombie_vars[ "enableZombieCounter" ] = level.enableZombieCounter;
  363.     //custom bank
  364.     level.customBankEnabled = getDvarIntDefault( "customBankEnabled", 1 );
  365.     level.zombie_vars[ "customBankEnabled" ] = level.customBankEnabled;
  366.     //custom bank amount
  367.     level.customBankTotal = getDvarIntDefault( "customBankTotal", 10000 );
  368.     level.zombie_vars[ "customBankTotal" ] = level.customBankTotal;
  369.     //custom anti kiting
  370.     level.antiKitingEnabled = getDvarIntDefault( "antiKitingEnabled", 0 );
  371.     level.zombie_vars[ "antiKitingEnabled" ] = level.antiKitingEnabled;
  372.     //anti kiting waittime (how long before zombies get auto killed)
  373.     level.antiKitingWaittime = getDvarIntDefault( "antiKitingWaittime", 45 );
  374.     level.zombie_vars[ "antiKitingWaittime" ] = level.antiKitingWaittime;
  375.     //change mystery box price
  376.     level.customMysteryBoxPriceEnabled = getDvarIntDefault( "customMysteryBoxPriceEnabled", 0 );
  377.     level.zombie_vars[ "customMysteryBoxPriceEnabled" ] = level.customMysteryBoxPriceEnabled;
  378.     //set mystery box price
  379.     level.customMysteryBoxPrice = getDvarIntDefault( "customMysteryBoxPrice", 500 );
  380.     level.zombie_vars[ "customMysteryBoxPrice" ] = level.customMysteryBoxPrice;
  381.     //disable custom perks
  382.     level.disableAllCustomPerks = getDvarIntDefault( "disableAllCustomPerks", 0 );
  383.     level.zombie_vars[ "disableAllCustomPerks" ] = level.disableAllCustomPerks;
  384.     //enable custom phdflopper
  385.     level.enablePHDFlopper = getDvarIntDefault( "enablePHDFlopper", 1 );
  386.     level.zombie_vars[ "enablePHDFlopper" ] = level.enablePHDFlopper;
  387.     //enable custom staminup
  388.     level.enableStaminUp = getDvarIntDefault( "enableStaminUp", 1 );
  389.     level.zombie_vars[ "enableStaminUp" ] = level.enableStaminUp;
  390.     //enable custom deadshot
  391.     level.enableDeadshot = getDvarIntDefault( "enableDeadshot", 1 );
  392.     level.zombie_vars[ "enableDeadshot" ] = level.enableDeadshot;
  393.     //enable custom mule kick
  394.     level.enableMuleKick = getDvarIntDefault( "enableMuleKick", 1 );
  395.     level.zombie_vars[ "enableMuleKick" ] = level.enableMuleKick;
  396.     //debug mode
  397.     level.enableDebugMode = getDvarIntDefault( "enableDebugMode", 0 );
  398.     level.zombie_vars[ "enableDebugMode" ] = level.enableDebugMode;
  399.     disable_specific_powerups();
  400.     checks();
  401.     thread zombies_always_drop_powerups();
  402.     thread zombies_per_round_override();
  403.     thread zombie_health_override();
  404.     thread zombie_health_cap_override();
  405.     thread zombie_spawn_delay_fix();
  406.     thread zombie_speed_fix();
  407.     thread doTimer();
  408. }
  409. trackPackAPunchDrops()
  410. {
  411.     level endon("end_game");
  412.     level.rounds_since_last_pack_a_punch = 0;
  413.     for(;;)
  414.     {
  415.         level waittill("start_of_round");
  416.         level.rounds_since_last_pack_a_punch_drop += 1;
  417.         wait 0.5;
  418.     }
  419. }
  420. gscRestart()
  421. {
  422.     level waittill( "end_game" );
  423.     wait 15;
  424.     map_restart( false );
  425. }
  426. setPlayersToSpectator()
  427. {
  428.     level.no_end_game_check = 1;
  429.     wait 3;
  430.     players = get_players();
  431.     i = 0;
  432.     while ( i < players.size )
  433.     {
  434.         if ( i == 0 )
  435.         {
  436.             i++;
  437.         }
  438.         players[ i ] setToSpectator();
  439.         i++;
  440.     }
  441.     wait 5;
  442.     spawnAllPlayers();
  443. }
  444. setToSpectator()
  445. {
  446.     self.sessionstate = "spectator";
  447.     if (isDefined(self.is_playing))
  448.     {
  449.         self.is_playing = false;
  450.     }
  451. }
  452. spawnAllPlayers()
  453. {
  454.     players = get_players();
  455.     i = 0;
  456.     while ( i < players.size )
  457.     {
  458.         if ( players[ i ].sessionstate == "spectator" && isDefined( players[ i ].spectator_respawn ) )
  459.         {
  460.             players[ i ] [[ level.spawnplayer ]]();
  461.             if ( level.script != "zm_tomb" || level.script != "zm_prison" || !is_classic() )
  462.             {
  463.                 thread maps\mp\zombies\_zm::refresh_player_navcard_hud();
  464.             }
  465.         }
  466.         i++;
  467.     }
  468.     level.no_end_game_check = 0;
  469. }
  470. disable_all_powerups()
  471. {
  472.     if ( level.zmPowerupsNoPowerupDrops )
  473.     {
  474.         flag_clear( "zombie_drop_powerups" );
  475.     }
  476. }
  477. zombies_always_drop_powerups()
  478. {
  479.     if ( !level.zombiesAlwaysDropPowerups )
  480.     {
  481.         return;
  482.     }
  483.     while ( 1 )
  484.     {
  485.         level.zombie_vars[ "zombie_drop_item" ] = level.zombiesAlwaysDropPowerups;
  486.         wait 0.05;
  487.     }
  488. }
  489. zombies_per_round_override()
  490. {
  491.     if ( !level.overrideZombieTotalPermanently )
  492.     {
  493.         return;
  494.     }
  495.     while ( 1 )
  496.     {
  497.         level waittill( "start_of_round" );
  498.         level.zombie_total = getDvarIntDefault( "overrideZombieTotalPermanentlyValue", 6 );
  499.     }
  500. }
  501. zombie_health_override()
  502. {
  503.     if ( !level.overrideZombieHealthPermanently )
  504.     {
  505.         return;
  506.     }
  507.     while ( 1 )
  508.     {
  509.         level waittill( "start_of_round" );
  510.         level.zombie_health = getDvarIntDefault( "overrideZombieHealthPermanentlyValue", 150 );
  511.     }
  512. }
  513. zombie_health_cap_override()
  514. {
  515.     if ( !level.overrideZombieMaxHealth )
  516.     {
  517.         return;
  518.     }
  519.     while ( 1 )
  520.     {
  521.         level waittill( "start_of_round" );
  522.         if ( level.zombie_health > level.overrideZombieMaxHealthValue )
  523.         {
  524.             level.zombie_health = getDvarIntDefault( "overrideZombieHealthMaxHealthValue", 150 );
  525.         }
  526.     }
  527. }
  528. zombie_spawn_delay_fix()
  529. {
  530.     if ( level.zombieSpawnRateLocked )
  531.     {
  532.         return;
  533.     }
  534.     i = 1;
  535.     while ( i <= level.round_number )
  536.     {
  537.         timer = level.zombieSpawnRate;
  538.         if ( timer > 0.08 )
  539.         {
  540.             level.zombieSpawnRate = timer * level.zombieSpawnRateMultiplier;
  541.             i++;
  542.             continue;
  543.         }
  544.         else if ( timer < 0.08 )
  545.         {
  546.             level.zombieSpawnRate = 0.08;
  547.             break;
  548.         }
  549.         i++;
  550.     }
  551.     while ( 1 )
  552.     {
  553.         level waittill( "start_of_round" );
  554.         if ( level.zombieSpawnRate > 0.08 )
  555.         {
  556.             level.zombieSpawnRate = level.zombieSpawnRate * level.zombieSpawnRateMultiplier;
  557.         }
  558.         level.zombie_vars[ "zombie_spawn_delay" ] = level.zombieSpawnRate;
  559.     }
  560. }
  561. zombie_speed_fix()
  562. {
  563.     if ( level.zombieMoveSpeedLocked )
  564.     {
  565.         return;
  566.     }
  567.     if ( level.gamedifficulty == 0 )
  568.     {
  569.         level.zombie_move_speed = level.round_number * level.zombie_vars[ "zombie_move_speed_multiplier_easy" ];
  570.     }
  571.     else
  572.     {
  573.         level.zombie_move_speed = level.round_number * level.zombie_vars[ "zombie_move_speed_multiplier" ];
  574.     }
  575. }
  576. zombie_speed_override()
  577. {
  578.     if ( !level.zombieMoveSpeedLocked )
  579.     {
  580.         return;
  581.     }
  582.     while ( 1 )
  583.     {
  584.         level waittill( "start_of_round" );
  585.         level.zombie_move_speed = getDvarIntDefault( "zombieMoveSpeed", 1 );
  586.     }
  587. }
  588. zombie_speed_cap_override()
  589. {
  590.     if ( !level.zombieMoveSpeedCap )
  591.     {
  592.         return;
  593.     }
  594.     while ( 1 )
  595.     {
  596.         level waittill( "start_of_round" );
  597.         if ( level.zombie_move_speed > level.zombieMoveSpeedCapValue )
  598.         {
  599.             level.zombie_move_speed = level.zombieMoveSpeedCapValue;
  600.         }
  601.     }
  602. }
  603. checks()
  604. {
  605.     if( level.customMysteryBoxPriceEnabled == 1) //custom mystery box price
  606.     {
  607.         level thread setMysteryBoxPrice();
  608.     }
  609.     if( level.enableZombieCounter == 1 ) //draw zombie counter
  610.     {
  611.         level thread drawZombiesCounter(); //credit carbonmodding
  612.     }
  613.     if( level.antiKitingEnabled == 1 ) //custom anti kiting credit @itscahz big brain
  614.     {
  615.         level thread antiKiting(); //checks if zombie count is below 3 and waits set time to all kill zombies
  616.     }
  617.     if ( level.mixed_rounds_enabled )
  618.     {
  619.         if ( level.script != "zm_transit" || is_classic() || level.scr_zm_ui_gametype == "zgrief" )
  620.         {
  621.             level.mixed_rounds_enabled = 0;
  622.         }
  623.     }
  624.  
  625.     if ( level.start_weapon == "" || level.start_weapon== "m1911_zm" )
  626.     {
  627.         level.start_weapon = "m1911_zm";
  628.         if ( level.script == "zm_tomb" )
  629.         {
  630.             level.start_weapon = "c96_zm";
  631.         }
  632.     }
  633.     if ( level.default_laststandpistol == "" || level.default_laststandpistol == "m1911_zm" )
  634.     {
  635.         level.default_laststandpistol = "m1911_zm";
  636.         if ( level.script == "zm_tomb" )
  637.         {
  638.             level.default_laststandpistol = "c96_zm";
  639.         }
  640.     }
  641.     if ( level.default_solo_laststandpistol == "" || level.default_solo_laststandpistol == "m1911_upgraded_zm" )
  642.     {
  643.         level.default_solo_laststandpistol = "m1911_upgraded_zm";
  644.         if ( level.script == "zm_tomb" )
  645.         {
  646.             level.default_solo_laststandpistol = "c96_upgraded_zm";
  647.         }
  648.     }
  649.  
  650. }
  651. disable_specific_powerups()
  652. {
  653.     level.powerupNames = array( "fast_feet", "unlimited_ammo", "pack_a_punch", "money_drop", "nuke", "insta_kill", "full_ammo", "double_points", "fire_sale", "free_perk", "carpenter" );
  654.     array = level.powerupNames;
  655.     //custom powerups and regular powerups
  656.     level.zmPowerupsEnabled = [];
  657.     //fast feet custom drop
  658.     level.zmPowerupsEnabled[ "fast_feet" ] = spawnstruct();
  659.     level.zmPowerupsEnabled[ "fast_feet" ].name = "fast_feet";
  660.     level.zmPowerupsEnabled[ "fast_feet" ].active = getDvarIntDefault( "zmPowerupsFastFeetEnabled", 1 );
  661.     //custom unlimited ammo drop
  662.     level.zmPowerupsEnabled[ "unlimited_ammo" ] = spawnstruct();
  663.     level.zmPowerupsEnabled[ "unlimited_ammo" ].name = "unlimited_ammo";
  664.     level.zmPowerupsEnabled[ "unlimited_ammo" ].active = getDvarIntDefault( "zmPowerupsUnlimitedAmmoEnabled", 1 );
  665.     //custom pack a punch drop
  666.     level.zmPowerupsEnabled[ "pack_a_punch" ] = spawnstruct();
  667.     level.zmPowerupsEnabled[ "pack_a_punch" ].name = "pack_a_punch";
  668.     level.zmPowerupsEnabled[ "pack_a_punch" ].active = getDvarIntDefault( "zmPowerupsPackAPunchEnabled", 1 );
  669.     //custom money drop
  670.     level.zmPowerupsEnabled[ "money_drop" ] = spawnstruct();
  671.     level.zmPowerupsEnabled[ "money_drop" ].name = "money_drop";
  672.     level.zmPowerupsEnabled[ "money_drop" ].active = getDvarIntDefault( "zmPowerupsMoneyDropEnabled", 1 );
  673.     //nuke
  674.     level.zmPowerupsEnabled[ "nuke" ] = spawnstruct();
  675.     level.zmPowerupsEnabled[ "nuke" ].name = "nuke";
  676.     level.zmPowerupsEnabled[ "nuke" ].active = getDvarIntDefault( "zmPowerupsNukeEnabled", 1 );
  677.     //remove insta kills from the drop cycle and special drops
  678.     level.zmPowerupsEnabled[ "insta_kill" ] = spawnstruct();
  679.     level.zmPowerupsEnabled[ "insta_kill" ].name = "insta_kill";
  680.     level.zmPowerupsEnabled[ "insta_kill" ].active = getDvarIntDefault( "zmPowerupsInstaKillEnabled", 1 );
  681.     //remove max ammos from the drop cycle and special drops
  682.     level.zmPowerupsEnabled[ "full_ammo" ] = spawnstruct();
  683.     level.zmPowerupsEnabled[ "full_ammo" ].name = "full_ammo";
  684.     level.zmPowerupsEnabled[ "full_ammo" ].active = getDvarIntDefault( "zmPowerupsMaxAmmoEnabled", 1 );
  685.     //remove carpenter from the drop cycle and special drops
  686.     level.zmPowerupsEnabled[ "double_points" ] = spawnstruct();
  687.     level.zmPowerupsEnabled[ "double_points" ].name = "double_points";
  688.     level.zmPowerupsEnabled[ "double_points" ].active = getDvarIntDefault( "zmPowerupsDoublePointsEnabled", 1 );
  689.     //remove fire sale from the drop cycle and special drops NOTE: fire sale isn't on all maps already this being enabled won't make it spawn
  690.     level.zmPowerupsEnabled[ "fire_sale" ] = spawnstruct();
  691.     level.zmPowerupsEnabled[ "fire_sale" ].name = "fire_sale";
  692.     level.zmPowerupsEnabled[ "fire_sale" ].active = getDvarIntDefault( "zmPowerupsFireSaleEnabled", 1 );
  693.     //remove the perk bottle from the drop cycle and special drops
  694.     level.zmPowerupsEnabled[ "free_perk" ] = spawnstruct();
  695.     level.zmPowerupsEnabled[ "free_perk" ].name = "free_perk";
  696.     level.zmPowerupsEnabled[ "free_perk" ].active = getDvarIntDefault( "zmPowerupsPerkBottleEnabled", 1 );
  697.     //removes carpenter from the drop cycle and special drops
  698.     level.zmPowerupsEnabled[ "carpenter" ] = spawnstruct();
  699.     level.zmPowerupsEnabled[ "carpenter" ].name = "carpenter";
  700.     level.zmPowerupsEnabled[ "carpenter" ].active = getDvarIntDefault( "zmPowerupsCarpenterEnabled", 1 );
  701.     //removes zombie blood from the drop cycle and special drops
  702.     level.zmPowerupsEnabled[ "zombie_blood" ] = spawnstruct();
  703.     level.zmPowerupsEnabled[ "zombie_blood" ].name = "zombie_blood";
  704.     level.zmPowerupsEnabled[ "zombie_blood" ].active = getDvarIntDefault( "zmPowerupsZombieBloodEnabled", 1 );
  705.    
  706.     //you can expand this list with custom powerups if you'd like just add a new spawnstruct() and add to the array at the top
  707.    
  708.     for ( i = 0; i < array.size; i++ )
  709.     {  
  710.         if ( !level.zmPowerupsEnabled[ array[ i ] ].active )
  711.         {
  712.             name = level.zmPowerupsEnabled[ array[ i ] ].name;
  713.             if ( isInArray( level.zombie_include_powerups, name ) )
  714.             {
  715.                 arrayremovevalue( level.zombie_include_powerups, name );
  716.             }
  717.             if ( isInArray( level.zombie_powerups, name ) )
  718.             {
  719.                 arrayremovevalue( level.zombie_powerups, name );
  720.             }
  721.             if ( isInArray( level.zombie_powerup_array, name ) )
  722.             {
  723.                 arrayremovevalue( level.zombie_powerup_array, name );
  724.             }
  725.         }
  726.     }
  727. }
  728. connectMessage( string , bold ) //connect message
  729. {
  730.     if ( !isDefined ( self.pers[string] ) )
  731.     {
  732.         self.pers[string] = true;
  733.  
  734.         if ( !isDefined ( bold ) || bold != true )
  735.             self iPrintln ( string );
  736.         else
  737.             self iPrintlnBold( string );
  738.     }
  739. }
  740. drawZombiesCounter() //credit carbonmodding, edited to use setValue instead of SetText & colors
  741. {
  742.     level.zombiesCounter = createServerFontString("hudsmall" , 1.9);
  743.     level.zombiesCounter setPoint("CENTER", "CENTER", "CENTER", 190);
  744.     level thread updateZombiesCounter();
  745. }
  746. updateZombiesCounter() //credit carbonmodding
  747. {
  748.     oldZombiesCount = get_current_zombie_count();
  749.     while(true)
  750.     {
  751.         newZombiesCount = get_current_zombie_count();
  752.         wait 0.05;
  753.         if(oldZombiesCount != newZombiesCount)
  754.         {
  755.             level thread updateZombiesCounter();
  756.             return;
  757.         }
  758.         else
  759.         {
  760.             if(newZombiesCount != 0)
  761.                 level.zombiesCounter.label = &"Zombies: ^1";
  762.             else
  763.                 level.zombiesCounter.label = &"Zombies: ^6";
  764.             level.zombiesCounter setValue(newZombiesCount);
  765.         }
  766.     }
  767. }
  768. antiKiting() //credit @ItsCahz
  769. {
  770.     level endon("end_game");
  771.     for(;;)
  772.     {
  773.         if(level.round_number >= 3 && oldZombCount <= 3)
  774.         {
  775.             wait level.antiKitingWaittime;
  776.             if(get_current_zombie_count() <= 3)
  777.             {
  778.                 enemy = getaiarray( level.zombie_team );
  779.                 foreach( zombie in enemy )
  780.                     zombie dodamage( zombie.health * 2, zombie.origin );
  781.             }
  782.         }
  783.         wait 1;
  784.     }
  785. }
  786. setMysteryBoxPrice() //mystery box price
  787. {
  788.     i = 0;
  789.     while (i < level.chests.size)
  790.     {
  791.         level.chests[ i ].zombie_cost = level.customMysteryBoxPrice;
  792.         level.chests[ i ].old_cost = level.customMysteryBoxPrice;
  793.         i++;
  794.     }
  795. }
  796. spawnIfRoundOne() //spawn player
  797. {
  798.     wait 3;
  799.     if ( self.sessionstate == "spectator" && level.round_number == 1 )
  800.         self iprintln("Get ready to be spawned!");
  801.     wait 5;
  802.     if ( self.sessionstate == "spectator" && level.round_number == 1 )
  803.     {
  804.         self [[ level.spawnplayer ]]();
  805.         if ( level.script != "zm_tomb" || level.script != "zm_prison" || !is_classic() )
  806.             thread maps\mp\zombies\_zm::refresh_player_navcard_hud();
  807.     }
  808. }
  809. drawHealth() //credit carbonmodding, edited to use setValue instead of SetText & colors
  810. {
  811.     self.healthBar = createFontString("hudsmall" , 1.25);
  812.     self.healthBar setPoint("CENTER", "CENTER", "CENTER", 173);
  813.     self.healthBar.label = &"^1Health: ^7";
  814.     while(true)
  815.     {
  816.         self.healthBar setValue(self.health);
  817.         wait 0.1;
  818.     }
  819. }
  820. startCustomBank()
  821. {
  822.     if( level.customBankEnabled == 1)
  823.     {
  824.         self.AmountInBank = level.customBankTotal;
  825.         if( getDvar("mapname") == "zm_buried" )
  826.             self thread CustomBank((-276, -315, 11));
  827.         if( getDvar("mapname") == "zm_highrise" )
  828.             self thread CustomBank((2262, 623, 1296));
  829.         if( getDvar("mapname") == "zm_transit" )
  830.             self thread CustomBank((587, 504, -35));
  831.     }
  832. }
  833. CustomBank(origin) //custom bank
  834. {
  835.     self endon("disconnect");
  836.     level endon("end_game");
  837.     level thread LowerMessage( "Custom Perks", "Hold ^3F ^7to withdraw 1000" );
  838.     trig = spawn("trigger_radius", (origin), 1, 25, 25);
  839.     trig SetCursorHint( "HINT_NOICON" );
  840.     trig setLowerMessage( trig, "Custom Perks" );
  841.     for(;;)
  842.     {
  843.         trig waittill("trigger", self);
  844.         if(self useButtonPressed())
  845.         {
  846.             wait .2;
  847.             if(self useButtonPressed())
  848.             {
  849.                 if(self.AmountInBank != 0)
  850.                 {
  851.                     self connectMessage( "You can withdraw money, but depositing will not save!"  , false );
  852.                     self iprintln( "Money Available: "+self.AmountInBank );
  853.                     self playsound( "zmb_cha_ching" ); //money shot
  854.                     self.score += 1000;
  855.                     self.score -= 100;
  856.                     self.AmountInBank -= 1000;
  857.                 }
  858.                 else
  859.                     self connectMessage( "Your Bank is Empty!"  , false );
  860.             }
  861.         }
  862.     }
  863. }
  864. doTimer()
  865. {
  866.     level endon("end_game");
  867.     level endon("timer_started");
  868.     for(;;)
  869.     {
  870.         level waittill("start_of_round");
  871.         if(level.round_number == 1 && level.players.size > 0 && !isDefined(level.timerStarted))
  872.         {
  873.             level.timerStarted = true;
  874.             level thread startTimer();
  875.             level thread notifyTimeOnEndGame();
  876.             wait 0.1;
  877.             level notify("timer_started");
  878.         }
  879.     }
  880. }
  881. startTimer()
  882. {
  883.     level.minutesPlayed = 0;
  884.     level.hoursPlayed = 0;
  885.     for(;;)
  886.     {
  887.         wait 59;
  888.         level.minutesPlayed += 1;
  889.         wait 1;
  890.         if(level.minutesPlayed == 60)
  891.         {
  892.             level.hoursPlayed += 1;
  893.             level.minutesPlayed = 0;
  894.         }
  895.     }
  896. }
  897. notifyTimeOnEndGame()
  898. {
  899.     level endon("time_displayed");
  900.     for(;;)
  901.     {
  902.         level waittill("end_game");
  903.         foreach(player in level.players)
  904.         {
  905.             if(level.hoursPlayed > 0)
  906.             {
  907.                 if(level.hoursPlayed == 1)
  908.                 {
  909.                     if(level.minutesPlayed == 1)
  910.                         player iprintln("That game lasted "+level.hoursPlayed+" hour and "+level.minutesPlayed+" minute!");
  911.                     else
  912.                         player iprintln("That game lasted "+level.hoursPlayed+" hour and "+level.minutesPlayed+" minutes!");
  913.                 }
  914.                 else
  915.                 {
  916.                     if(level.minutesPlayed == 1)
  917.                         player iprintln("That game lasted "+level.hoursPlayed+" hours and "+level.minutesPlayed+" minute!");
  918.                     else
  919.                         player iprintln("That game lasted "+level.hoursPlayed+" hours and "+level.minutesPlayed+" minutes!");
  920.                 }
  921.             }
  922.             else
  923.             {
  924.                 if(level.minutesPlayed == 1)
  925.                     player iprintln("That game lasted "+level.minutesPlayed+" minute!");
  926.                 else
  927.                     player iprintln("That game lasted "+level.minutesPlayed+" minutes!");
  928.             }
  929.         }
  930.         wait 2;
  931.         level notify("time_displayed");
  932.     }
  933. }
  934. solo_tombstone_removal()
  935. {
  936.     notify( "tombstone_on" );
  937. }
  938. turn_tombstone_on()
  939. {
  940.     while ( 1 )
  941.     {
  942.         machine = getentarray( "vending_tombstone", "targetname" );
  943.         machine_triggers = getentarray( "vending_tombstone", "target" );
  944.         i = 0;
  945.         while ( i < machine.size )
  946.         {
  947.             machine[ i ] setmodel( level.machine_assets[ "tombstone" ].off_model );
  948.             i++;
  949.         }
  950.         level thread do_initial_power_off_callback( machine, "tombstone" );
  951.         array_thread( machine_triggers, ::set_power_on, 0 );
  952.         level waittill( "tombstone_on" );
  953.         i = 0;
  954.         while ( i < machine.size )
  955.         {
  956.             machine[ i ] setmodel( level.machine_assets[ "tombstone" ].on_model );
  957.             machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0,3, 0,4, 3 );
  958.             machine[ i ] playsound( "zmb_perks_power_on" );
  959.             machine[ i ] thread perk_fx( "tombstone_light" );
  960.             machine[ i ] thread play_loop_on_machine();
  961.             i++;
  962.         }
  963.         level notify( "specialty_scavenger_power_on" );
  964.         array_thread( machine_triggers, ::set_power_on, 1 );
  965.         if ( isDefined( level.machine_assets[ "tombstone" ].power_on_callback ) )
  966.         {
  967.             array_thread( machine, level.machine_assets[ "tombstone" ].power_on_callback );
  968.         }
  969.         level waittill( "tombstone_off" );
  970.         if ( isDefined( level.machine_assets[ "tombstone" ].power_off_callback ) )
  971.         {
  972.             array_thread( machine, level.machine_assets[ "tombstone" ].power_off_callback );
  973.         }
  974.         array_thread( machine, ::turn_perk_off );
  975.         players = get_players();
  976.         _a1718 = players;
  977.         _k1718 = getFirstArrayKey( _a1718 );
  978.         while ( isDefined( _k1718 ) )
  979.         {
  980.             player = _a1718[ _k1718 ];
  981.             player.hasperkspecialtytombstone = undefined;
  982.             _k1718 = getNextArrayKey( _a1718, _k1718 );
  983.         }
  984.     }
  985. }
  986. perk_machine_spawn_init()
  987. {
  988.     match_string = "";
  989.     location = level.scr_zm_map_start_location;
  990.     if ( location != "default" && location == "" && isDefined( level.default_start_location ) )
  991.     {
  992.         location = level.default_start_location;
  993.     }
  994.     match_string = ( level.scr_zm_ui_gametype + "_perks_" ) + location;
  995.     pos = [];
  996.     if ( isDefined( level.override_perk_targetname ) )
  997.     {
  998.         structs = getstructarray( level.override_perk_targetname, "targetname" );
  999.     }
  1000.     else
  1001.     {
  1002.         structs = getstructarray( "zm_perk_machine", "targetname" );
  1003.     }
  1004.     _a3578 = structs;
  1005.     _k3578 = getFirstArrayKey( _a3578 );
  1006.     while ( isDefined( _k3578 ) )
  1007.     {
  1008.         struct = _a3578[ _k3578 ];
  1009.         if ( isDefined( struct.script_string ) )
  1010.         {
  1011.             tokens = strtok( struct.script_string, " " );
  1012.             _a3583 = tokens;
  1013.             _k3583 = getFirstArrayKey( _a3583 );
  1014.             while ( isDefined( _k3583 ) )
  1015.             {
  1016.                 token = _a3583[ _k3583 ];
  1017.                 if ( token == match_string )
  1018.                 {
  1019.                     pos[ pos.size ] = struct;
  1020.                 }
  1021.                 _k3583 = getNextArrayKey( _a3583, _k3583 );
  1022.             }
  1023.         }
  1024.         else pos[ pos.size ] = struct;
  1025.         _k3578 = getNextArrayKey( _a3578, _k3578 );
  1026.     }
  1027.     if ( !isDefined( pos ) || pos.size == 0 )
  1028.     {
  1029.         return;
  1030.     }
  1031.     precachemodel( "zm_collision_perks1" );
  1032.     i = 0;
  1033.     while ( i < pos.size )
  1034.     {
  1035.         perk = pos[ i ].script_noteworthy;
  1036.         if ( isDefined( perk ) && isDefined( pos[ i ].model ) )
  1037.         {
  1038.             use_trigger = spawn( "trigger_radius_use", pos[ i ].origin + vectorScale( ( 0, -1, 0 ), 30 ), 0, 40, 70 );
  1039.             use_trigger.targetname = "zombie_vending";
  1040.             use_trigger.script_noteworthy = perk;
  1041.             use_trigger triggerignoreteam();
  1042.             perk_machine = spawn( "script_model", pos[ i ].origin );
  1043.             perk_machine.angles = pos[ i ].angles;
  1044.             perk_machine setmodel( pos[ i ].model );
  1045.             if ( isDefined( level._no_vending_machine_bump_trigs ) && level._no_vending_machine_bump_trigs )
  1046.             {
  1047.                 bump_trigger = undefined;
  1048.             }
  1049.             else
  1050.             {
  1051.                 bump_trigger = spawn( "trigger_radius", pos[ i ].origin, 0, 35, 64 );
  1052.                 bump_trigger.script_activated = 1;
  1053.                 bump_trigger.script_sound = "zmb_perks_bump_bottle";
  1054.                 bump_trigger.targetname = "audio_bump_trigger";
  1055.                 if ( perk != "specialty_weapupgrade" )
  1056.                 {
  1057.                     bump_trigger thread thread_bump_trigger();
  1058.                 }
  1059.             }
  1060.             collision = spawn( "script_model", pos[ i ].origin, 1 );
  1061.             collision.angles = pos[ i ].angles;
  1062.             collision setmodel( "zm_collision_perks1" );
  1063.             collision.script_noteworthy = "clip";
  1064.             collision disconnectpaths();
  1065.             use_trigger.clip = collision;
  1066.             use_trigger.machine = perk_machine;
  1067.             use_trigger.bump = bump_trigger;
  1068.             if ( isDefined( pos[ i ].blocker_model ) )
  1069.             {
  1070.                 use_trigger.blocker_model = pos[ i ].blocker_model;
  1071.             }
  1072.             if ( isDefined( pos[ i ].script_int ) )
  1073.             {
  1074.                 perk_machine.script_int = pos[ i ].script_int;
  1075.             }
  1076.             if ( isDefined( pos[ i ].turn_on_notify ) )
  1077.             {
  1078.                 perk_machine.turn_on_notify = pos[ i ].turn_on_notify;
  1079.             }
  1080.             if ( perk == "specialty_scavenger" || perk == "specialty_scavenger_upgrade" )
  1081.             {
  1082.                 use_trigger.script_sound = "mus_perks_tombstone_jingle";
  1083.                 use_trigger.script_string = "tombstone_perk";
  1084.                 use_trigger.script_label = "mus_perks_tombstone_sting";
  1085.                 use_trigger.target = "vending_tombstone";
  1086.                 perk_machine.script_string = "tombstone_perk";
  1087.                 perk_machine.targetname = "vending_tombstone";
  1088.                 if ( isDefined( bump_trigger ) )
  1089.                 {
  1090.                     bump_trigger.script_string = "tombstone_perk";
  1091.                 }
  1092.             }
  1093.             if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].perk_machine_set_kvps ) )
  1094.             {
  1095.                 [[ level._custom_perks[ perk ].perk_machine_set_kvps ]]( use_trigger, perk_machine, bump_trigger, collision );
  1096.             }
  1097.         }
  1098.         i++;
  1099.     }
  1100. }
  1101. isTown()
  1102. {
  1103.     if (isDefined(level.zombiemode_using_tombstone_perk) && level.zombiemode_using_tombstone_perk)
  1104.     {
  1105.         level thread perk_machine_spawn_init();
  1106.         thread solo_tombstone_removal();
  1107.         thread turn_tombstone_on();
  1108.     }
  1109. }
  1110. CustomWeaponSystem(string, origin, weapon)
  1111. {
  1112.     level thread LowerMessage( "Secret Room Weapons", string );
  1113.     RoomWeapons = spawn("trigger_radius", origin, 1, 20, 20);
  1114.     RoomWeapons rotateTo((0, 90, 0), .1);
  1115.     RoomWeapons SetCursorHint( "HINT_NOICON" );
  1116.     RoomWeapons setLowerMessage( RoomWeapons, "Secret Room Weapons" );
  1117.     for(;;)
  1118.     {
  1119.         RoomWeapons waittill("trigger", i);
  1120.         if(isDefined(self.staffgrabbed))
  1121.         {
  1122.             RoomWeapons delete();
  1123.         }
  1124.         if(i useButtonPressed() && distance(i.origin, origin) < 40)
  1125.         {
  1126.             wait .3;
  1127.             if(i useButtonPressed())
  1128.             {
  1129.                 if(!isDefined(self.staffgrabbed))
  1130.                 {
  1131.                     self.staffgrabbed = true;
  1132.                     w = i GetWeaponsListPrimaries();
  1133.                     i playsound( "zmb_cha_ching" );
  1134.                     playerCurrent = i getCurrentWeapon();
  1135.                     if(w.size > 1)i takeWeapon(playerCurrent);
  1136.                     i giveweapon( "knife_zm" );
  1137.                     i giveWeapon( weapon );
  1138.                     i givemaxammo( weapon );
  1139.                     i switchToWeapon( weapon );
  1140.                     i play_weapon_vo( weapon );
  1141.                     wait 1;
  1142.                     RoomWeapons delete();
  1143.                 }
  1144.             }
  1145.         }
  1146.     }
  1147. }
  1148. CustomEventTrigger( origin )
  1149. {
  1150.     self endon( "disconnect" );
  1151.     level endon( "end_game" );
  1152.     if(!isDefined(self.totalskulls))
  1153.         self.totalskulls = 1;
  1154.     else
  1155.         self.totalskulls += 1;
  1156.     trig = spawn("trigger_radius", origin, 1, 25, 25);
  1157.     for(;;)
  1158.     {
  1159.         trig waittill("trigger", self);
  1160.         if(self useButtonPressed())
  1161.         {
  1162.             wait .25;
  1163.             if(self useButtonPressed())
  1164.             {
  1165.                 if(!isDefined(self.skulls))
  1166.                     self.skulls = 1;
  1167.                 else
  1168.                     self.skulls += 1;
  1169.                 wait 0.05;
  1170.                 if(self.skulls != self.totalskulls)
  1171.                 {
  1172.                     self playsound("zmb_insta_kill");
  1173.                     return;
  1174.                 }
  1175.                 else
  1176.                 {
  1177.                     self playsound("zmb_cha_ching");
  1178.                     self thread getAllPerks();
  1179.                     if(level.script == "zm_tomb")
  1180.                     {
  1181.                         self thread CustomWeaponSystem("Hold ^3F ^7for Lightning Staff", (54, 230.5, -752), "staff_lightning_zm");
  1182.                         self thread CustomWeaponSystem("Hold ^3F ^7for Fire Staff", (139.4, 189, -752), "staff_fire_zm");
  1183.                         self thread CustomWeaponSystem("Hold ^3F ^7for Water Staff", (-57.5, 230, -752), "staff_water_zm");
  1184.                         self thread CustomWeaponSystem("Hold ^3F ^7for Wind Staff", (-142, 187, -752), "staff_lightning_zm");
  1185.                     }
  1186.                     else if(level.script == "zm_prison")
  1187.                     {
  1188.                         self playsound( "zmb_buildable_complete" );
  1189.                         w = self GetWeaponsListPrimaries();
  1190.                         if(w.size > 1)
  1191.                             self takeWeapon(self getCurrentWeapon());
  1192.                         self giveWeapon("blundergat_zm");
  1193.                         self SwitchToWeapon("blundergat_zm");
  1194.                     }
  1195.                     else
  1196.                         self playsoundtoplayer( level.zmb_laugh_alias, self );
  1197.                     self iprintln("Congratulations! You completed the easter egg!");
  1198.                     return;
  1199.                 }
  1200.             }
  1201.         }
  1202.     }
  1203. }
  1204. customEasterEgg()
  1205. {
  1206.     if(level.script == "zm_tranzit")
  1207.     {
  1208.         self thread CustomEventTrigger( (10411, 7326, -570) );
  1209.         self thread CustomEventTrigger( (-7622, 4903, -54) );
  1210.         self thread CustomEventTrigger( (452, -384, -62) );
  1211.     }
  1212.     else if(level.script == "zm_buried")
  1213.     {
  1214.         self thread CustomEventTrigger( (2596, 34.5, 88) );
  1215.         self thread CustomEventTrigger( (1333, 1391, 200) );
  1216.         self thread CustomEventTrigger( (3281, 430, 240) );
  1217.     }
  1218.     else if(level.script == "zm_highrise")
  1219.     {
  1220.         self thread CustomEventTrigger( (3448, 1347, 3032) );
  1221.         self thread CustomEventTrigger( (2843.5, 1228.5, 2711) );
  1222.         self thread CustomEventTrigger( (2105, 103, 1120) );
  1223.     }
  1224.     else if(level.script == "zm_nuked")
  1225.     {
  1226.         self thread CustomEventTrigger( (184, 664, -61.5) );
  1227.         self thread CustomEventTrigger( (795, 373, 88) );
  1228.         self thread CustomEventTrigger( (-485, 554, 85) );
  1229.     }
  1230.     else if(level.script == "zm_prison")
  1231.     {
  1232.         self thread CustomEventTrigger( (436, 10264, 1337) );
  1233.         self thread CustomEventTrigger( (2503, 9440, 1528) );
  1234.         self thread CustomEventTrigger( (4.5, 7610, 64) );
  1235.     }
  1236.     else if(level.script == "zm_tomb")
  1237.     {
  1238.         self thread CustomEventTrigger( (-446, 3976, -352) );
  1239.         self thread CustomEventTrigger( (-479, 2952, -256) );
  1240.         self thread CustomEventTrigger( (2095, 4567, -304) );
  1241.     }
  1242. }
  1243. getAllPerks()
  1244. {
  1245.     self endon("disconnect");
  1246.     level endon("end_game");
  1247.    
  1248.     for(;;)
  1249.     {
  1250.         wait 0.5;
  1251.         if (isDefined(level.zombiemode_using_juggernaut_perk) && level.zombiemode_using_juggernaut_perk)
  1252.             self doGivePerk("specialty_armorvest");
  1253.         if (isDefined(level.zombiemode_using_sleightofhand_perk) && level.zombiemode_using_sleightofhand_perk)
  1254.             self doGivePerk("specialty_fastreload");
  1255.         if (isDefined(level.zombiemode_using_revive_perk) && level.zombiemode_using_revive_perk)
  1256.             self doGivePerk("specialty_quickrevive");
  1257.         if (isDefined(level.zombiemode_using_doubletap_perk) && level.zombiemode_using_doubletap_perk)
  1258.             self doGivePerk("specialty_rof");
  1259.         if (isDefined(level.zombiemode_using_marathon_perk) && level.zombiemode_using_marathon_perk)
  1260.             self doGivePerk("specialty_longersprint");
  1261.         if(isDefined(level.zombiemode_using_additionalprimaryweapon_perk) && level.zombiemode_using_additionalprimaryweapon_perk)
  1262.             self doGivePerk("specialty_additionalprimaryweapon");
  1263.         if (isDefined(level.zombiemode_using_deadshot_perk) && level.zombiemode_using_deadshot_perk)
  1264.             self doGivePerk("specialty_deadshot");
  1265.         if (isDefined(level.zombiemode_using_tombstone_perk) && level.zombiemode_using_tombstone_perk)
  1266.             self doGivePerk("specialty_scavenger");
  1267.         if (isDefined(level._custom_perks) && isDefined(level._custom_perks["specialty_flakjacket"]) && (level.script != "zm_buried"))
  1268.             self doGivePerk("specialty_flakjacket");
  1269.         if (isDefined(level._custom_perks) && isDefined(level._custom_perks["specialty_nomotionsensor"]))
  1270.             self doGivePerk("specialty_nomotionsensor");
  1271.         if (isDefined(level._custom_perks) && isDefined(level._custom_perks["specialty_grenadepulldeath"]))
  1272.             self doGivePerk("specialty_grenadepulldeath");
  1273.         //if (isDefined(level.zombiemode_using_chugabud_perk) && level.zombiemode_using_chugabud_perk)
  1274.             //self doGivePerk("specialty_finalstand");
  1275.     }
  1276. }
  1277. doGivePerk(perk)
  1278. {
  1279.     if (!(self hasperk(perk)))
  1280.         self thread maps/mp/zombies/_zm_perks::give_perk(perk, 1);
  1281. }
  1282. startCustomPowerups()
  1283. {
  1284.     if(!isDefined(level.custompowerupinit))
  1285.     {
  1286.         level.custompowerupinit = true;
  1287.         wait 2;
  1288.         level._zombiemode_powerup_grab = ::custom_powerup_grab;
  1289.     }
  1290. }
  1291. initCustomPowerups() //credit goes to _Ox for the original code <3
  1292. {
  1293.     level.unlimited_ammo_duration = 20;
  1294.     //unlimited ammo drop "bottomless clip" credit to _Ox
  1295.     include_zombie_powerup("unlimited_ammo");
  1296.     add_zombie_powerup("unlimited_ammo", "T6_WPN_AR_GALIL_WORLD", &"ZOMBIE_POWERUP_UNLIMITED_AMMO", ::func_should_always_drop, 0, 0, 0);
  1297.     powerup_set_can_pick_up_in_last_stand("unlimited_ammo", 1);
  1298.     if(getDvar("mapname") == "zm_prison")
  1299.     {
  1300.         //fast feet - speed potion, basically you run fast for 15 seconds
  1301.         include_zombie_powerup("fast_feet");
  1302.         add_zombie_powerup("fast_feet", "bottle_whisky_01", &"ZOMBIE_POWERUP_FAST_FEET", ::func_should_always_drop, 0, 0, 0);
  1303.         powerup_set_can_pick_up_in_last_stand("fast_feet", 1);
  1304.         //pack a punch - pack a punches your current gun credit Knight
  1305.         include_zombie_powerup("pack_a_punch");
  1306.         add_zombie_powerup("pack_a_punch", "p6_zm_al_vending_pap_on", &"ZOMBIE_POWERUP_PACK_A_PUNCH", ::func_should_drop_pack_a_punch, 0, 0, 0);
  1307.         powerup_set_can_pick_up_in_last_stand("pack_a_punch", 0);
  1308.         //couldn't find a better model for this money drop, if you find a better one pls let me know haha
  1309.         include_zombie_powerup("money_drop");
  1310.         add_zombie_powerup("money_drop", "p6_anim_zm_al_magic_box_lock_red", &"ZOMBIE_POWERUP_MONEY_DROP", ::func_should_always_drop, 0, 0, 0);
  1311.         powerup_set_can_pick_up_in_last_stand("money_drop", 1);
  1312.     }
  1313.     else
  1314.     {
  1315.         include_zombie_powerup("fast_feet");
  1316.         add_zombie_powerup("fast_feet", "zombie_pickup_perk_bottle", &"ZOMBIE_POWERUP_FAST_FEET", ::func_should_always_drop, 0, 0, 0);
  1317.         powerup_set_can_pick_up_in_last_stand("fast_feet", 1);
  1318.        
  1319.         include_zombie_powerup("pack_a_punch");
  1320.         add_zombie_powerup("pack_a_punch", "p6_anim_zm_buildable_pap", &"ZOMBIE_POWERUP_PACK_A_PUNCH", ::func_should_drop_pack_a_punch, 0, 0, 0);
  1321.         powerup_set_can_pick_up_in_last_stand("pack_a_punch", 0);
  1322.        
  1323.         include_zombie_powerup("money_drop");
  1324.         add_zombie_powerup("money_drop", "zombie_teddybear", &"ZOMBIE_POWERUP_MONEY_DROP", ::func_should_always_drop, 0, 0, 0);
  1325.         powerup_set_can_pick_up_in_last_stand("money_drop", 1);
  1326.     }
  1327. }
  1328. func_should_drop_pack_a_punch()
  1329. {
  1330.     if ( level.zmPowerupsEnabled[ "pack_a_punch" ].active != 1 || level.round_number < 12 || isDefined( level.rounds_since_last_pack_a_punch_drop ) && level.rounds_since_last_pack_a_punch_drop < 5 )
  1331.     {
  1332.         return 0;
  1333.     }
  1334.     return 1;
  1335. }
  1336. custom_powerup_grab(powerup, player) //credit to _Ox much thx for powerup functions
  1337. {
  1338.     if(powerup.powerup_name == "money_drop")
  1339.         player thread doRandomScore(); //some cash money
  1340.     else if(powerup.powerup_name == "pack_a_punch")
  1341.         player thread doPackAPunchWeapon(); //i dont even use this one, its so OP lmao. If we could edit drop rate for this drop only it'd be better
  1342.     else if(powerup.powerup_name == "unlimited_ammo")
  1343.         player thread doUnlimitedAmmo(); //credit to _Ox for this one baby. its so good
  1344.     else if(powerup.powerup_name == "fast_feet")
  1345.         player thread doFastFeet(); //go fast as fuck boi
  1346. }
  1347. doFastFeet() //gotta go fast!
  1348. {
  1349.     self thread poweruptext("Fast Feet!"); //thanks to _Ox again for the powerup pickup string
  1350.     self playsound("zmb_cha_ching"); //m-m-m-m-m-money shot
  1351.     self setmovespeedscale(3); //super sonic speed
  1352.     wait 15;
  1353.     self setmovespeedscale(1);
  1354.     self playsound("zmb_insta_kill"); //less happy sound than before
  1355. }
  1356. doUnlimitedAmmo() //unlimited ammo powerup function credit _Ox
  1357. {
  1358.     foreach(player in level.players)
  1359.     {
  1360.         player notify("end_unlimited_ammo");
  1361.         player playsound("zmb_cha_ching");
  1362.         player thread poweruptext("Bottomless Clip");
  1363.         player thread monitorUnlimitedAmmo(); //bottomless clip
  1364.         player thread notifyUnlimitedAmmoEnd(); //notify when it ends
  1365.     }
  1366. }
  1367. monitorUnlimitedAmmo() //credit to _Ox
  1368. {
  1369.     level endon("end_game");
  1370.     self endon("disonnect");
  1371.     self endon("end_unlimited_ammo");
  1372.     for(;;)
  1373.     {
  1374.         self setWeaponAmmoClip(self GetCurrentWeapon(), 150);
  1375.         wait .05;
  1376.     }
  1377. }
  1378. notifyUnlimitedAmmoEnd() //credit to _Ox
  1379. {
  1380.     level endon("end_game");
  1381.     self endon("disonnect");
  1382.     self endon("end_unlimited_ammo");
  1383.     wait level.unlimited_ammo_duration;
  1384.     self playsound("zmb_insta_kill");
  1385.     self notify("end_unlimited_ammo");
  1386. }
  1387. doPackAPunchWeapon() //pack a punch function credit Knight
  1388. {
  1389.     baseweapon = get_base_name(self getcurrentweapon());
  1390.     weapon = get_upgrade(baseweapon);
  1391.     if(IsDefined(weapon) && isDefined(self.packapunching))
  1392.     {
  1393.         level.rounds_since_last_pack_a_punch_drop = 0;
  1394.         self.packapunching = undefined;
  1395.         self takeweapon(baseweapon);
  1396.         self giveweapon(weapon, 0, self get_pack_a_punch_weapon_options(weapon));
  1397.         self switchtoweapon(weapon);
  1398.         self givemaxammo(weapon);
  1399.     }
  1400.     else
  1401.         self playsoundtoplayer( level.zmb_laugh_alias, self );
  1402. }
  1403. get_upgrade(weapon)
  1404. {
  1405.     if(IsDefined(level.zombie_weapons[weapon].upgrade_name) && IsDefined(level.zombie_weapons[weapon]))
  1406.     {
  1407.         self.packapunching = true;
  1408.         return get_upgrade_weapon(weapon, 0 );
  1409.     }
  1410.     else
  1411.         return get_upgrade_weapon(weapon, 1 );
  1412. }
  1413. doRandomScore() //this is a bad way of doing this but i couldnt get the array to work before and did this out of frustration
  1414. {
  1415.     x = randomInt(9); //picks a number 0-9
  1416.     self playsound("zmb_cha_ching");
  1417.     if(x==1)
  1418.         self.score += 50; //+50
  1419.     else if(x==2)
  1420.         self.score += 100; //+100
  1421.     else if(x==3)
  1422.         self.score += 250; //+250 I think you get the idea
  1423.     else if(x==4)
  1424.         self.score += 500;
  1425.     else if(x==5)
  1426.         self.score += 750;
  1427.     else if(x==6)
  1428.         self.score += 1000;
  1429.     else if(x==7)
  1430.         self.score += 2500;
  1431.     else if(x==8)
  1432.         self.score += 5000;
  1433.     else if(x==9)
  1434.         self.score += 7500;
  1435.     else
  1436.         self.score += 10000;
  1437. }
  1438. poweruptext(text) //credit to _Ox for base string hud
  1439. {
  1440.     self endon("disconnect");
  1441.     level endon("end_game");
  1442.     hud_string = newclienthudelem(self);
  1443.     hud_string.elemtype = "font";
  1444.     hud_string.font = "objective";
  1445.     hud_string.fontscale = 2;
  1446.     hud_string.x = 0;
  1447.     hud_string.y = 0;
  1448.     hud_string.width = 0;
  1449.     hud_string.height = int( level.fontheight * 2 );
  1450.     hud_string.xoffset = 0;
  1451.     hud_string.yoffset = 0;
  1452.     hud_string.children = [];
  1453.     hud_string setparent(level.uiparent);
  1454.     hud_string.hidden = 0;
  1455.     hud_string maps/mp/gametypes_zm/_hud_util::setpoint("TOP", undefined, 0, level.zombie_vars["zombie_timer_offset"] - (level.zombie_vars["zombie_timer_offset_interval"] * 2));
  1456.     hud_string.sort = .5;
  1457.     hud_string.alpha = 0;
  1458.     hud_string fadeovertime(.5);
  1459.     hud_string.alpha = 1;
  1460.     hud_string setText(text);
  1461.     hud_string thread poweruptextmove();
  1462. }
  1463. poweruptextmove() //credit to _Ox for base string hud
  1464. {
  1465.     wait .5;
  1466.     self fadeovertime(1.5);
  1467.     self moveovertime(1.5);
  1468.     self.y = 270;
  1469.     self.alpha = 0;
  1470.     wait 1.5;
  1471.     self destroy();
  1472. }
  1473. onPlayerDowned()
  1474. {
  1475.     self endon("disconnect");
  1476.     self endon("death");
  1477.     level endon("end_game");
  1478.    
  1479.     for(;;)
  1480.     {
  1481.         self waittill( "player_downed" );
  1482.         self unsetperk( "specialty_additionalprimaryweapon" ); //removes the mulekick perk functionality
  1483.         self unsetperk( "specialty_longersprint" ); //removes the staminup perk functionality
  1484.         self unsetperk( "specialty_deadshot" ); //removes the deadshot perk functionality
  1485.         self.hasPHD = undefined; //resets the flopper variable
  1486.         self.hasMuleKick = undefined; //resets the mule kick variable
  1487.         self.hasStaminUp = undefined; //resets the staminup variable
  1488.         self.hasDeadshot = undefined; //resets the deadshot variable
  1489.         self.icon1 Destroy();self.icon1 = undefined; //deletes the perk icons and resets the variable
  1490.         self.icon2 Destroy();self.icon2 = undefined; //deletes the perk icons and resets the variable
  1491.         self.icon3 Destroy();self.icon3 = undefined; //deletes the perk icons and resets the variable
  1492.         self.icon4 Destroy();self.icon4 = undefined; //deletes the perk icons and resets the variable
  1493.     }
  1494. }
  1495. initCustomPerksOnPlayer()
  1496. {
  1497.     self.hasPHD = undefined; //also resets phd flopper when a player dies and respawns
  1498.     if(getDvar("mapname") == "zm_nuked" || getDvar("mapname") == "zm_transit" || getDvar("mapname") == "zm_buried" || getDvar("mapname") == "zm_highrise" || getDvar("mapname") == "zm_prison")
  1499.     {
  1500.         self thread onPlayerDowned(); //takes perks and perk icons when you go down
  1501.     }
  1502.     else if(getDvar("mapname") != "zm_tomb" && level.disableAllCustomPerks == 0 && level.enablePHDFlopper == 1)
  1503.     {
  1504.         self.hasPHD = true; //gives phd on maps like town (i think. i actually never tested on any maps besides the ones provided)
  1505.         self thread drawCustomPerkHUD("specialty_doubletap_zombies", 0, (1, 0.25, 1));
  1506.     }
  1507. }
  1508. startCustomPerkMachines()
  1509. {
  1510.     if(level.disableAllCustomPerks == 0)
  1511.     {
  1512.         self thread doPHDdive(); //self.hasPHD needs to be defined in order for this to work (after you pickup perk)
  1513.         if(getDvar("mapname") == "zm_prison") //mob of the dead
  1514.         {
  1515.             if(level.enablePHDFlopper == 1)
  1516.                 self thread CustomPerkMachine( "zombie_perk_bottle_deadshot", "p6_zm_al_vending_nuke_on", "PHD Flopper", 3000, (2427.45, 10048.4, 1704.13), "PHD_FLOPPER", (0, 0, 0) );
  1517.             if(level.enableStaminUp == 1)
  1518.                 self thread CustomPerkMachine( "zombie_perk_bottle_deadshot", "p6_zm_al_vending_doubletap2_on", "Stamin-Up", 2000, (-339.642, -3915.84, -8447.88), "specialty_longersprint", (0, 270, 0) );
  1519.         }
  1520.         else if(getDvar("mapname") == "zm_highrise") //die rise
  1521.         {
  1522.             if(level.enablePHDFlopper == 1)
  1523.                 self thread CustomPerkMachine( "zombie_perk_bottle_whoswho", "zombie_vending_nuke_on_lo", "PHD Flopper", 3000, (1260.3, 2736.36, 3047.49), "PHD_FLOPPER", (0, 0, 0) );
  1524.             if(level.enableDeadshot == 1)
  1525.                 self thread CustomPerkMachine( "zombie_perk_bottle_whoswho", "zombie_vending_revive", "Deadshot Daiquiri", 1500, (3690.54, 1932.36, 1420), "specialty_deadshot", (-15, 0, 0) );
  1526.             if(level.enableStaminUp == 1)
  1527.                 self thread CustomPerkMachine( "zombie_perk_bottle_revive", "zombie_vending_doubletap2", "Stamin-Up", 2000, (1704, -35, 1120.13), "specialty_longersprint", (0, -30, 0) );
  1528.         }
  1529.         else if(getDvar("mapname") == "zm_buried") //buried
  1530.         {
  1531.             if(level.enablePHDFlopper == 1)
  1532.                 self thread CustomPerkMachine( "zombie_perk_bottle_marathon", "zombie_vending_jugg", "PHD Flopper", 3000, (2631.73, 304.165, 240.125), "PHD_FLOPPER", (5, 0, 0) );
  1533.             if(level.enableDeadshot == 1)
  1534.                 self thread CustomPerkMachine( "zombie_perk_bottle_marathon", "zombie_vending_revive", "Deadshot Daiquiri", 1500, (1055.18, -1055.55, 201), "specialty_deadshot", (3, 270, 0) );
  1535.         }
  1536.         else if(getDvar("mapname") == "zm_nuked") //nuketown
  1537.         {
  1538.             if(level.enablePHDFlopper == 1)
  1539.                 self thread CustomPerkMachine( "zombie_perk_bottle_revive", "zombie_vending_jugg", "PHD Flopper", 3000, (683, 727, -56), "PHD_FLOPPER", (5, 250, 0) );
  1540.             if(level.enableDeadshot == 1)
  1541.                 self thread CustomPerkMachine( "zombie_perk_bottle_jugg", "zombie_vending_revive", "Deadshot Daiquiri", 1500, (747, 356, 91), "specialty_deadshot", (0, 330, 0) );
  1542.             if(level.enableStaminUp == 1)
  1543.                 self thread CustomPerkMachine( "zombie_perk_bottle_revive", "zombie_vending_doubletap2", "Stamin-Up", 2000, (-638, 268, -54), "specialty_longersprint", (0, 165, 0) );
  1544.             if(level.enableMuleKick == 1)
  1545.                 self thread CustomPerkMachine( "zombie_perk_bottle_jugg", "zombie_vending_sleight", "Mule Kick", 3000, (-953, 715, 83), "specialty_additionalprimaryweapon", (0, 75, 0) );
  1546.         }
  1547.         else if(getDvar("mapname") == "zm_transit") //transit
  1548.         {
  1549.             if(level.enablePHDFlopper == 1)
  1550.                 self thread CustomPerkMachine( "zombie_perk_bottle_revive", "zombie_vending_jugg", "PHD Flopper", 3000, (-6304, 5430, -55), "PHD_FLOPPER", (0, 90, 0) );
  1551.             if(level.enableDeadshot == 1)
  1552.                 self thread CustomPerkMachine( "zombie_perk_bottle_jugg", "zombie_vending_revive", "Deadshot Daiquiri", 1500, (-6088, -7419, 0), "specialty_deadshot", (0, 90, 0) );
  1553.             if(level.enableMuleKick == 1)
  1554.                 self thread CustomPerkMachine( "zombie_perk_bottle_jugg", "zombie_vending_sleight", "Mule Kick", 3000, (1149, -215, -304), "specialty_additionalprimaryweapon", (0, 180, 0) );
  1555.         }
  1556.     }
  1557. }
  1558. doPHDdive() //credit to extinct. just edited to add self.hasPHD variable
  1559. {
  1560.     self endon("disconnect");
  1561.     level endon("end_game");
  1562.    
  1563.     for(;;)
  1564.     {
  1565.         if(isDefined(self.divetoprone) && self.divetoprone)
  1566.         {
  1567.             if(self isOnGround() && isDefined(self.hasPHD))
  1568.             {
  1569.                 if(level.script == "zm_tomb" || level.script == "zm_buried")   
  1570.                     explosionfx = level._effect["divetonuke_groundhit"];
  1571.                 else
  1572.                     explosionfx = loadfx("explosions/fx_default_explosion");
  1573.                 self playSound("zmb_phdflop_explo");
  1574.                 playfx(explosionfx, self.origin);
  1575.                 self damageZombiesInRange(310, self, "kill");
  1576.                 wait .3;
  1577.             }
  1578.         }
  1579.         wait .05;
  1580.     }
  1581. }
  1582. damageZombiesInRange(range, what, amount) //damage zombies for phd flopper
  1583. {
  1584.     enemy = getAiArray(level.zombie_team);
  1585.     foreach(zombie in enemy)
  1586.     {
  1587.         if(distance(zombie.origin, what.origin) < range)
  1588.         {
  1589.             if(amount == "kill")
  1590.                 zombie doDamage(zombie.health * 2, zombie.origin, self);
  1591.             else
  1592.                 zombie doDamage(amount, zombie.origin, self);
  1593.         }
  1594.     }
  1595. }
  1596. phd_flopper_dmg_check( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) //phdflopdmgchecker lmao
  1597. {
  1598.     self endon( "disconnect" );
  1599.     level endon( "end_game" );
  1600.     if ( smeansofdeath == "MOD_FALLING" || smeansofdeath == "MOD_PROJECTILE" || smeansofdeath == "MOD_PROJECTILE_SPLASH" || smeansofdeath == "MOD_GRENADE" || smeansofdeath == "MOD_GRENADE_SPLASH" || smeansofdeath == "MOD_EXPLOSIVE" )
  1601.     {
  1602.         if(isDefined(self.hasPHD)) //if player has phd flopper, dont damage the player
  1603.             return;
  1604.     }
  1605.     [[ level.playerDamageStub ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex );
  1606. }
  1607. CustomPerkMachine( bottle, model, perkname, cost, origin, perk, angles ) //custom perk system. orginal code from ZeiiKeN. edited to work for all maps and custom phd perk
  1608. {
  1609.     self endon( "disconnect" );
  1610.     level endon( "end_game" );
  1611.     if(!isDefined(level.customPerksAreSpawned))
  1612.         level.customPerksAreSpawned = true;
  1613.     if(!isDefined(self.customPerkNum))
  1614.         self.customPerkNum = 1;
  1615.     else
  1616.         self.customPerkNum += 1;
  1617.     collision = spawn("script_model", origin);
  1618.     collision setModel("collision_geo_cylinder_32x128_standard");
  1619.     collision rotateTo(angles, .1);
  1620.     RPerks = spawn( "script_model", origin );
  1621.     RPerks setModel( model );
  1622.     RPerks rotateTo(angles, .1);
  1623.     level thread LowerMessage( "Custom Perks", "Hold ^3F ^7for "+perkname+" [Cost: "+cost+"]" );
  1624.     trig = spawn("trigger_radius", origin, 1, 25, 25);
  1625.     trig SetCursorHint( "HINT_NOICON" );
  1626.     trig setLowerMessage( trig, "Custom Perks" );
  1627.     for(;;)
  1628.     {
  1629.         trig waittill("trigger", self);
  1630.         if(self useButtonPressed() && self.score >= cost)
  1631.         {
  1632.             wait .25;
  1633.             if(self useButtonPressed())
  1634.             {
  1635.                 if(perk != "PHD_FLOPPER" && !self hasPerk(perk) || perk == "PHD_FLOPPER" && !isDefined(self.hasPHD))
  1636.                 {
  1637.                     self playsound( "zmb_cha_ching" ); //money shot
  1638.                     self.score -= cost; //take points
  1639.                     level.trig hide();
  1640.                     self thread GivePerk( bottle, perk, perkname ); //give perk
  1641.                     wait 2;
  1642.                     level.trig show();
  1643.                 }
  1644.                 else
  1645.                     self iprintln("You Already Have "+perkname+"!");
  1646.             }
  1647.         }
  1648.     }
  1649. }
  1650. GivePerk( model, perk, perkname )
  1651. {
  1652.     self DisableOffhandWeapons();
  1653.     self DisableWeaponCycling();
  1654.     weaponA = self getCurrentWeapon();
  1655.     weaponB = model;
  1656.     self GiveWeapon( weaponB );
  1657.     self SwitchToWeapon( weaponB );
  1658.     self waittill( "weapon_change_complete" );
  1659.     self EnableOffhandWeapons();
  1660.     self EnableWeaponCycling();
  1661.     self TakeWeapon( weaponB );
  1662.     self SwitchToWeapon( weaponA );
  1663.     self setperk( perk );
  1664.     self maps/mp/zombies/_zm_audio::playerexert( "burp" );
  1665.     self setblur( 4, 0.1 );
  1666.     wait 0.1;
  1667.     self setblur( 0, 0.1 );
  1668.     if(perk == "PHD_FLOPPER")
  1669.     {
  1670.         self.hasPHD = true;
  1671.         self thread drawCustomPerkHUD("specialty_doubletap_zombies", 0, (1, 0.25, 1));
  1672.     }
  1673.     else if(perk == "specialty_additionalprimaryweapon")
  1674.     {
  1675.         self.hasMuleKick = true;
  1676.         self thread drawCustomPerkHUD("specialty_fastreload_zombies", 0, (0, 0.7, 0));
  1677.     }
  1678.     else if(perk == "specialty_longersprint")
  1679.     {
  1680.         self.hasStaminUp = true;
  1681.         self thread drawCustomPerkHUD("specialty_juggernaut_zombies", 0, (1, 1, 0));
  1682.     }
  1683.     else if(perk == "specialty_deadshot")
  1684.     {
  1685.         self.hasDeadshot = true;
  1686.         self thread drawCustomPerkHUD("specialty_quickrevive_zombies", 0, (0.125, 0.125, 0.125));
  1687.     }
  1688. }
  1689. LowerMessage( ref, text )
  1690. {
  1691.     if( !IsDefined( level.zombie_hints ) )
  1692.         level.zombie_hints = [];
  1693.     PrecacheString( text );
  1694.     level.zombie_hints[ref] = text;
  1695. }
  1696. setLowerMessage( ent, default_ref )
  1697. {
  1698.     if( IsDefined( ent.script_hint ) )
  1699.         self SetHintString( get_zombie_hint( ent.script_hint ) );
  1700.     else
  1701.         self SetHintString( get_zombie_hint( default_ref ) );
  1702. }
  1703. drawshader( shader, x, y, width, height, color, alpha, sort )
  1704. {
  1705.     hud = newclienthudelem( self );
  1706.     hud.elemtype = "icon";
  1707.     hud.color = color;
  1708.     hud.alpha = alpha;
  1709.     hud.sort = sort;
  1710.     hud.children = [];
  1711.     hud setparent( level.uiparent );
  1712.     hud setshader( shader, width, height );
  1713.     hud.x = x;
  1714.     hud.y = y;
  1715.     return hud;
  1716. }
  1717. drawCustomPerkHUD(perk, x, color, perkname) //perk hud thinking or whatever. probably not the best method but whatever lol
  1718. {
  1719.     if(!isDefined(self.icon1))
  1720.     {
  1721.         x = -408;
  1722.         if(getDvar("mapname") == "zm_buried")
  1723.             self.icon1 = self drawshader( perk, x, 293, 24, 25, color, 100, 0 );
  1724.         else
  1725.             self.icon1 = self drawshader( perk, x, 320, 24, 25, color, 100, 0 );
  1726.     }
  1727.     else if(!isDefined(self.icon2))
  1728.     {
  1729.         x = -378;
  1730.         if(getDvar("mapname") == "zm_buried")
  1731.             self.icon2 = self drawshader( perk, x, 293, 24, 25, color, 100, 0 );
  1732.         else
  1733.             self.icon2 = self drawshader( perk, x, 320, 24, 25, color, 100, 0 );
  1734.     }
  1735.     else if(!isDefined(self.icon3))
  1736.     {
  1737.         x = -348;
  1738.         if(getDvar("mapname") == "zm_buried")
  1739.             self.icon3 = self drawshader( perk, x, 293, 24, 25, color, 100, 0 );
  1740.         else
  1741.             self.icon3 = self drawshader( perk, x, 320, 24, 25, color, 100, 0 );
  1742.     }
  1743.     else if(!isDefined(self.icon4))
  1744.     {
  1745.         x = -318;
  1746.         if(getDvar("mapname") == "zm_buried")
  1747.             self.icon4 = self drawshader( perk, x, 293, 24, 25, color, 100, 0 );
  1748.         else
  1749.             self.icon4 = self drawshader( perk, x, 320, 24, 25, color, 100, 0 );
  1750.     }
  1751. }
  1752. LowerMessage( ref, text )
  1753. {
  1754.     if( !IsDefined( level.zombie_hints ) )
  1755.         level.zombie_hints = [];
  1756.     PrecacheString( text );
  1757.     level.zombie_hints[ref] = text;
  1758. }
  1759. setLowerMessage( ent, default_ref )
  1760. {
  1761.     if( IsDefined( ent.script_hint ) )
  1762.         self SetHintString( get_zombie_hint( ent.script_hint ) );
  1763.     else
  1764.         self SetHintString( get_zombie_hint( default_ref ) );
  1765. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement