From 00b4f148cdd4bbf7f73822a8be7a34a2483fd41d Mon Sep 17 00:00:00 2001 From: Nick // Cahz Date: Thu, 10 Jun 2021 16:11:07 -0700 Subject: [PATCH] fixed scripts that broke with an update --- .../maps/mp/gametypes_zm/_clientids.gsc | Bin 0 -> 33748 bytes .../maps/mp/zombies/_zm_chugabud.gsc | Bin 0 -> 16362 bytes .../maps/mp/zombies/_zm_powerups.gsc | Bin 0 -> 52332 bytes Zombies Mods/Zombies++/v1.2/README.md | 17 + .../Zombies++/v1.2/Source Code/_clientids.gsc | 1375 ++++++++ .../v1.2/Source Code/_zm_chugabud.gsc | 830 +++++ .../v1.2/Source Code/_zm_powerups.gsc | 3124 +++++++++++++++++ Zombies Mods/Zombies++/v1.2/dedicated_zm.cfg | 249 ++ .../maps/mp/gametypes_zm/_clientids.gsc | Bin 0 -> 38126 bytes Zombies Mods/Zombies++/v1.3/README.md | 12 + .../Zombies++/v1.3/Source Code/_clientids.gsc | 1591 +++++++++ 11 files changed, 7198 insertions(+) create mode 100644 Zombies Mods/Zombies++/v1.2/Precompiled/maps/mp/gametypes_zm/_clientids.gsc create mode 100644 Zombies Mods/Zombies++/v1.2/Precompiled/maps/mp/zombies/_zm_chugabud.gsc create mode 100644 Zombies Mods/Zombies++/v1.2/Precompiled/maps/mp/zombies/_zm_powerups.gsc create mode 100644 Zombies Mods/Zombies++/v1.2/README.md create mode 100644 Zombies Mods/Zombies++/v1.2/Source Code/_clientids.gsc create mode 100644 Zombies Mods/Zombies++/v1.2/Source Code/_zm_chugabud.gsc create mode 100644 Zombies Mods/Zombies++/v1.2/Source Code/_zm_powerups.gsc create mode 100644 Zombies Mods/Zombies++/v1.2/dedicated_zm.cfg create mode 100644 Zombies Mods/Zombies++/v1.3/Precompiled/maps/mp/gametypes_zm/_clientids.gsc create mode 100644 Zombies Mods/Zombies++/v1.3/README.md create mode 100644 Zombies Mods/Zombies++/v1.3/Source Code/_clientids.gsc diff --git a/Zombies Mods/Zombies++/v1.2/Precompiled/maps/mp/gametypes_zm/_clientids.gsc b/Zombies Mods/Zombies++/v1.2/Precompiled/maps/mp/gametypes_zm/_clientids.gsc new file mode 100644 index 0000000000000000000000000000000000000000..96116f3be135f13fd90db2741f157f55dc624ec9 GIT binary patch literal 33748 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 literal 0 HcmV?d00001 diff --git a/Zombies Mods/Zombies++/v1.2/Precompiled/maps/mp/zombies/_zm_chugabud.gsc b/Zombies Mods/Zombies++/v1.2/Precompiled/maps/mp/zombies/_zm_chugabud.gsc new file mode 100644 index 0000000000000000000000000000000000000000..99d2f96a637b8ca08b1775dc3d19ea0f66da1597 GIT binary patch literal 16362 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 literal 0 HcmV?d00001 diff --git a/Zombies Mods/Zombies++/v1.2/README.md b/Zombies Mods/Zombies++/v1.2/README.md new file mode 100644 index 0000000..85648b9 --- /dev/null +++ b/Zombies Mods/Zombies++/v1.2/README.md @@ -0,0 +1,17 @@ +# ZOMBIES++ +If you want to just run the mod, use the precompiled version of the files to save time. If you want to change anything about Z++, you need to edit the open source code. +## DIRECTIONS +###### PRECOMPILED +- Take the **maps** folder containing the precompiled files and directories and place it in your **t6r/data** folder +- Make sure to replace your _**dedicated_zm.cfg**_ file with the one for Z++ +###### EDITING SOURCE CODE +- Compile _**_clientids.gsc**_ as _**_clientids.gsc**_ and place it in the directory _**maps/mp/gametypes_zm/_clientids.gsc**_ +- Compile _**_zm_powerups.gsc**_ as _**_zm_powerups.gsc**_ and place it in the directory _**maps/mp/zombies/_zm_powerups.gsc**_ +- Compile _**_zm_chugabud.gsc**_ as _**_zm_chugabud.gsc**_ and place it in the directory _**maps/mp/zombies/_zm_chugabud.gsc**_ +- Make sure to replace your _**dedicated_zm.cfg**_ file with the one for Z++ +###### UPDATES V1.2 +- _**_zm_powerups.gsc**_ now holds all functions for custom powerups +- _**_clientids.gsc**_ now holds all other functions for Z++ +- Fixed Zombie Blood +- Fixed Zombie Counter +- Optimized Code for Stability diff --git a/Zombies Mods/Zombies++/v1.2/Source Code/_clientids.gsc b/Zombies Mods/Zombies++/v1.2/Source Code/_clientids.gsc new file mode 100644 index 0000000..5905d5c --- /dev/null +++ b/Zombies Mods/Zombies++/v1.2/Source Code/_clientids.gsc @@ -0,0 +1,1375 @@ +#include maps/mp/_utility; +#include common_scripts/utility; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/zombies/_zm; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/gametypes_zm/_hud_message; +#include maps/mp/zombies/_zm_powerups; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_score; + +init() +{ + startInit(); //precaching models + level thread onPlayerConnect(); //on connect + thread initServerDvars(); //initilize server dvars (credit JezuzLizard) + thread startCustomPerkMachines(); //custom perk machines + level.afterlife_give_loadout = maps/mp/gametypes_zm/_clientids::give_afterlife_loadout; //override function that gives loadout back to the player. + level.playerDamageStub = level.callbackplayerdamage; //damage callback for phd flopper + level.callbackplayerdamage = ::phd_flopper_dmg_check; //more damage callback stuff. everybody do the flop + //level.using_solo_revive = 0; //disables solo revive, fixing only 3 revives per game. + //level.is_forever_solo_game = 0; //changes afterlives on motd from 3 to 1 + isTown(); //jezuzlizard's fix for tombstone :) +} + +onPlayerConnect() +{ + level endon( "end_game" ); + self endon( "disconnect" ); + for (;;) + { + level waittill( "connected", player ); + + player thread [[level.givecustomcharacters]](); + player thread doPHDdive(); + player thread onPlayerSpawned(); + player thread onPlayerDowned(); + player thread onPlayerRevived(); + player thread spawnIfRoundOne(); //force spawns if round 1. no more spectating one player on round 1 + } +} + +onPlayerSpawned() +{ + level endon( "end_game" ); + self endon( "disconnect" ); + for(;;) + { + self waittill( "spawned_player" ); + } +} + +startCustomPerkMachines() +{ + if(level.disableAllCustomPerks == 0) + { + if(getDvar("mapname") == "zm_prison") //mob of the dead + { + if(level.enablePHDFlopper == 1) + level 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) ); + if(level.enableStaminUp == 1) + level 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) ); + } + else if(getDvar("mapname") == "zm_highrise") //die rise + { + if(level.enablePHDFlopper == 1) + level 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) ); + if(level.enableDeadshot == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_whoswho", "zombie_vending_revive", "Deadshot Daiquiri", 1500, (3690.54, 1932.36, 1420), "specialty_deadshot", (-15, 0, 0) ); + if(level.enableStaminUp == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_revive", "zombie_vending_doubletap2", "Stamin-Up", 2000, (1704, -35, 1120.13), "specialty_longersprint", (0, -30, 0) ); + } + else if(getDvar("mapname") == "zm_buried") //buried + { + if(level.enablePHDFlopper == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_marathon", "zombie_vending_jugg", "PHD Flopper", 3000, (2631.73, 304.165, 240.125), "PHD_FLOPPER", (5, 0, 0) ); + if(level.enableDeadshot == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_marathon", "zombie_vending_revive", "Deadshot Daiquiri", 1500, (1055.18, -1055.55, 201), "specialty_deadshot", (3, 270, 0) ); + } + else if(getDvar("mapname") == "zm_nuked") //nuketown + { + if(level.enablePHDFlopper == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_revive", "zombie_vending_jugg", "PHD Flopper", 3000, (683, 727, -56), "PHD_FLOPPER", (5, 250, 0) ); + if(level.enableDeadshot == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_jugg", "zombie_vending_revive", "Deadshot Daiquiri", 1500, (747, 356, 91), "specialty_deadshot", (0, 330, 0) ); + if(level.enableStaminUp == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_revive", "zombie_vending_doubletap2", "Stamin-Up", 2000, (-638, 268, -54), "specialty_longersprint", (0, 165, 0) ); + if(level.enableMuleKick == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_jugg", "zombie_vending_sleight", "Mule Kick", 3000, (-953, 715, 83), "specialty_additionalprimaryweapon", (0, 75, 0) ); + } + else if(getDvar("mapname") == "zm_transit") //transit + { + if(level.enablePHDFlopper == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_revive", "zombie_vending_jugg", "PHD Flopper", 3000, (-6304, 5430, -55), "PHD_FLOPPER", (0, 90, 0) ); + if(level.enableDeadshot == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_jugg", "zombie_vending_revive", "Deadshot Daiquiri", 1500, (-6088, -7419, 0), "specialty_deadshot", (0, 90, 0) ); + if(level.enableMuleKick == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_jugg", "zombie_vending_sleight", "Mule Kick", 3000, (1149, -215, -304), "specialty_additionalprimaryweapon", (0, 180, 0) ); + } + } +} + +onPlayerDowned() +{ + self endon("disconnect"); + level endon("end_game"); + + for(;;) + { + self waittill_any( "player_downed", "fake_death", "entering_last_stand"); + self unsetperk( "specialty_additionalprimaryweapon" ); //removes the mulekick perk functionality + self unsetperk( "specialty_longersprint" ); //removes the staminup perk functionality + self unsetperk( "specialty_deadshot" ); //removes the deadshot perk functionality + self.hasPHD = undefined; //resets the flopper variable + self.hasMuleKick = undefined; //resets the mule kick variable + self.hasStaminUp = undefined; //resets the staminup variable + self.hasDeadshot = undefined; //resets the deadshot variable + self.icon1 Destroy();self.icon1 = undefined; //deletes the perk icons and resets the variable + self.icon2 Destroy();self.icon2 = undefined; //deletes the perk icons and resets the variable + self.icon3 Destroy();self.icon3 = undefined; //deletes the perk icons and resets the variable + self.icon4 Destroy();self.icon4 = undefined; //deletes the perk icons and resets the variable + } +} + +doPHDdive() //credit to extinct. just edited to add self.hasPHD variable +{ + self endon("disconnect"); + level endon("end_game"); + + for(;;) + { + if(isDefined(self.divetoprone) && self.divetoprone) + { + if(self isOnGround() && isDefined(self.hasPHD)) + { + if(level.script == "zm_tomb" || level.script == "zm_buried") + explosionfx = level._effect["divetonuke_groundhit"]; + else + explosionfx = loadfx("explosions/fx_default_explosion"); + self playSound("zmb_phdflop_explo"); + playfx(explosionfx, self.origin); + self damageZombiesInRange(310, self, "kill"); + wait .3; + } + } + wait .05; + } +} + +damageZombiesInRange(range, what, amount) //damage zombies for phd flopper +{ + enemy = getAiArray(level.zombie_team); + foreach(zombie in enemy) + { + if(distance(zombie.origin, what.origin) < range) + { + if(amount == "kill") + zombie doDamage(zombie.health * 2, zombie.origin, self); + else + zombie doDamage(amount, zombie.origin, self); + } + } +} + +phd_flopper_dmg_check( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) //phdflopdmgchecker lmao +{ + if ( smeansofdeath == "MOD_SUICIDE" || smeansofdeath == "MOD_FALLING" || smeansofdeath == "MOD_PROJECTILE" || smeansofdeath == "MOD_PROJECTILE_SPLASH" || smeansofdeath == "MOD_GRENADE" || smeansofdeath == "MOD_GRENADE_SPLASH" || smeansofdeath == "MOD_EXPLOSIVE" ) + { + if(isDefined(self.hasPHD)) //if player has phd flopper, dont damage the player + return; + } + [[ level.playerDamageStub ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ); +} + +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 +{ + level endon( "end_game" ); + if(!isDefined(level.customPerkNum)) + level.customPerkNum = 1; + else + level.customPerkNum += 1; + collision = spawn("script_model", origin); + collision setModel("collision_geo_cylinder_32x128_standard"); + collision rotateTo(angles, .1); + RPerks = spawn( "script_model", origin ); + RPerks setModel( model ); + RPerks rotateTo(angles, .1); + level thread LowerMessage( "Custom Perks", "Hold ^3F ^7for "+perkname+" [Cost: "+cost+"]" ); + trig = spawn("trigger_radius", origin, 1, 25, 25); + trig SetCursorHint( "HINT_NOICON" ); + trig setLowerMessage( trig, "Custom Perks" ); + for(;;) + { + trig waittill("trigger", player); + if(player useButtonPressed() && player.score >= cost) + { + wait .25; + if(player useButtonPressed()) + { + if(perk != "PHD_FLOPPER" && !player hasPerk(perk) || perk == "PHD_FLOPPER" && !isDefined(player.hasPHD)) + { + player playsound( "zmb_cha_ching" ); //money shot + player.score -= cost; //take points + level.trig hide(); + player thread GivePerk( bottle, perk, perkname ); //give perk + wait 2; + level.trig show(); + } + else + player iprintln("You Already Have "+perkname+"!"); + } + } + } +} + +GivePerk( model, perk, perkname ) +{ + self DisableOffhandWeapons(); + self DisableWeaponCycling(); + weaponA = self getCurrentWeapon(); + weaponB = model; + self GiveWeapon( weaponB ); + self SwitchToWeapon( weaponB ); + self waittill( "weapon_change_complete" ); + self EnableOffhandWeapons(); + self EnableWeaponCycling(); + self TakeWeapon( weaponB ); + self SwitchToWeapon( weaponA ); + self setperk( perk ); + self maps/mp/zombies/_zm_audio::playerexert( "burp" ); + self setblur( 4, 0.1 ); + wait 0.1; + self setblur( 0, 0.1 ); + if(perk == "PHD_FLOPPER") + { + self.hasPHD = true; + self thread drawCustomPerkHUD("specialty_doubletap_zombies", 0, (1, 0.25, 1)); + } + else if(perk == "specialty_additionalprimaryweapon") + { + self.hasMuleKick = true; + self thread drawCustomPerkHUD("specialty_fastreload_zombies", 0, (0, 0.7, 0)); + } + else if(perk == "specialty_longersprint") + { + self.hasStaminUp = true; + self thread drawCustomPerkHUD("specialty_juggernaut_zombies", 0, (1, 1, 0)); + } + else if(perk == "specialty_deadshot") + { + self.hasDeadshot = true; + self thread drawCustomPerkHUD("specialty_quickrevive_zombies", 0, (0.125, 0.125, 0.125)); + } +} + +LowerMessage( ref, text ) +{ + if( !IsDefined( level.zombie_hints ) ) + level.zombie_hints = []; + PrecacheString( text ); + level.zombie_hints[ref] = text; +} + +setLowerMessage( ent, default_ref ) +{ + if( IsDefined( ent.script_hint ) ) + self SetHintString( get_zombie_hint( ent.script_hint ) ); + else + self SetHintString( get_zombie_hint( default_ref ) ); +} + +drawshader( shader, x, y, width, height, color, alpha, sort ) +{ + hud = newclienthudelem( self ); + hud.elemtype = "icon"; + hud.color = color; + hud.alpha = alpha; + hud.sort = sort; + hud.children = []; + hud setparent( level.uiparent ); + hud setshader( shader, width, height ); + hud.x = x; + hud.y = y; + return hud; +} + +drawCustomPerkHUD(perk, x, color, perkname) //perk hud thinking or whatever. probably not the best method but whatever lol +{ + if(!isDefined(self.icon1)) + { + x = -408; + if(getDvar("mapname") == "zm_buried") + self.icon1 = self drawshader( perk, x, 293, 24, 25, color, 100, 0 ); + else + self.icon1 = self drawshader( perk, x, 320, 24, 25, color, 100, 0 ); + } + else if(!isDefined(self.icon2)) + { + x = -378; + if(getDvar("mapname") == "zm_buried") + self.icon2 = self drawshader( perk, x, 293, 24, 25, color, 100, 0 ); + else + self.icon2 = self drawshader( perk, x, 320, 24, 25, color, 100, 0 ); + } + else if(!isDefined(self.icon3)) + { + x = -348; + if(getDvar("mapname") == "zm_buried") + self.icon3 = self drawshader( perk, x, 293, 24, 25, color, 100, 0 ); + else + self.icon3 = self drawshader( perk, x, 320, 24, 25, color, 100, 0 ); + } + else if(!isDefined(self.icon4)) + { + x = -318; + if(getDvar("mapname") == "zm_buried") + self.icon4 = self drawshader( perk, x, 293, 24, 25, color, 100, 0 ); + else + self.icon4 = self drawshader( perk, x, 320, 24, 25, color, 100, 0 ); + } +} + +LowerMessage( ref, text ) +{ + if( !IsDefined( level.zombie_hints ) ) + level.zombie_hints = []; + PrecacheString( text ); + level.zombie_hints[ref] = text; +} + +setLowerMessage( ent, default_ref ) +{ + if( IsDefined( ent.script_hint ) ) + self SetHintString( get_zombie_hint( ent.script_hint ) ); + else + self SetHintString( get_zombie_hint( default_ref ) ); +} + +startInit() +{ + PrecacheModel("collision_geo_cylinder_32x128_standard"); + PrecacheModel("zombie_vending_jugg"); + PrecacheModel("zombie_perk_bottle_marathon"); + PrecacheModel("zombie_perk_bottle_whoswho"); + PrecacheModel("zombie_vending_nuke_on_lo"); + PrecacheModel("p6_zm_al_vending_pap_on"); + PrecacheModel("p6_anim_zm_buildable_pap"); + PrecacheModel("p6_zm_al_vending_pap_on"); + PrecacheModel("p6_zm_al_vending_jugg_on"); + PrecacheModel("p6_zm_al_vending_sleight_on"); + PrecacheModel("p6_zm_al_vending_doubletap2_on"); + PrecacheModel("p6_zm_al_vending_ads_on"); + PrecacheModel("p6_zm_al_vending_nuke_on"); + PrecacheModel("p6_zm_al_vending_three_gun_on"); + PrecacheModel("zombie_vending_revive"); + PrecacheModel("zombie_vending_doubletap2"); + PrecacheModel("zombie_x2_icon"); + PrecacheModel("zombie_bomb"); + PrecacheModel("zombie_ammocan"); + PrecacheModel("zombie_x2_icon"); + PrecacheModel("zombie_skull"); + PrecacheShader("specialty_deadshot_zombies"); + if(isDefined(level.player_out_of_playable_area_monitor)) + level.player_out_of_playable_area_monitor = false; + level.pers_sniper_misses = 9999; //sniper perma perk! never lose it hahahahahahahahaha + thread gscRestart(); //JezuzLizard fix sound stuff + thread setPlayersToSpectator(); //JezuzLizard fix sound stuff +} + +initServerDvars() //credits to JezuzLizard!!! This is a huge help in making this happen +{ + level.player_starting_points = getDvarIntDefault( "playerStartingPoints", 500 ); + //sets the perk limit for all players + level.perk_purchase_limit = getDvarIntDefault( "perkLimit", 4 ); + //sets the maximum number of zombies that can be on the map at once 32 max + level.zombie_ai_limit = getDvarIntDefault( "zombieAiLimit", 24 ); + //sets the number of zombie bodies that can be on the map at once + level.zombie_actor_limit = getDvarIntDefault( "zombieActorLimit", 32 ); + //enables midround hellhounds WARNING: causes permanent round pauses on maps that aren't bus depot, town or farm + level.mixed_rounds_enabled = getDvarIntDefault( "midroundDogs", 0 ); + //disables the end game check WARNING: make sure to include a spectator respawner and auto revive function + level.no_end_game_check = getDvarIntDefault( "noEndGameCheck", 0 ); + //sets the solo laststand pistol + level.default_solo_laststandpistol = getDvar( "soloLaststandWeapon" ); + //the default laststand pistol + level.default_laststandpistol = getDvar( "coopLaststandWeapon" ); + //set the starting weapon + level.start_weapon = getDvar( "startWeaponZm" ); + //sets all zombies to this speed lower values result in walkers higher values sprinters + level.zombie_move_speed = getDvarIntDefault( "zombieMoveSpeed", 1 ); + //locks the zombie movespeed to the above value + level.zombieMoveSpeedLocked = getDvarIntDefault( "zombieMoveSpeedLocked", 0 ); + //sets whether there is a cap to the zombie movespeed active + level.zombieMoveSpeedCap = getDvarIntDefault( "zombieMoveSpeedCap", 0 ); + //sets the value to the zombie movespeed cap + level.zombieMoveSpeedCapValue = getDvarIntDefault( "zombieMoveSpeedCapValue", 1 ); + //sets the round number any value between 1-255 + level.round_number = getDvarIntDefault( "roundNumber", 1 ); + //enables the override for zombies per round + level.overrideZombieTotalPermanently = getDvarIntDefault( "overrideZombieTotalPermanently", 0 ); + //sets the number of zombies per round to the value indicated + level.overrideZombieTotalPermanentlyValue = getDvarIntDefault( "overrideZombieTotalPermanentlyValue", 6 ); + //enables the override for zombie health + level.overrideZombieHealthPermanently = getDvarIntDefault( "overrideZombieHealthPermanently", 0 ); + //sets the health of zombies every round to the value indicated + level.overrideZombieHealthPermanentlyValue = getDvarIntDefault( "overrideZombieHealthPermanentlyValue", 150 ); + //enables the health cap override so zombies health won't grow beyond the value indicated + level.overrideZombieMaxHealth = getDvarIntDefault( "overrideZombieMaxHealth", 0 ); + //sets the maximum health zombie health will increase to + level.overrideZombieMaxHealthValue = getDvarIntDefault( "overrideZombieMaxHealthValue" , 150 ); + + //disables walkers + level.disableWalkers = getDvarIntDefault( "disableWalkers", 0 ); + if ( level.disableWalkers ) + { + level.speed_change_round = undefined; + } + //set afterlives on mob to 1 like a normal coop match and sets the prices of doors on origins to be higher + level.disableSoloMode = getDvarIntDefault( "disableSoloMode", 0 ); + if ( level.disableSoloMode ) + { + level.is_forever_solo_game = undefined; + } + //disables all drops + level.zmPowerupsNoPowerupDrops = getDvarIntDefault( "zmPowerupsNoPowerupDrops", 0 ); + + //Zombie_Vars: + //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 + //sets the maximum number of drops per round + level.maxPowerupsPerRound = getDvarIntDefault( "maxPowerupsPerRound", 4 ); + level.zombie_vars["zombie_powerup_drop_max_per_round"] = level.maxPowerupsPerRound; + //sets the powerup drop rate lower is better + level.powerupDropRate = getDvarIntDefault( "powerupDropRate", 2000 ); + level.zombie_vars["zombie_powerup_drop_increment"] = level.powerupDropRate; + //makes every zombie drop a powerup + level.zombiesAlwaysDropPowerups = getDvarIntDefault( "zombiesAlwaysDropPowerups", 0 ); + level.zombie_vars[ "zombie_drop_item" ] = level.zombiesAlwaysDropPowerups; + //increase these below vars to increase drop rate + //points to the powerup increment to a powerup drop related to level.zombie_vars["zombie_powerup_drop_increment"] + level.fourPlayerPowerupScore = getDvarIntDefault( "fourPlayerPowerupScore", 50 ); + level.zombie_vars[ "zombie_score_kill_4p_team" ] = level.fourPlayerPowerupScore; + //points to the powerup increment to a powerup drop related to level.zombie_vars["zombie_powerup_drop_increment"] + level.threePlayerPowerupScore = getDvarIntDefault( "threePlayerPowerupScore", 50 ); + level.zombie_vars[ "zombie_score_kill_3p_team" ] = level.threePlayerPowerupScore; + //points to the powerup increment to a powerup drop related to level.zombie_vars["zombie_powerup_drop_increment"] + level.twoPlayerPowerupScore = getDvarIntDefault( "twoPlayerPowerupScore", 50 ); + level.zombie_vars[ "zombie_score_kill_2p_team" ] = level.twoPlayerPowerupScore; + //points to the powerup increment to a powerup drop related to level.zombie_vars["zombie_powerup_drop_increment"] + level.onePlayerPowerupScore = getDvarIntDefault( "onePlayerPowerupScore", 50 ); + level.zombie_vars[ "zombie_score_kill_1p_team" ] = level.onePlayerPowerupScore; + //points for melee kills to the powerup increment to a powerup drop + level.powerupScoreMeleeKill = getDvarIntDefault( "powerupScoreMeleeKill", 80 ); + level.zombie_vars[ "zombie_score_bonus_melee" ] = level.powerupScoreMeleeKill; + //points for headshot kills to the powerup increment to a powerup drop + level.powerupScoreHeadshotKill = getDvarIntDefault( "powerupScoreHeadshotKill", 50 ); + level.zombie_vars[ "zombie_score_bonus_head" ] = level.powerupScoreHeadshotKill; + //points for neck kills to the powerup increment to a powerup drop + level.powerupScoreNeckKill = getDvarIntDefault( "powerupScoreNeckKill", 20 ); + level.zombie_vars[ "zombie_score_bonus_neck" ] = level.powerupScoreNeckKill; + //points for torso kills to the powerup increment to a powerup drop + level.powerupScoreTorsoKill = getDvarIntDefault( "powerupScoreTorsoKill", 10 ); + level.zombie_vars[ "zombie_score_bonus_torso" ] = level.powerupScoreTorsoKill; + //sets the zombie spawnrate; max is 0.08 + level.zombieSpawnRate = getDvarFloatDefault( "zombieSpawnRate", 2 ); + level.zombie_vars[ "zombie_spawn_delay" ] = level.zombieSpawnRate; + //sets the zombie spawnrate multiplier increase + level.zombieSpawnRateMultiplier = getDvarFloatDefault( "zombieSpawnRateMultiplier", 0.95 ); + //locks the spawnrate so it does not change throughout gameplay + level.zombieSpawnRateLocked = getDvarIntDefault( "zombieSpawnRateLocked", 0 ); + //alters the number of zombies per round formula amount of zombies per round is roughly correlated to this value + //ie half as many zombies per player is half as many zombies per round + level.zombiesPerPlayer = getDvarIntDefault( "zombiesPerPlayer", 6 ); + level.zombie_vars["zombie_ai_per_player"] = level.zombiesPerPlayer; + //sets the flat amount of hp the zombies gain per round not used after round 10 + level.zombieHealthIncreaseFlat = getDvarIntDefault( "zombieHealthIncreaseFlat", 100 ); + level.zombie_vars[ "zombie_health_increase" ] = level.zombieHealthIncreaseFlat; + //multiplies zombie health by this value every round after round 10 + level.zombieHealthIncreaseMultiplier = getDvarFloatDefault( "zombieHealthIncreaseMultiplier", 0.1 ); + level.zombie_vars[ "zombie_health_increase_multiplier" ] = level.zombieHealthIncreaseMultiplier; + //base zombie health before any multipliers or additions + level.zombieHealthStart = getDvarIntDefault( "zombieHealthStart", 150 ); + level.zombie_vars[ "zombie_health_start" ] = level.zombieHealthStart; + //time before new runners spawn on early rounds + level.zombieNewRunnerInterval = getDvarIntDefault( "zombieNewRunnerInterval", 10 ); + level.zombie_vars[ "zombie_new_runner_interval" ] = level.zombieNewRunnerInterval; + //determines level.zombie_move_speed on original + level.zombieMoveSpeedMultiplier = getDvarIntDefault( "zombieMoveSpeedMultiplier", 10 ); + level.zombie_vars[ "zombie_move_speed_multiplier" ] = level.zombieMoveSpeedMultiplier; + //determines level.zombie_move_speed on easy + level.zombieMoveSpeedMultiplierEasy = getDvarIntDefault( "zombieMoveSpeedMultiplierEasy", 8 ); + level.zombie_vars[ "zombie_move_speed_multiplier_easy"] = level.zombieMoveSpeedMultiplierEasy; + //affects the number of zombies per round formula + level.zombieMaxAi = getDvarIntDefault( "zombieMaxAi", 24 ); + level.zombie_vars[ "zombie_max_ai" ] = level.zombieMaxAi; + //affects the check for zombies that have fallen thru the map + level.belowWorldCheck = getDvarIntDefault( "belowWorldCheck", -1000 ); + level.zombie_vars[ "below_world_check" ] = level.belowWorldCheck; + //sets whether spectators respawn at the end of the round + level.customSpectatorsRespawn = getDvarIntDefault( "customSpectatorsRespawn", 1 ); + level.zombie_vars[ "spectators_respawn" ] = level.customSpectatorsRespawn; + //sets the time that the game takes during the end game intermission + level.zombieIntermissionTime = getDvarIntDefault( "zombieIntermissionTime", 20 ); + level.zombie_vars["zombie_intermission_time"] = level.zombieIntermissionTime; + //the time between rounds + level.zombieBetweenRoundTime = getDvarIntDefault( "zombieBetweenRoundTime", 15 ); + level.zombie_vars["zombie_between_round_time"] = level.zombieBetweenRoundTime; + //time before the game starts + level.roundStartDelay = getDvarIntDefault( "roundStartDelay", 0 ); + level.zombie_vars[ "game_start_delay" ] = level.roundStartDelay; + //points all players lose when a player bleeds out %10 default + level.bleedoutPointsLostAllPlayers = getDvarFloatDefault( "bleedoutPointsLostAllPlayers", 0.1 ); + level.zombie_vars[ "penalty_no_revive" ] = level.bleedoutPointsLostAllPlayers; + //penalty to the player who died 10% of points by default + level.bleedoutPointsLostSelf = getDvarFloatDefault( "bleedoutPointsLostSelf", 0.1 ); + level.zombie_vars[ "penalty_died" ] = level.bleedoutPointsLostSelf; + //points players lose on down %5 by default + level.downedPointsLostSelf = getDvarFloatDefault( "downedPointsLostSelf", 0.05 ); + level.zombie_vars[ "penalty_downed" ] = level.downedPointsLostSelf; + //unknown + level.playerStartingLives = getDvarIntDefault( "playerStartingLives", 1 ); + level.zombie_vars[ "starting_lives" ] = level.playerStartingLives; + //points earned per zombie kill in a 4 player game + level.fourPlayerScorePerZombieKill = getDvarIntDefault( "fourPlayerScorePerZombieKill", 50 ); + level.zombie_vars[ "zombie_score_kill_4player" ] = level.fourPlayerScorePerZombieKill; + //points earned per zombie kill in a 3 player game + level.threePlayerScorePerZombieKill = getDvarIntDefault( "threePlayerScorePerZombieKill", 50 ); + level.zombie_vars[ "zombie_score_kill_3player" ] = level.threePlayerScorePerZombieKill; + //points earned per zombie kill in a 2 player game + level.twoPlayerScorePerZombieKill = getDvarIntDefault( "twoPlayerScorePerZombieKill", 50 ); + level.zombie_vars[ "zombie_score_kill_2player" ] = level.twoPlayerScorePerZombieKill; + //points earned per zombie kill in a 1 player game + level.onePlayerScorePerZombieKill = getDvarIntDefault( "onePlayerScorePerZombieKill", 50 ); + level.zombie_vars[ "zombie_score_kill_1player" ] = level.onePlayerScorePerZombieKill; + //points given for a normal attack + level.pointsPerNormalAttack = getDvarIntDefault( "pointsPerNormalAttack", 10 ); + level.zombie_vars[ "zombie_score_damage_normal" ] = level.pointsPerNormalAttack; + //points given for a light attack + level.pointsPerLightAttack = getDvarIntDefault( "pointsPerLightAttack", 10 ); + level.zombie_vars[ "zombie_score_damage_light" ] = level.pointsPerLightAttack; + //players turn into a zombie on death WARNING: buggy as can be and is missing assets + level.shouldZombifyPlayer = getDvarIntDefault( "shouldZombifyPlayer", 0 ); + level.zombie_vars[ "zombify_player" ] = level.shouldZombifyPlayer; + //points scalar for allies team + level.alliesPointsMultiplier = getDvarIntDefault( "alliesPointsMultiplier", 1 ); + level.zombie_vars[ "allies" ][ "zombie_point_scalar" ] = level.alliesPointsMultiplier; + //points scalar for axis team + level.axisPointsMultiplier = getDvarIntDefault( "axisPointsMultiplier", 1 ); + level.zombie_vars[ "axis" ][ "zombie_point_scalar" ] = level.axisPointsMultiplier; + //sets the radius of emps explosion lower this to 1 to render emps useless + level.empPerkExplosionRadius = getDvarIntDefault( "empPerkExplosionRadius", 420 ); + level.zombie_vars[ "emp_perk_off_range" ] = level.empPerkExplosionRadius; + //sets the duration of emps on perks set to 0 for infiinite emps + level.empPerkOffDuration = getDvarIntDefault( "empPerkOffDuration", 90 ); + level.zombie_vars[ "emp_perk_off_time" ] = level.empPerkOffDuration; + //riotshield health + level.riotshieldHitPoints = getDvarIntDefault( "riotshieldHitPoints", 2250 ); + level.zombie_vars[ "riotshield_hit_points" ] = level.riotshieldHitPoints; + //jugg health bonus + level.juggHealthBonus = getDvarIntDefault( "juggHealthBonus", 160 ); + level.zombie_vars[ "zombie_perk_juggernaut_health" ] = level.juggHealthBonus; + //perma jugg health bonus + level.permaJuggHealthBonus = getDvarIntDefault( "permaJuggHealthBonus", 190 ); + level.zombie_vars[ "zombie_perk_juggernaut_health_upgrade" ] = level.permaJuggHealthBonus; + //phd min explosion damage + level.minPhdExplosionDamage = getDvarIntDefault( "minPhdExplosionDamage", 1000 ); + level.zombie_vars[ "zombie_perk_divetonuke_min_damage" ] = level.minPhdExplosionDamage; + //phd max explosion damage + level.maxPhdExplosionDamage = getDvarIntDefault( "maxPhdExplosionDamage", 5000 ); + level.zombie_vars[ "zombie_perk_divetonuke_max_damage" ] = level.maxPhdExplosionDamage; + //phd explosion radius + level.phdDamageRadius = getDvarIntDefault( "phdDamageRadius", 300 ); + level.zombie_vars[ "zombie_perk_divetonuke_radius" ] = level.phdDamageRadius; + //zombie counter onscreen + level.enableZombieCounter = getDvarIntDefault( "enableZombieCounter", 1 ); + level.zombie_vars[ "enableZombieCounter" ] = level.enableZombieCounter; + //change mystery box price + level.customMysteryBoxPriceEnabled = getDvarIntDefault( "customMysteryBoxPriceEnabled", 0 ); + level.zombie_vars[ "customMysteryBoxPriceEnabled" ] = level.customMysteryBoxPriceEnabled; + //set mystery box price + level.customMysteryBoxPrice = getDvarIntDefault( "customMysteryBoxPrice", 500 ); + level.zombie_vars[ "customMysteryBoxPrice" ] = level.customMysteryBoxPrice; + //disable custom perks + level.disableAllCustomPerks = getDvarIntDefault( "disableAllCustomPerks", 0 ); + level.zombie_vars[ "disableAllCustomPerks" ] = level.disableAllCustomPerks; + //enable custom phdflopper + level.enablePHDFlopper = getDvarIntDefault( "enablePHDFlopper", 1 ); + level.zombie_vars[ "enablePHDFlopper" ] = level.enablePHDFlopper; + //enable custom staminup + level.enableStaminUp = getDvarIntDefault( "enableStaminUp", 1 ); + level.zombie_vars[ "enableStaminUp" ] = level.enableStaminUp; + //enable custom deadshot + level.enableDeadshot = getDvarIntDefault( "enableDeadshot", 1 ); + level.zombie_vars[ "enableDeadshot" ] = level.enableDeadshot; + //enable custom mule kick + level.enableMuleKick = getDvarIntDefault( "enableMuleKick", 1 ); + level.zombie_vars[ "enableMuleKick" ] = level.enableMuleKick; + disable_specific_powerups(); + checks(); + thread zombies_always_drop_powerups(); + thread zombies_per_round_override(); + thread zombie_health_override(); + thread zombie_health_cap_override(); + thread zombie_spawn_delay_fix(); + thread zombie_speed_fix(); +} + +trackPackAPunchDrops() +{ + level endon("end_game"); + level.rounds_since_last_pack_a_punch = 0; + for(;;) + { + level waittill("start_of_round"); + level.rounds_since_last_pack_a_punch_drop += 1; + wait 0.5; + } +} + +gscRestart() +{ + level waittill( "end_game" ); + wait 15; + map_restart( false ); +} + +setPlayersToSpectator() +{ + level.no_end_game_check = 1; + wait 3; + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( i == 0 ) + { + i++; + } + players[ i ] setToSpectator(); + i++; + } + wait 5; + spawnAllPlayers(); +} + +setToSpectator() +{ + self.sessionstate = "spectator"; + if (isDefined(self.is_playing)) + { + self.is_playing = false; + } +} + +spawnAllPlayers() +{ + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ].sessionstate == "spectator" && isDefined( players[ i ].spectator_respawn ) ) + { + players[ i ] [[ level.spawnplayer ]](); + if ( level.script != "zm_tomb" || level.script != "zm_prison" || !is_classic() ) + { + thread maps\mp\zombies\_zm::refresh_player_navcard_hud(); + } + } + i++; + } + level.no_end_game_check = 0; +} + +disable_all_powerups() +{ + if ( level.zmPowerupsNoPowerupDrops ) + { + flag_clear( "zombie_drop_powerups" ); + } +} + +zombies_always_drop_powerups() +{ + if ( !level.zombiesAlwaysDropPowerups ) + { + return; + } + while ( 1 ) + { + level.zombie_vars[ "zombie_drop_item" ] = level.zombiesAlwaysDropPowerups; + wait 0.05; + } +} + +zombies_per_round_override() +{ + if ( !level.overrideZombieTotalPermanently ) + { + return; + } + while ( 1 ) + { + level waittill( "start_of_round" ); + level.zombie_total = getDvarIntDefault( "overrideZombieTotalPermanentlyValue", 6 ); + } +} + +zombie_health_override() +{ + if ( !level.overrideZombieHealthPermanently ) + { + return; + } + while ( 1 ) + { + level waittill( "start_of_round" ); + level.zombie_health = getDvarIntDefault( "overrideZombieHealthPermanentlyValue", 150 ); + } +} + +zombie_health_cap_override() +{ + if ( !level.overrideZombieMaxHealth ) + { + return; + } + while ( 1 ) + { + level waittill( "start_of_round" ); + if ( level.zombie_health > level.overrideZombieMaxHealthValue ) + { + level.zombie_health = getDvarIntDefault( "overrideZombieHealthMaxHealthValue", 150 ); + } + } +} + +zombie_spawn_delay_fix() +{ + if ( level.zombieSpawnRateLocked ) + { + return; + } + i = 1; + while ( i <= level.round_number ) + { + timer = level.zombieSpawnRate; + if ( timer > 0.08 ) + { + level.zombieSpawnRate = timer * level.zombieSpawnRateMultiplier; + i++; + continue; + } + else if ( timer < 0.08 ) + { + level.zombieSpawnRate = 0.08; + break; + } + i++; + } + while ( 1 ) + { + level waittill( "start_of_round" ); + if ( level.zombieSpawnRate > 0.08 ) + { + level.zombieSpawnRate = level.zombieSpawnRate * level.zombieSpawnRateMultiplier; + } + level.zombie_vars[ "zombie_spawn_delay" ] = level.zombieSpawnRate; + } +} + +zombie_speed_fix() +{ + if ( level.zombieMoveSpeedLocked ) + { + return; + } + if ( level.gamedifficulty == 0 ) + { + level.zombie_move_speed = level.round_number * level.zombie_vars[ "zombie_move_speed_multiplier_easy" ]; + } + else + { + level.zombie_move_speed = level.round_number * level.zombie_vars[ "zombie_move_speed_multiplier" ]; + } +} + +zombie_speed_override() +{ + if ( !level.zombieMoveSpeedLocked ) + { + return; + } + while ( 1 ) + { + level waittill( "start_of_round" ); + level.zombie_move_speed = getDvarIntDefault( "zombieMoveSpeed", 1 ); + } +} + +zombie_speed_cap_override() +{ + if ( !level.zombieMoveSpeedCap ) + { + return; + } + while ( 1 ) + { + level waittill( "start_of_round" ); + if ( level.zombie_move_speed > level.zombieMoveSpeedCapValue ) + { + level.zombie_move_speed = level.zombieMoveSpeedCapValue; + } + } +} + +checks() +{ + if( level.customMysteryBoxPriceEnabled == 1) //custom mystery box price + { + level thread setMysteryBoxPrice(); + } + if( level.enableZombieCounter == 1 ) //draw zombie counter + { + level thread drawZombiesCounter(); //credit carbonmodding + } + if ( level.mixed_rounds_enabled ) + { + if ( level.script != "zm_transit" || is_classic() || level.scr_zm_ui_gametype == "zgrief" ) + { + level.mixed_rounds_enabled = 0; + } + } + + if ( level.start_weapon == "" || level.start_weapon== "m1911_zm" ) + { + level.start_weapon = "m1911_zm"; + if ( level.script == "zm_tomb" ) + { + level.start_weapon = "c96_zm"; + } + } + if ( level.default_laststandpistol == "" || level.default_laststandpistol == "m1911_zm" ) + { + level.default_laststandpistol = "m1911_zm"; + if ( level.script == "zm_tomb" ) + { + level.default_laststandpistol = "c96_zm"; + } + } + if ( level.default_solo_laststandpistol == "" || level.default_solo_laststandpistol == "m1911_upgraded_zm" ) + { + level.default_solo_laststandpistol = "m1911_upgraded_zm"; + if ( level.script == "zm_tomb" ) + { + level.default_solo_laststandpistol = "c96_upgraded_zm"; + } + } + +} + +disable_specific_powerups() +{ + level.powerupNames = array( "fast_feet", "unlimited_ammo", "pack_a_punch", "money_drop", "nuke", "insta_kill", "full_ammo", "double_points", "fire_sale", "free_perk", "carpenter" ); + array = level.powerupNames; + //custom powerups and regular powerups + level.zmPowerupsEnabled = []; + //fast feet custom drop + level.zmPowerupsEnabled[ "fast_feet" ] = spawnstruct(); + level.zmPowerupsEnabled[ "fast_feet" ].name = "fast_feet"; + level.zmPowerupsEnabled[ "fast_feet" ].active = getDvarIntDefault( "zmPowerupsFastFeetEnabled", 1 ); + //custom unlimited ammo drop + level.zmPowerupsEnabled[ "unlimited_ammo" ] = spawnstruct(); + level.zmPowerupsEnabled[ "unlimited_ammo" ].name = "unlimited_ammo"; + level.zmPowerupsEnabled[ "unlimited_ammo" ].active = getDvarIntDefault( "zmPowerupsUnlimitedAmmoEnabled", 1 ); + //custom pack a punch drop + level.zmPowerupsEnabled[ "pack_a_punch" ] = spawnstruct(); + level.zmPowerupsEnabled[ "pack_a_punch" ].name = "pack_a_punch"; + level.zmPowerupsEnabled[ "pack_a_punch" ].active = getDvarIntDefault( "zmPowerupsPackAPunchEnabled", 1 ); + //custom money drop + level.zmPowerupsEnabled[ "money_drop" ] = spawnstruct(); + level.zmPowerupsEnabled[ "money_drop" ].name = "money_drop"; + level.zmPowerupsEnabled[ "money_drop" ].active = getDvarIntDefault( "zmPowerupsMoneyDropEnabled", 1 ); + //nuke + level.zmPowerupsEnabled[ "nuke" ] = spawnstruct(); + level.zmPowerupsEnabled[ "nuke" ].name = "nuke"; + level.zmPowerupsEnabled[ "nuke" ].active = getDvarIntDefault( "zmPowerupsNukeEnabled", 1 ); + //remove insta kills from the drop cycle and special drops + level.zmPowerupsEnabled[ "insta_kill" ] = spawnstruct(); + level.zmPowerupsEnabled[ "insta_kill" ].name = "insta_kill"; + level.zmPowerupsEnabled[ "insta_kill" ].active = getDvarIntDefault( "zmPowerupsInstaKillEnabled", 1 ); + //remove max ammos from the drop cycle and special drops + level.zmPowerupsEnabled[ "full_ammo" ] = spawnstruct(); + level.zmPowerupsEnabled[ "full_ammo" ].name = "full_ammo"; + level.zmPowerupsEnabled[ "full_ammo" ].active = getDvarIntDefault( "zmPowerupsMaxAmmoEnabled", 1 ); + //remove carpenter from the drop cycle and special drops + level.zmPowerupsEnabled[ "double_points" ] = spawnstruct(); + level.zmPowerupsEnabled[ "double_points" ].name = "double_points"; + level.zmPowerupsEnabled[ "double_points" ].active = getDvarIntDefault( "zmPowerupsDoublePointsEnabled", 1 ); + //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 + level.zmPowerupsEnabled[ "fire_sale" ] = spawnstruct(); + level.zmPowerupsEnabled[ "fire_sale" ].name = "fire_sale"; + level.zmPowerupsEnabled[ "fire_sale" ].active = getDvarIntDefault( "zmPowerupsFireSaleEnabled", 1 ); + //remove the perk bottle from the drop cycle and special drops + level.zmPowerupsEnabled[ "free_perk" ] = spawnstruct(); + level.zmPowerupsEnabled[ "free_perk" ].name = "free_perk"; + level.zmPowerupsEnabled[ "free_perk" ].active = getDvarIntDefault( "zmPowerupsPerkBottleEnabled", 1 ); + //removes carpenter from the drop cycle and special drops + level.zmPowerupsEnabled[ "carpenter" ] = spawnstruct(); + level.zmPowerupsEnabled[ "carpenter" ].name = "carpenter"; + level.zmPowerupsEnabled[ "carpenter" ].active = getDvarIntDefault( "zmPowerupsCarpenterEnabled", 1 ); + //removes zombie blood from the drop cycle and special drops + level.zmPowerupsEnabled[ "zombie_blood" ] = spawnstruct(); + level.zmPowerupsEnabled[ "zombie_blood" ].name = "zombie_blood"; + level.zmPowerupsEnabled[ "zombie_blood" ].active = getDvarIntDefault( "zmPowerupsZombieBloodEnabled", 1 ); + + //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 + + for ( i = 0; i < array.size; i++ ) + { + if ( !level.zmPowerupsEnabled[ array[ i ] ].active ) + { + name = level.zmPowerupsEnabled[ array[ i ] ].name; + if ( isInArray( level.zombie_include_powerups, name ) ) + { + arrayremovevalue( level.zombie_include_powerups, name ); + } + if ( isInArray( level.zombie_powerups, name ) ) + { + arrayremovevalue( level.zombie_powerups, name ); + } + if ( isInArray( level.zombie_powerup_array, name ) ) + { + arrayremovevalue( level.zombie_powerup_array, name ); + } + } + } +} + +drawZombiesCounter() +{ + level.zombiesCounter = createServerFontString("hudsmall" , 1.9); + level.zombiesCounter setPoint("CENTER", "CENTER", "CENTER", 190); + while(true) + { + enemies = get_round_enemy_array().size + level.zombie_total; + if( enemies != 0 ) + level.zombiesCounter.label = &"Zombies: ^1"; + else + level.zombiesCounter.label = &"Zombies: ^6"; + level.zombiesCounter setValue( enemies ); + wait 0.05; + } +} + +setMysteryBoxPrice() //mystery box price +{ + i = 0; + while (i < level.chests.size) + { + level.chests[ i ].zombie_cost = level.customMysteryBoxPrice; + level.chests[ i ].old_cost = level.customMysteryBoxPrice; + i++; + } +} + +spawnIfRoundOne() //spawn player +{ + wait 3; + if ( self.sessionstate == "spectator" && level.round_number == 1 ) + self iprintln("Get ready to be spawned!"); + wait 5; + if ( self.sessionstate == "spectator" && level.round_number == 1 ) + { + self [[ level.spawnplayer ]](); + if ( level.script != "zm_tomb" || level.script != "zm_prison" || !is_classic() ) + thread maps\mp\zombies\_zm::refresh_player_navcard_hud(); + } +} + +solo_tombstone_removal() +{ + notify( "tombstone_on" ); +} + +turn_tombstone_on() +{ + while ( 1 ) + { + machine = getentarray( "vending_tombstone", "targetname" ); + machine_triggers = getentarray( "vending_tombstone", "target" ); + i = 0; + while ( i < machine.size ) + { + machine[ i ] setmodel( level.machine_assets[ "tombstone" ].off_model ); + i++; + } + level thread do_initial_power_off_callback( machine, "tombstone" ); + array_thread( machine_triggers, ::set_power_on, 0 ); + level waittill( "tombstone_on" ); + i = 0; + while ( i < machine.size ) + { + machine[ i ] setmodel( level.machine_assets[ "tombstone" ].on_model ); + machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0,3, 0,4, 3 ); + machine[ i ] playsound( "zmb_perks_power_on" ); + machine[ i ] thread perk_fx( "tombstone_light" ); + machine[ i ] thread play_loop_on_machine(); + i++; + } + level notify( "specialty_scavenger_power_on" ); + array_thread( machine_triggers, ::set_power_on, 1 ); + if ( isDefined( level.machine_assets[ "tombstone" ].power_on_callback ) ) + { + array_thread( machine, level.machine_assets[ "tombstone" ].power_on_callback ); + } + level waittill( "tombstone_off" ); + if ( isDefined( level.machine_assets[ "tombstone" ].power_off_callback ) ) + { + array_thread( machine, level.machine_assets[ "tombstone" ].power_off_callback ); + } + array_thread( machine, ::turn_perk_off ); + players = get_players(); + _a1718 = players; + _k1718 = getFirstArrayKey( _a1718 ); + while ( isDefined( _k1718 ) ) + { + player = _a1718[ _k1718 ]; + player.hasperkspecialtytombstone = undefined; + _k1718 = getNextArrayKey( _a1718, _k1718 ); + } + } +} + +perk_machine_spawn_init() +{ + match_string = ""; + location = level.scr_zm_map_start_location; + if ( location != "default" && location == "" && isDefined( level.default_start_location ) ) + { + location = level.default_start_location; + } + match_string = ( level.scr_zm_ui_gametype + "_perks_" ) + location; + pos = []; + if ( isDefined( level.override_perk_targetname ) ) + { + structs = getstructarray( level.override_perk_targetname, "targetname" ); + } + else + { + structs = getstructarray( "zm_perk_machine", "targetname" ); + } + _a3578 = structs; + _k3578 = getFirstArrayKey( _a3578 ); + while ( isDefined( _k3578 ) ) + { + struct = _a3578[ _k3578 ]; + if ( isDefined( struct.script_string ) ) + { + tokens = strtok( struct.script_string, " " ); + _a3583 = tokens; + _k3583 = getFirstArrayKey( _a3583 ); + while ( isDefined( _k3583 ) ) + { + token = _a3583[ _k3583 ]; + if ( token == match_string ) + { + pos[ pos.size ] = struct; + } + _k3583 = getNextArrayKey( _a3583, _k3583 ); + } + } + else pos[ pos.size ] = struct; + _k3578 = getNextArrayKey( _a3578, _k3578 ); + } + if ( !isDefined( pos ) || pos.size == 0 ) + { + return; + } + precachemodel( "zm_collision_perks1" ); + i = 0; + while ( i < pos.size ) + { + perk = pos[ i ].script_noteworthy; + if ( isDefined( perk ) && isDefined( pos[ i ].model ) ) + { + use_trigger = spawn( "trigger_radius_use", pos[ i ].origin + vectorScale( ( 0, -1, 0 ), 30 ), 0, 40, 70 ); + use_trigger.targetname = "zombie_vending"; + use_trigger.script_noteworthy = perk; + use_trigger triggerignoreteam(); + perk_machine = spawn( "script_model", pos[ i ].origin ); + perk_machine.angles = pos[ i ].angles; + perk_machine setmodel( pos[ i ].model ); + if ( isDefined( level._no_vending_machine_bump_trigs ) && level._no_vending_machine_bump_trigs ) + { + bump_trigger = undefined; + } + else + { + bump_trigger = spawn( "trigger_radius", pos[ i ].origin, 0, 35, 64 ); + bump_trigger.script_activated = 1; + bump_trigger.script_sound = "zmb_perks_bump_bottle"; + bump_trigger.targetname = "audio_bump_trigger"; + if ( perk != "specialty_weapupgrade" ) + { + bump_trigger thread thread_bump_trigger(); + } + } + collision = spawn( "script_model", pos[ i ].origin, 1 ); + collision.angles = pos[ i ].angles; + collision setmodel( "zm_collision_perks1" ); + collision.script_noteworthy = "clip"; + collision disconnectpaths(); + use_trigger.clip = collision; + use_trigger.machine = perk_machine; + use_trigger.bump = bump_trigger; + if ( isDefined( pos[ i ].blocker_model ) ) + { + use_trigger.blocker_model = pos[ i ].blocker_model; + } + if ( isDefined( pos[ i ].script_int ) ) + { + perk_machine.script_int = pos[ i ].script_int; + } + if ( isDefined( pos[ i ].turn_on_notify ) ) + { + perk_machine.turn_on_notify = pos[ i ].turn_on_notify; + } + if ( perk == "specialty_scavenger" || perk == "specialty_scavenger_upgrade" ) + { + use_trigger.script_sound = "mus_perks_tombstone_jingle"; + use_trigger.script_string = "tombstone_perk"; + use_trigger.script_label = "mus_perks_tombstone_sting"; + use_trigger.target = "vending_tombstone"; + perk_machine.script_string = "tombstone_perk"; + perk_machine.targetname = "vending_tombstone"; + if ( isDefined( bump_trigger ) ) + { + bump_trigger.script_string = "tombstone_perk"; + } + } + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].perk_machine_set_kvps ) ) + { + [[ level._custom_perks[ perk ].perk_machine_set_kvps ]]( use_trigger, perk_machine, bump_trigger, collision ); + } + } + i++; + } +} + +isTown() +{ + if (isDefined(level.zombiemode_using_tombstone_perk) && level.zombiemode_using_tombstone_perk) + { + level thread perk_machine_spawn_init(); + thread solo_tombstone_removal(); + thread turn_tombstone_on(); + } +} +give_afterlife_loadout() +{ + + self takeallweapons(); + loadout = self.loadout; + primaries = self getweaponslistprimaries(); + if ( loadout.weapons.size > 1 || primaries.size > 1 ) + { + foreach ( weapon in primaries ) + { + self takeweapon( weapon ); + } + } + i = 0; + while ( i < loadout.weapons.size ) + { + + if ( !isDefined( loadout.weapons[ i ] ) ) + { + i++; + + continue; + } + if ( loadout.weapons[ i ][ "name" ] == "none" ) + { + i++; + + continue; + } + self maps/mp/zombies/_zm_weapons::weapondata_give( loadout.weapons[ i ] ); + i++; + } + self setspawnweapon( loadout.weapons[ loadout.current_weapon ] ); + self switchtoweaponimmediate( loadout.weapons[ loadout.current_weapon ] ); + if ( isDefined( self get_player_melee_weapon() ) ) + { + self giveweapon( self get_player_melee_weapon() ); + } + self maps/mp/zombies/_zm_equipment::equipment_give( self.loadout.equipment ); + if ( isDefined( loadout.hasclaymore ) && loadout.hasclaymore && !self hasweapon( "claymore_zm" ) ) + { + self giveweapon( "claymore_zm" ); + self set_player_placeable_mine( "claymore_zm" ); + self setactionslot( 4, "weapon", "claymore_zm" ); + self setweaponammoclip( "claymore_zm", loadout.claymoreclip ); + } + if ( isDefined( loadout.hasemp ) && loadout.hasemp ) + { + self giveweapon( "emp_grenade_zm" ); + self setweaponammoclip( "emp_grenade_zm", loadout.empclip ); + } + if ( isDefined( loadout.hastomahawk ) && loadout.hastomahawk ) + { + self giveweapon( self.current_tomahawk_weapon ); + self set_player_tactical_grenade( self.current_tomahawk_weapon ); + self setclientfieldtoplayer( "tomahawk_in_use", 1 ); + } + self.score = loadout.score; + perk_array = maps/mp/zombies/_zm_perks::get_perk_array( 1 ); + i = 0; + while ( i < perk_array.size ) + { + perk = perk_array[ i ]; + self unsetperk( perk ); + self set_perk_clientfield( perk, 0 ); + i++; + } + if (is_true(self.keep_perks)) + { + if(is_true(self.hadphd)) + { + self.hasphd = true; + self.hadphd = undefined; + self thread maps/mp/gametypes_zm/_clientids::drawCustomPerkHUD("specialty_doubletap_zombies", 0, (1, 0.25, 1)); + } + } + if ( isDefined( self.keep_perks ) && self.keep_perks && isDefined( loadout.perks ) && loadout.perks.size > 0 ) + { + i = 0; + while ( i < loadout.perks.size ) + { + if ( self hasperk( loadout.perks[ i ] ) ) + { + i++; + continue; + } + if ( loadout.perks[ i ] == "specialty_quickrevive" && flag( "solo_game" ) ) + { + level.solo_game_free_player_quickrevive = 1; + } + if ( loadout.perks[ i ] == "specialty_longersprint" ) + { + self setperk( "specialty_longersprint" ); //removes the staminup perk functionality + self.hasStaminUp = true; //resets the staminup variable + self thread maps/mp/gametypes_zm/_clientids::drawCustomPerkHUD("specialty_juggernaut_zombies", 0, (1, 1, 0)); + arrayremovevalue( loadout.perks, "specialty_longersprint" ); + + continue; + } + if ( loadout.perks[ i ] == "specialty_additionalprimaryweapon" ) + { + self setperk( "specialty_additionalprimaryweapon"); //removes the deadshot perk functionality + self.hasMuleKick = true; //resets the deadshot variable + self thread maps/mp/gametypes_zm/_clientids::drawCustomPerkHUD("specialty_fastreload_zombies", 0, (0, 0.7, 0)); + arrayremovevalue( loadout.perks, "specialty_additionalprimaryweapon" ); + continue; + } + if ( loadout.perks[ i ] == "specialty_finalstand" ) + { + i++; + continue; + } + maps/mp/zombies/_zm_perks::give_perk( loadout.perks[ i ] ); + i++; + wait 0.05; + } + } + self.keep_perks = undefined; + self set_player_lethal_grenade( self.loadout.lethal_grenade ); + if ( loadout.grenade > 0 ) + { + curgrenadecount = 0; + if ( self hasweapon( self get_player_lethal_grenade() ) ) + { + self getweaponammoclip( self get_player_lethal_grenade() ); + } + else + { + self giveweapon( self get_player_lethal_grenade() ); + } + self setweaponammoclip( self get_player_lethal_grenade(), loadout.grenade + curgrenadecount ); + } + +} +save_afterlife_loadout() //checked changed to match cerberus output +{ + primaries = self getweaponslistprimaries(); + currentweapon = self getcurrentweapon(); + self.loadout = spawnstruct(); + self.loadout.player = self; + self.loadout.weapons = []; + self.loadout.score = self.score; + self.loadout.current_weapon = -1; + index = 0; + foreach ( weapon in primaries ) + { + self.loadout.weapons[ index ] = maps/mp/zombies/_zm_weapons::get_player_weapondata( self, weapon ); + if ( weapon == currentweapon || self.loadout.weapons[ index ][ "alt_name" ] == currentweapon ) + { + self.loadout.current_weapon = index; + } + index++; + } + self.loadout.equipment = self get_player_equipment(); + if ( isDefined( self.loadout.equipment ) ) + { + self maps/mp/zombies/_zm_equipment::equipment_take( self.loadout.equipment ); + } + if ( self hasweapon( "claymore_zm" ) ) + { + self.loadout.hasclaymore = 1; + self.loadout.claymoreclip = self getweaponammoclip( "claymore_zm" ); + } + if ( self hasweapon( "emp_grenade_zm" ) ) + { + self.loadout.hasemp = 1; + self.loadout.empclip = self getweaponammoclip( "emp_grenade_zm" ); + } + if ( self hasweapon( "bouncing_tomahawk_zm" ) || self hasweapon( "upgraded_tomahawk_zm" ) ) + { + self.loadout.hastomahawk = 1; + self setclientfieldtoplayer( "tomahawk_in_use", 0 ); + } + self.loadout.perks = afterlife_save_perks( self ); + lethal_grenade = self get_player_lethal_grenade(); + if ( self hasweapon( lethal_grenade ) ) + { + self.loadout.grenade = self getweaponammoclip( lethal_grenade ); + } + else + { + self.loadout.grenade = 0; + } + self.loadout.lethal_grenade = lethal_grenade; + self set_player_lethal_grenade( undefined ); +} + +afterlife_save_perks( ent ) //checked changed to match cerberus output +{ + perk_array = ent get_perk_array( 1 ); + foreach ( perk in perk_array ) + { + ent unsetperk( perk ); + } + return perk_array; +} +onPlayerRevived() +{ + self endon("disconnect"); + level endon("end_game"); + + for(;;) + { + self waittill_any( "whos_who_self_revive","player_revived","fake_revive","do_revive_ended_normally", "al_t" ); + wait 1; + if(is_true(self.hadPHD)) + { + self setperk( "PHD_FLOPPER" ); //removes the staminup perk functionality + self.hasPHD = true; + self.hadPHD = undefined; + self thread drawCustomPerkHUD("specialty_doubletap_zombies", 0, (1, 0.25, 1)); + } + else + return; + } +} diff --git a/Zombies Mods/Zombies++/v1.2/Source Code/_zm_chugabud.gsc b/Zombies Mods/Zombies++/v1.2/Source Code/_zm_chugabud.gsc new file mode 100644 index 0000000..2046879 --- /dev/null +++ b/Zombies Mods/Zombies++/v1.2/Source Code/_zm_chugabud.gsc @@ -0,0 +1,830 @@ +#include maps/mp/_visionset_mgr; +#include maps/mp/zombies/_zm; +#include maps/mp/zombies/_zm_equipment; +#include maps/mp/zombies/_zm_weap_cymbal_monkey; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_clone; +#include maps/mp/zombies/_zm_chugabud; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_utility; +#include common_scripts/utility; +#include maps/mp/_utility; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/gametypes_zm/_clientids; + +init() //checked matches cerberus output +{ + level.chugabud_laststand_func = ::chugabud_laststand; + level thread chugabud_hostmigration(); + level._effect[ "chugabud_revive_fx" ] = loadfx( "weapon/quantum_bomb/fx_player_position_effect" ); + level._effect[ "chugabud_bleedout_fx" ] = loadfx( "weapon/quantum_bomb/fx_player_position_effect" ); + add_custom_limited_weapon_check( ::is_weapon_available_in_chugabud_corpse ); +} + +chugabug_precache() //checked matches cerberus output +{ +} + +chugabud_player_init() //checked matches cerberus output +{ +} + +chugabud_laststand() //checked changed to match cerberus output +{ + self endon( "player_suicide" ); + self endon( "disconnect" ); + self endon( "chugabud_bleedout" ); + if(isDefined(self.hasPHD)) + self.hadPHD = true; + else + self.hadPHD = undefined; + self maps/mp/zombies/_zm_laststand::increment_downed_stat(); + self.ignore_insta_kill = 1; + self.health = self.maxhealth; + self maps/mp/zombies/_zm_chugabud::chugabud_save_loadout(); + self maps/mp/zombies/_zm_chugabud::chugabud_fake_death(); + wait 3; + if ( isDefined( self.insta_killed ) && self.insta_killed || isDefined( self.disable_chugabud_corpse ) ) + { + create_corpse = 0; + } + else + { + create_corpse = 1; + } + if ( create_corpse == 1 ) + { + if ( isDefined( level._chugabug_reject_corpse_override_func ) ) + { + reject_corpse = self [[ level._chugabug_reject_corpse_override_func ]]( self.origin ); + if ( reject_corpse ) + { + create_corpse = 0; + } + } + } + logline1 = "INFO: _zm_chugabud.gsc chugabud_laststand() create_corpse: " + create_corpse + "\n"; + logprint( logline1 ); + if ( create_corpse == 1 ) + { + self thread activate_chugabud_effects_and_audio(); + corpse = self chugabud_spawn_corpse(); + corpse thread chugabud_corpse_revive_icon( self ); + self.e_chugabud_corpse = corpse; + corpse thread chugabud_corpse_cleanup_on_spectator( self ); + if ( isDefined( level.whos_who_client_setup ) ) + { + corpse setclientfield( "clientfield_whos_who_clone_glow_shader", 1 ); + } + } + self chugabud_fake_revive(); + wait 0.1; + self.ignore_insta_kill = undefined; + self.disable_chugabud_corpse = undefined; + if ( create_corpse == 0 ) + { + self notify( "chugabud_effects_cleanup" ); + return; + } + bleedout_time = getDvarFloat( "player_lastStandBleedoutTime" ); + self thread chugabud_bleed_timeout( bleedout_time, corpse ); + self thread chugabud_handle_multiple_instances( corpse ); + corpse waittill( "player_revived", e_reviver ); + if ( isDefined( e_reviver ) && e_reviver == self ) + { + self notify( "whos_who_self_revive" ); + } + self perk_abort_drinking( 0.1 ); + self maps/mp/zombies/_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 ); + self setorigin( corpse.origin ); + self setplayerangles( corpse.angles ); + if ( self player_is_in_laststand() ) + { + self thread chugabud_laststand_cleanup( corpse, "player_revived" ); + self enableweaponcycling(); + self enableoffhandweapons(); + self auto_revive( self, 1 ); + return; + } + self chugabud_laststand_cleanup( corpse, undefined ); +} + +chugabud_laststand_cleanup( corpse, str_notify ) //checked matches cerberus output +{ + if ( isDefined( str_notify ) ) + { + self waittill( str_notify ); + } + self chugabud_give_loadout(); + self chugabud_corpse_cleanup( corpse, 1 ); +} + +chugabud_bleed_timeout( delay, corpse ) //checked changed to match cerberus output +{ + self endon( "player_suicide" ); + self endon( "disconnect" ); + corpse endon( "death" ); + wait delay; + if ( isDefined( corpse.revivetrigger ) ) + { + while ( corpse.revivetrigger.beingrevived ) + { + wait 0.01; + } + } + if ( isDefined( self.loadout.perks ) && flag( "solo_game" ) ) + { + for ( i = 0; i < self.loadout.perks.size; i++ ) + { + perk = self.loadout.perks[ i ]; + if ( perk == "specialty_quickrevive" ) + { + arrayremovevalue( self.loadout.perks, self.loadout.perks[ i ] ); + corpse notify( "player_revived" ); + return; + } + } + } + self chugabud_corpse_cleanup( corpse, 0 ); +} + +chugabud_corpse_cleanup( corpse, was_revived ) //checked matches cerberus output +{ + self notify( "chugabud_effects_cleanup" ); + if ( was_revived ) + { + playsoundatposition( "evt_ww_appear", corpse.origin ); + playfx( level._effect[ "chugabud_revive_fx" ], corpse.origin ); + } + else + { + playsoundatposition( "evt_ww_disappear", corpse.origin ); + playfx( level._effect[ "chugabud_bleedout_fx" ], corpse.origin ); + self notify( "chugabud_bleedout" ); + } + if ( isDefined( corpse.revivetrigger ) ) + { + corpse notify( "stop_revive_trigger" ); + corpse.revivetrigger delete(); + corpse.revivetrigger = undefined; + } + if ( isDefined( corpse.revive_hud_elem ) ) + { + corpse.revive_hud_elem destroy(); + corpse.revive_hud_elem = undefined; + } + self.loadout = undefined; + wait 0.1; + corpse delete(); + self.e_chugabud_corpse = undefined; +} + +chugabud_handle_multiple_instances( corpse ) //checked matches cerberus output +{ + corpse endon( "death" ); + self waittill( "perk_chugabud_activated" ); + self chugabud_corpse_cleanup( corpse, 0 ); +} + +chugabud_spawn_corpse() //checked matches cerberus output +{ + corpse = maps/mp/zombies/_zm_clone::spawn_player_clone( self, self.origin, undefined, self.whos_who_shader ); + corpse.angles = self.angles; + corpse maps/mp/zombies/_zm_clone::clone_give_weapon( "m1911_zm" ); + corpse maps/mp/zombies/_zm_clone::clone_animate( "laststand" ); + corpse.revive_hud = self chugabud_revive_hud_create(); + corpse thread maps/mp/zombies/_zm_laststand::revive_trigger_spawn(); + return corpse; +} + +chugabud_revive_hud_create() //checked matches cerberus output +{ + self.revive_hud = newclienthudelem( self ); + self.revive_hud.alignx = "center"; + self.revive_hud.aligny = "middle"; + self.revive_hud.horzalign = "center"; + self.revive_hud.vertalign = "bottom"; + self.revive_hud.y = -50; + self.revive_hud.foreground = 1; + self.revive_hud.font = "default"; + self.revive_hud.fontscale = 1.5; + self.revive_hud.alpha = 0; + self.revive_hud.color = ( 1, 1, 1 ); + self.revive_hud settext( "" ); + return self.revive_hud; +} + +chugabud_save_loadout() //checked changed to match cerberus output +{ + primaries = self getweaponslistprimaries(); + currentweapon = self getcurrentweapon(); + self.loadout = spawnstruct(); + self.loadout.player = self; + self.loadout.weapons = []; + self.loadout.score = self.score; + self.loadout.current_weapon = -1; + index = 0; + foreach ( weapon in primaries ) + { + logline1 = "weapon: " + weapon + "\n"; + logprint( logline1 ); + self.loadout.weapons[ index ] = maps/mp/zombies/_zm_weapons::get_player_weapondata( self, weapon ); + if ( weapon == currentweapon || self.loadout.weapons[ index ][ "alt_name" ] == currentweapon ) + { + self.loadout.current_weapon = index; + } + index++; + } + self.loadout.equipment = self get_player_equipment(); + if ( isDefined( self.loadout.equipment ) ) + { + self equipment_take( self.loadout.equipment ); + } + self.loadout save_weapons_for_chugabud( self ); + if ( self hasweapon( "claymore_zm" ) ) + { + self.loadout.hasclaymore = 1; + self.loadout.claymoreclip = self getweaponammoclip( "claymore_zm" ); + } + self.loadout.perks = chugabud_save_perks( self ); + self chugabud_save_grenades(); + if ( maps/mp/zombies/_zm_weap_cymbal_monkey::cymbal_monkey_exists() ) + { + self.loadout.zombie_cymbal_monkey_count = self getweaponammoclip( "cymbal_monkey_zm" ); + } +} + +chugabud_save_grenades() //checked matches cerberus output +{ + if ( self hasweapon( "emp_grenade_zm" ) ) + { + self.loadout.hasemp = 1; + self.loadout.empclip = self getweaponammoclip( "emp_grenade_zm" ); + } + lethal_grenade = self get_player_lethal_grenade(); + if ( self hasweapon( lethal_grenade ) ) + { + self.loadout.lethal_grenade = lethal_grenade; + self.loadout.lethal_grenade_count = self getweaponammoclip( lethal_grenade ); + } + else + { + self.loadout.lethal_grenade = undefined; + } +} + +chugabud_give_loadout() //checked partially changed to match cerberus output continues in for loops bad see the github for more info +{ + self takeallweapons(); + loadout = self.loadout; + primaries = self getweaponslistprimaries(); + if ( loadout.weapons.size > 1 || primaries.size > 1 ) + { + foreach ( weapon in primaries ) + { + self takeweapon( weapon ); + } + } + i = 0; + while ( i < loadout.weapons.size ) + { +// logline1 = "loadout.weapons[ " + i + " ][ name ] " + loadout.weapons[ i ][ "name" ] + "\n"; +// logprint( logline1 ); + if ( !isDefined( loadout.weapons[ i ] ) ) + { + i++; + continue; + } + if ( loadout.weapons[ i ][ "name" ] == "none" ) + { + i++; + continue; + } + self maps/mp/zombies/_zm_weapons::weapondata_give( loadout.weapons[ i ] ); + i++; + } + if ( loadout.current_weapon >= 0 && isDefined( loadout.weapons[ loadout.current_weapon ][ "name" ] ) ) + { + self switchtoweapon( loadout.weapons[ loadout.current_weapon ][ "name" ] ); + } + self giveweapon( "knife_zm" ); + self maps/mp/zombies/_zm_equipment::equipment_give( self.loadout.equipment ); + loadout restore_weapons_for_chugabud( self ); + self chugabud_restore_claymore(); + self.score = loadout.score; + self.pers[ "score" ] = loadout.score; + perk_array = maps/mp/zombies/_zm_perks::get_perk_array( 1 ); + for ( i = 0; i < perk_array.size; i++ ) + { + perk = perk_array[ i ]; + self unsetperk( perk ); + self.num_perks--; + self set_perk_clientfield( perk, 0 ); + } + if ( isDefined( loadout.perks ) && loadout.perks.size > 0 ) + { + + i = 0; + while ( i < loadout.perks.size ) + { + if ( self hasperk( loadout.perks[ i ] ) ) + { + i++; + continue; + } + if ( loadout.perks[ i ] == "specialty_quickrevive" && flag( "solo_game" ) ) + { + level.solo_game_free_player_quickrevive = 1; + } + if ( loadout.perks[ i ] == "specialty_longersprint" ) + { + self setperk( "specialty_longersprint" ); //gives the staminup perk functionality + self.hasStaminUp = true; //sets the staminup variable + self thread maps/mp/gametypes_zm/_clientids::drawCustomPerkHUD("specialty_juggernaut_zombies", 0, (1, 1, 0)); + arrayremovevalue( loadout.perks, "specialty_longersprint" ); + + continue; + } + if ( loadout.perks[ i ] == "specialty_deadshot" ) + { + self setperk( "specialty_deadshot"); //gives the deadshot perk functionality + self.hasDeadshot = true; //sets the deadshot variable + self thread maps/mp/gametypes_zm/_clientids::drawCustomPerkHUD("specialty_quickrevive_zombies", 0, (0.125, 0.125, 0.125)); + arrayremovevalue( loadout.perks, "specialty_deadshot" ); + continue; + } + if ( loadout.perks[ i ] == "specialty_finalstand" ) + { + i++; + continue; + } + maps/mp/zombies/_zm_perks::give_perk( loadout.perks[ i ] ); + i++; + } + } + self chugabud_restore_grenades(); + if ( maps/mp/zombies/_zm_weap_cymbal_monkey::cymbal_monkey_exists() ) + { + if ( loadout.zombie_cymbal_monkey_count ) + { + self maps/mp/zombies/_zm_weap_cymbal_monkey::player_give_cymbal_monkey(); + self setweaponammoclip( "cymbal_monkey_zm", loadout.zombie_cymbal_monkey_count ); + } + } +} + +chugabud_restore_grenades() //checked matches cerberus output +{ + if ( isDefined( self.loadout.hasemp ) && self.loadout.hasemp ) + { + self giveweapon( "emp_grenade_zm" ); + self setweaponammoclip( "emp_grenade_zm", self.loadout.empclip ); + } + if ( isDefined( self.loadout.lethal_grenade ) ) + { + self giveweapon( self.loadout.lethal_grenade ); + self setweaponammoclip( self.loadout.lethal_grenade, self.loadout.lethal_grenade_count ); + } +} + +chugabud_restore_claymore() //checked matches cerberus output +{ + if ( isDefined( self.loadout.hasclaymore ) && self.loadout.hasclaymore && !self hasweapon( "claymore_zm" ) ) + { + self giveweapon( "claymore_zm" ); + self set_player_placeable_mine( "claymore_zm" ); + self setactionslot( 4, "weapon", "claymore_zm" ); + self setweaponammoclip( "claymore_zm", self.loadout.claymoreclip ); + } +} + +chugabud_fake_death() //checked matches cerberus output +{ + level notify( "fake_death" ); + self notify( "fake_death" ); + self takeallweapons(); + self allowstand( 0 ); + self allowcrouch( 0 ); + self allowprone( 1 ); + self.ignoreme = 1; + self enableinvulnerability(); + wait 0.1; + self freezecontrols( 1 ); + wait 0.9; +} + +chugabud_fake_revive() //checked matches cerberus output +{ + level notify( "fake_revive" ); + self notify( "fake_revive" ); + playsoundatposition( "evt_ww_disappear", self.origin ); + playfx( level._effect[ "chugabud_revive_fx" ], self.origin ); + spawnpoint = chugabud_get_spawnpoint(); + if ( isDefined( level._chugabud_post_respawn_override_func ) ) + { + self [[ level._chugabud_post_respawn_override_func ]]( spawnpoint.origin ); + } + if ( isDefined( level.chugabud_force_corpse_position ) ) + { + if ( isDefined( self.e_chugabud_corpse ) ) + { + self.e_chugabud_corpse forceteleport( level.chugabud_force_corpse_position ); + } + level.chugabud_force_corpse_position = undefined; + } + if ( isDefined( level.chugabud_force_player_position ) ) + { + spawnpoint.origin = level.chugabud_force_player_position; + level.chugabud_force_player_position = undefined; + } + self setorigin( spawnpoint.origin ); + self setplayerangles( spawnpoint.angles ); + playsoundatposition( "evt_ww_appear", spawnpoint.origin ); + playfx( level._effect[ "chugabud_revive_fx" ], spawnpoint.origin ); + self allowstand( 1 ); + self allowcrouch( 1 ); + self allowprone( 1 ); + self.ignoreme = 0; + self setstance( "stand" ); + self freezecontrols( 0 ); + self giveweapon( "knife_zm" ); + self give_start_weapon( 1 ); + self.score = self.loadout.score; + self.pers[ "score" ] = self.loadout.score; + self giveweapon( "frag_grenade_zm" ); + self setweaponammoclip( "frag_grenade_zm", 2 ); + self chugabud_restore_claymore(); + wait 1; + self disableinvulnerability(); +} + +chugabud_get_spawnpoint() //checked partially changed to match cerberus output nested foreach is probably bad +{ + spawnpoint = undefined; + if ( get_chugabug_spawn_point_from_nodes( self.origin, 500, 700, 64, 1 ) ) + { + spawnpoint = level.chugabud_spawn_struct; + } + if ( !isDefined( spawnpoint ) ) + { + if ( get_chugabug_spawn_point_from_nodes( self.origin, 100, 400, 64, 1 ) ) + { + spawnpoint = level.chugabud_spawn_struct; + } + } + if ( !isDefined( spawnpoint ) ) + { + if ( get_chugabug_spawn_point_from_nodes( self.origin, 50, 400, 256, 0 ) ) + { + spawnpoint = level.chugabud_spawn_struct; + } + } + if ( !isDefined( spawnpoint ) ) + { + spawnpoint = maps/mp/zombies/_zm::check_for_valid_spawn_near_team( self, 1 ); + } + if ( !isDefined( spawnpoint ) ) + { + match_string = ""; + location = level.scr_zm_map_start_location; + if ( (location == "default" || location == "" ) && isdefined( level.default_start_location ) ) + { + location = level.default_start_location; + } + match_string = level.scr_zm_ui_gametype + "_" + location; + spawnpoints = []; + structs = getstructarray( "initial_spawn", "script_noteworthy" ); + if ( isdefined( structs ) ) + { + foreach ( struct in structs ) + { + if ( isdefined( struct.script_string ) ) + { + tokens = strtok( struct.script_string, " " ); + i = 0; + while ( i < tokens.size ) + { + if ( tokens[ i ] == match_string ) + { + spawnpoints[ spawnpoints.size ] = struct; + } + i++; + } + } + } + } + if ( !isDefined( spawnpoints ) || spawnpoints.size == 0 ) + { + spawnpoints = getstructarray( "initial_spawn_points", "targetname" ); + } + /* +/# + assert( isDefined( spawnpoints ), "Could not find initial spawn points!" ); +#/ + */ + spawnpoint = maps/mp/zombies/_zm::getfreespawnpoint( spawnpoints, self ); + } + return spawnpoint; +} + +get_chugabug_spawn_point_from_nodes( v_origin, min_radius, max_radius, max_height, ignore_targetted_nodes ) //checked partially changed to match cerberus output changed at own discretion +{ + if ( !isDefined( level.chugabud_spawn_struct ) ) + { + level.chugabud_spawn_struct = spawnstruct(); + } + found_node = undefined; + a_nodes = getnodesinradiussorted( v_origin, max_radius, min_radius, max_height, "pathnodes" ); + if ( isDefined( a_nodes ) && a_nodes.size > 0 ) + { + a_player_volumes = getentarray( "player_volume", "script_noteworthy" ); + index = a_nodes.size - 1; + i = index; + while ( i >= 0 ) + { + n_node = a_nodes[ i ]; + if ( ignore_targetted_nodes == 1 ) + { + if ( isDefined( n_node.target ) ) + { + i--; + continue; + } + } + if ( !positionwouldtelefrag( n_node.origin ) ) + { + if ( maps/mp/zombies/_zm_utility::check_point_in_enabled_zone( n_node.origin, 1, a_player_volumes ) ) + { + v_start = ( n_node.origin[ 0 ], n_node.origin[ 1 ], n_node.origin[ 2 ] + 30 ); + v_end = ( n_node.origin[ 0 ], n_node.origin[ 1 ], n_node.origin[ 2 ] - 30 ); + trace = bullettrace( v_start, v_end, 0, undefined ); + if ( trace[ "fraction" ] < 1 ) + { + override_abort = 0; + if ( isDefined( level._chugabud_reject_node_override_func ) ) + { + override_abort = [[ level._chugabud_reject_node_override_func ]]( v_origin, n_node ); + } + if ( !override_abort ) + { + found_node = n_node; + break; + } + } + } + } + i--; + } + } + if ( isDefined( found_node ) ) + { + level.chugabud_spawn_struct.origin = found_node.origin; + v_dir = vectornormalize( v_origin - level.chugabud_spawn_struct.origin ); + level.chugabud_spawn_struct.angles = vectorToAngles( v_dir ); + return 1; + } + return 0; +} + +force_corpse_respawn_position( forced_corpse_position ) //checked matches cerberus output +{ + level.chugabud_force_corpse_position = forced_corpse_position; +} + +force_player_respawn_position( forced_player_position ) //checked matches cerberus output +{ + level.chugabud_force_player_position = forced_player_position; +} + +save_weapons_for_chugabud( player ) //checked changed to match cerberus output +{ + self.chugabud_melee_weapons = []; + for ( i = 0; i < level._melee_weapons.size; i++ ) + { + self save_weapon_for_chugabud( player, level._melee_weapons[ i ].weapon_name ); + } +} + +save_weapon_for_chugabud( player, weapon_name ) //checked matches cerberus output +{ + if ( player hasweapon( weapon_name ) ) + { + self.chugabud_melee_weapons[ weapon_name ] = 1; + } +} + +restore_weapons_for_chugabud( player ) //checked changed to match cerberus output +{ + for ( i = 0; i < level._melee_weapons.size; i++ ) + { + self restore_weapon_for_chugabud( player, level._melee_weapons[ i ].weapon_name ); + } + self.chugabud_melee_weapons = undefined; +} + +restore_weapon_for_chugabud( player, weapon_name ) //checked changed to match cerberus output +{ + if ( !isDefined( weapon_name ) || !isDefined( self.chugabud_melee_weapons ) || !isDefined( self.chugabud_melee_weapons[ weapon_name ] ) ) + { + return; + } + if ( isDefined( self.chugabud_melee_weapons[ weapon_name ] ) && self.chugabud_melee_weapons[ weapon_name ] ) + { + player giveweapon( weapon_name ); + player set_player_melee_weapon( weapon_name ); + self.chugabud_melee_weapons[ weapon_name ] = 0; + } +} + +chugabud_save_perks( ent ) //checked changed to match cerberus output +{ + perk_array = ent get_perk_array( 1 ); + foreach ( perk in perk_array ) + { + ent unsetperk( perk ); + } + return perk_array; +} + +playchugabudtimeraudio() //checked matches cerberus output +{ + self endon( "chugabud_grabbed" ); + self endon( "chugabud_timedout" ); + player = self.player; + self thread playchugabudtimerout( player ); + while ( 1 ) + { + player playsoundtoplayer( "zmb_chugabud_timer_count", player ); + wait 1; + } +} + +playchugabudtimerout( player ) //checked matches cerberus output +{ + self endon( "chugabud_grabbed" ); + self waittill( "chugabud_timedout" ); + player playsoundtoplayer( "zmb_chugabud_timer_out", player ); +} + +chugabud_hostmigration() //checked changed to match cerberus output +{ + level endon( "end_game" ); + level notify( "chugabud_hostmigration" ); + level endon( "chugabud_hostmigration" ); + while ( 1 ) + { + level waittill( "host_migration_end" ); + chugabuds = getentarray( "player_chugabud_model", "script_noteworthy" ); + foreach ( model in chugabuds ) + { + playfxontag( level._effect[ "powerup_on" ], model, "tag_origin" ); + } + } +} + +player_revived_cleanup_chugabud_corpse() //checked matches cerberus output +{ +} + +player_has_chugabud_corpse() //checked matches cerberus output +{ + if ( isDefined( self.e_chugabud_corpse ) ) + { + return 1; + } + return 0; +} + +is_weapon_available_in_chugabud_corpse( weapon, player_to_check ) //checked partially changed to match cerberus output +{ + count = 0; + upgradedweapon = weapon; + if ( isDefined( level.zombie_weapons[ weapon ] ) && isDefined( level.zombie_weapons[ weapon ].upgrade_name ) ) + { + upgradedweapon = level.zombie_weapons[ weapon ].upgrade_name; + } + players = getplayers(); + if ( isDefined( players ) ) + { + player_index = 0; + while ( player_index < players.size ) + { + player = players[ player_index ]; + if ( isDefined( player_to_check ) && player != player_to_check ) + { + player_index++; + continue; + } + if ( player player_has_chugabud_corpse() ) + { + if ( isDefined( player.loadout ) && isDefined( player.loadout.weapons ) ) + { + for ( i = 0; i < player.loadout.weapons.size; i++ ) + { + chugabud_weapon = player.loadout.weapons[ i ]; + if ( isDefined( chugabud_weapon ) && chugabud_weapon[ "name" ] == weapon || chugabud_weapon[ "name" ] == upgradedweapon ) + { + count++; + } + } + } + } + player_index++; + } + } + return count; +} + +chugabud_corpse_cleanup_on_spectator( player ) //checked changed to match cerberus output +{ + self endon( "death" ); + player endon( "disconnect" ); + while ( 1 ) + { + if ( player.sessionstate == "spectator" ) + { + break; + } + wait 0.01; + } + player chugabud_corpse_cleanup( self, 0 ); +} + +chugabud_corpse_revive_icon( player ) //checked changed to match cerberus output +{ + self endon( "death" ); + height_offset = 30; + index = player.clientid; + hud_elem = newhudelem(); + self.revive_hud_elem = hud_elem; + hud_elem.x = self.origin[ 0 ]; + hud_elem.y = self.origin[ 1 ]; + hud_elem.z = self.origin[ 2 ] + height_offset; + hud_elem.alpha = 1; + hud_elem.archived = 1; + hud_elem setshader( "waypoint_revive", 5, 5 ); + hud_elem setwaypoint( 1 ); + hud_elem.hidewheninmenu = 1; + hud_elem.immunetodemogamehudsettings = 1; + while ( 1 ) + { + if ( !isDefined( self.revive_hud_elem ) ) + { + break; + } + hud_elem.x = self.origin[ 0 ]; + hud_elem.y = self.origin[ 1 ]; + hud_elem.z = self.origin[ 2 ] + height_offset; + wait 0.01; + } +} + +activate_chugabud_effects_and_audio() //checked matches cerberus output +{ + if ( isDefined( level.whos_who_client_setup ) ) + { + if ( !isDefined( self.whos_who_effects_active ) ) + { + if ( isDefined( level.chugabud_shellshock ) ) + { + self shellshock( "whoswho", 60 ); + } + if ( isDefined( level.vsmgr_prio_visionset_zm_whos_who ) ) + { + maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_whos_who", self ); + } + self setclientfieldtoplayer( "clientfield_whos_who_audio", 1 ); + self setclientfieldtoplayer( "clientfield_whos_who_filter", 1 ); + self.whos_who_effects_active = 1; + self thread deactivate_chugabud_effects_and_audio(); + } + } +} + +deactivate_chugabud_effects_and_audio() //checked matches cerberus output +{ + self waittill_any( "death", "chugabud_effects_cleanup", "spawned_player" ); + if ( isDefined( level.whos_who_client_setup ) ) + { + if ( isDefined( self.whos_who_effects_active ) && self.whos_who_effects_active == 1 ) + { + if ( isDefined( level.chugabud_shellshock ) ) + { + self stopshellshock(); + } + if ( isDefined( level.vsmgr_prio_visionset_zm_whos_who ) ) + { + maps/mp/_visionset_mgr::vsmgr_deactivate( "visionset", "zm_whos_who", self ); + } + self setclientfieldtoplayer( "clientfield_whos_who_audio", 0 ); + self setclientfieldtoplayer( "clientfield_whos_who_filter", 0 ); + } + self.whos_who_effects_active = undefined; + } +} + + + + + + diff --git a/Zombies Mods/Zombies++/v1.2/Source Code/_zm_powerups.gsc b/Zombies Mods/Zombies++/v1.2/Source Code/_zm_powerups.gsc new file mode 100644 index 0000000..efcfc21 --- /dev/null +++ b/Zombies Mods/Zombies++/v1.2/Source Code/_zm_powerups.gsc @@ -0,0 +1,3124 @@ +#include maps/mp/zombies/_zm_melee_weapon; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/animscripts/zm_death; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_powerups; +#include maps/mp/zombies/_zm_blockers; +#include maps/mp/zombies/_zm_audio_announcer; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_pers_upgrades; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/_demo; +#include maps/mp/zombies/_zm_magicbox; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_net; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; +#include maps/mp/zombies/_zm; +#include maps/mp/gametypes_zm/_hud_message; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_score; + +init() +{ + precacheshader( "specialty_doublepoints_zombies" ); + precacheshader( "specialty_instakill_zombies" ); + precacheshader( "specialty_firesale_zombies" ); + precacheshader( "zom_icon_bonfire" ); + precacheshader( "zom_icon_minigun" ); + precacheshader( "black" ); + set_zombie_var( "zombie_insta_kill", 0, undefined, undefined, 1 ); + set_zombie_var( "zombie_point_scalar", 1, undefined, undefined, 1 ); + set_zombie_var( "zombie_drop_item", 0 ); + set_zombie_var( "zombie_timer_offset", 350 ); + set_zombie_var( "zombie_timer_offset_interval", 30 ); + set_zombie_var( "zombie_powerup_fire_sale_on", 0 ); + set_zombie_var( "zombie_powerup_fire_sale_time", 30 ); + set_zombie_var( "zombie_powerup_bonfire_sale_on", 0 ); + set_zombie_var( "zombie_powerup_bonfire_sale_time", 30 ); + set_zombie_var( "zombie_powerup_insta_kill_on", 0, undefined, undefined, 1 ); + set_zombie_var( "zombie_powerup_insta_kill_time", 30, undefined, undefined, 1 ); + set_zombie_var( "zombie_powerup_point_doubler_on", 0, undefined, undefined, 1 ); + set_zombie_var( "zombie_powerup_point_doubler_time", 30, undefined, undefined, 1 ); + set_zombie_var( "zombie_powerup_drop_increment", 2000 ); + set_zombie_var( "zombie_powerup_drop_max_per_round", 4 ); + if ( level.debugLogging_zm_powerups ) + { + level.maxPowerupsPerRound = getDvarIntDefault( "maxPowerupsPerRound", 4 ); + level.zombie_vars["zombie_powerup_drop_max_per_round"] = level.maxPowerupsPerRound; + } + onplayerconnect_callback( ::init_player_zombie_vars ); + level._effect[ "powerup_on" ] = loadfx( "misc/fx_zombie_powerup_on" ); + level._effect[ "powerup_off" ] = loadfx( "misc/fx_zombie_powerup_off" ); + level._effect[ "powerup_grabbed" ] = loadfx( "misc/fx_zombie_powerup_grab" ); + level._effect[ "powerup_grabbed_wave" ] = loadfx( "misc/fx_zombie_powerup_wave" ); + if ( isDefined( level.using_zombie_powerups ) && level.using_zombie_powerups ) + { + level._effect[ "powerup_on_red" ] = loadfx( "misc/fx_zombie_powerup_on_red" ); + level._effect[ "powerup_grabbed_red" ] = loadfx( "misc/fx_zombie_powerup_red_grab" ); + level._effect[ "powerup_grabbed_wave_red" ] = loadfx( "misc/fx_zombie_powerup_red_wave" ); + } + level._effect[ "powerup_on_solo" ] = loadfx( "misc/fx_zombie_powerup_solo_on" ); + level._effect[ "powerup_grabbed_solo" ] = loadfx( "misc/fx_zombie_powerup_solo_grab" ); + level._effect[ "powerup_grabbed_wave_solo" ] = loadfx( "misc/fx_zombie_powerup_solo_wave" ); + level._effect[ "powerup_on_caution" ] = loadfx( "misc/fx_zombie_powerup_caution_on" ); + level._effect[ "powerup_grabbed_caution" ] = loadfx( "misc/fx_zombie_powerup_caution_grab" ); + level._effect[ "powerup_grabbed_wave_caution" ] = loadfx( "misc/fx_zombie_powerup_caution_wave" ); + init_powerups(); + init_custom_powerups(); + if ( !level.enable_magic ) + { + return; + } + thread watch_for_drop(); + thread setup_firesale_audio(); + thread setup_bonfiresale_audio(); + level.use_new_carpenter_func = ::start_carpenter_new; + level.board_repair_distance_squared = 562500; + level thread track_pack_a_punch_drops(); + level thread onplayerconnecting_powerups(); +} + +onplayerconnecting_powerups() +{ + for(;;) + { + level waittill( "connecting", player ); + player thread startCustomPowerups(); + } +} + +custom_powerup_grab(powerup, player) //credit to _Ox much thx for powerup functions +{ + if(powerup.powerup_name == "money_drop") + player thread doRandomScore(); + else if(powerup.powerup_name == "pack_a_punch") + player thread doPackAPunchWeapon(); + else if(powerup.powerup_name == "unlimited_ammo") + player thread doUnlimitedAmmo(); + else if(powerup.powerup_name == "fast_feet") + player thread doFastFeet(); + else if (isDefined(level.original_zombiemode_powerup_grab)) + level thread [[level.original_zombiemode_powerup_grab]](powerup, player); +} + +startCustomPowerups() +{ + if(!isDefined(level.custompowerupinit)) + { + level.custompowerupinit = true; + wait 2; + if(isDefined(level._zombiemode_powerup_grab)) + level.original_zombiemode_powerup_grab = level._zombiemode_powerup_grab; + wait 2; + level._zombiemode_powerup_grab = ::custom_powerup_grab; + } +} + +init_custom_powerups() //credit goes to _Ox for most code +{ + level.unlimited_ammo_duration = 20; + include_zombie_powerup("unlimited_ammo"); + add_zombie_powerup("unlimited_ammo", "T6_WPN_AR_GALIL_WORLD", &"ZOMBIE_POWERUP_UNLIMITED_AMMO", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("unlimited_ammo", 1); + if(getDvar("mapname") == "zm_prison") + { + + include_zombie_powerup("fast_feet"); + add_zombie_powerup("fast_feet", "bottle_whisky_01", &"ZOMBIE_POWERUP_FAST_FEET", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("fast_feet", 1); + + include_zombie_powerup("pack_a_punch"); + 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); + powerup_set_can_pick_up_in_last_stand("pack_a_punch", 0); + + include_zombie_powerup("money_drop"); + add_zombie_powerup("money_drop", "p6_anim_zm_al_magic_box_lock_red", &"ZOMBIE_POWERUP_MONEY_DROP", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("money_drop", 1); + } + else if ( level.script == "zm_nuked" ) + { + include_zombie_powerup("fast_feet"); + add_zombie_powerup("fast_feet", "t6_wpn_zmb_perk_bottle_doubletap_world", &"ZOMBIE_POWERUP_FAST_FEET", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("fast_feet", 1); + + include_zombie_powerup("pack_a_punch"); + 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); + powerup_set_can_pick_up_in_last_stand("pack_a_punch", 0); + + include_zombie_powerup("money_drop"); + add_zombie_powerup("money_drop", "zombie_teddybear", &"ZOMBIE_POWERUP_MONEY_DROP", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("money_drop", 1); + } + else + { + include_zombie_powerup("fast_feet"); + add_zombie_powerup("fast_feet", "zombie_pickup_perk_bottle", &"ZOMBIE_POWERUP_FAST_FEET", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("fast_feet", 1); + + include_zombie_powerup("pack_a_punch"); + 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); + powerup_set_can_pick_up_in_last_stand("pack_a_punch", 0); + + include_zombie_powerup("money_drop"); + add_zombie_powerup("money_drop", "zombie_teddybear", &"ZOMBIE_POWERUP_MONEY_DROP", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("money_drop", 1); + } +} + +init_powerups() +{ + flag_init( "zombie_drop_powerups" ); + level.unlimited_ammo_duration = 20; + if ( isDefined( level.enable_magic ) && level.enable_magic ) + { + flag_set( "zombie_drop_powerups" ); + } + if ( !isDefined( level.active_powerups ) ) + { + level.active_powerups = []; + } + if ( !isDefined( level.zombie_powerup_array ) ) + { + level.zombie_powerup_array = []; + } + if ( !isDefined( level.zombie_special_drop_array ) ) + { + level.zombie_special_drop_array = []; + } + add_zombie_powerup( "nuke", "zombie_bomb", &"ZOMBIE_POWERUP_NUKE", ::func_should_always_drop, 0, 0, 0, "misc/fx_zombie_mini_nuke_hotness" ); + add_zombie_powerup( "insta_kill", "zombie_skull", &"ZOMBIE_POWERUP_INSTA_KILL", ::func_should_always_drop, 0, 0, 0, undefined, "powerup_instant_kill", "zombie_powerup_insta_kill_time", "zombie_powerup_insta_kill_on" ); + add_zombie_powerup( "full_ammo", "zombie_ammocan", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_always_drop, 0, 0, 0 ); + add_zombie_powerup( "double_points", "zombie_x2_icon", &"ZOMBIE_POWERUP_DOUBLE_POINTS", ::func_should_always_drop, 0, 0, 0, undefined, "powerup_double_points", "zombie_powerup_point_doubler_time", "zombie_powerup_point_doubler_on" ); + add_zombie_powerup( "carpenter", "zombie_carpenter", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_drop_carpenter, 0, 0, 0 ); + add_zombie_powerup( "fire_sale", "zombie_firesale", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_drop_fire_sale, 0, 0, 0, undefined, "powerup_fire_sale", "zombie_powerup_fire_sale_time", "zombie_powerup_fire_sale_on" ); + add_zombie_powerup( "bonfire_sale", "zombie_pickup_bonfire", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_never_drop, 0, 0, 0, undefined, "powerup_bon_fire", "zombie_powerup_bonfire_sale_time", "zombie_powerup_bonfire_sale_on" ); + add_zombie_powerup( "minigun", "zombie_pickup_minigun", &"ZOMBIE_POWERUP_MINIGUN", ::func_should_drop_minigun, 1, 0, 0, undefined, "powerup_mini_gun", "zombie_powerup_minigun_time", "zombie_powerup_minigun_on" ); + add_zombie_powerup( "free_perk", "zombie_pickup_perk_bottle", &"ZOMBIE_POWERUP_FREE_PERK", ::func_should_never_drop, 0, 0, 0 ); + add_zombie_powerup( "tesla", "zombie_pickup_minigun", &"ZOMBIE_POWERUP_MINIGUN", ::func_should_never_drop, 1, 0, 0, undefined, "powerup_tesla", "zombie_powerup_tesla_time", "zombie_powerup_tesla_on" ); + add_zombie_powerup( "random_weapon", "zombie_pickup_minigun", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_never_drop, 1, 0, 0 ); + add_zombie_powerup( "bonus_points_player", "zombie_z_money_icon", &"ZOMBIE_POWERUP_BONUS_POINTS", ::func_should_never_drop, 1, 0, 0 ); + add_zombie_powerup( "bonus_points_team", "zombie_z_money_icon", &"ZOMBIE_POWERUP_BONUS_POINTS", ::func_should_never_drop, 0, 0, 0 ); + add_zombie_powerup( "lose_points_team", "zombie_z_money_icon", &"ZOMBIE_POWERUP_LOSE_POINTS", ::func_should_never_drop, 0, 0, 1 ); + add_zombie_powerup( "lose_perk", "zombie_pickup_perk_bottle", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_never_drop, 0, 0, 1 ); + add_zombie_powerup( "empty_clip", "zombie_ammocan", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_never_drop, 0, 0, 1 ); + add_zombie_powerup( "insta_kill_ug", "zombie_skull", &"ZOMBIE_POWERUP_INSTA_KILL", ::func_should_never_drop, 1, 0, 0, undefined, "powerup_instant_kill_ug", "zombie_powerup_insta_kill_ug_time", "zombie_powerup_insta_kill_ug_on", 5000 ); + if ( isDefined( level.level_specific_init_powerups ) ) + { + [[ level.level_specific_init_powerups ]](); + } + randomize_powerups(); + level.zombie_powerup_index = 0; + randomize_powerups(); + level.rare_powerups_active = 0; + level.firesale_vox_firstime = 0; + level thread powerup_hud_monitor(); + if ( isDefined( level.quantum_bomb_register_result_func ) ) + { + [[ level.quantum_bomb_register_result_func ]]( "random_powerup", ::quantum_bomb_random_powerup_result, 5, level.quantum_bomb_in_playable_area_validation_func ); + [[ level.quantum_bomb_register_result_func ]]( "random_zombie_grab_powerup", ::quantum_bomb_random_zombie_grab_powerup_result, 5, level.quantum_bomb_in_playable_area_validation_func ); + [[ level.quantum_bomb_register_result_func ]]( "random_weapon_powerup", ::quantum_bomb_random_weapon_powerup_result, 60, level.quantum_bomb_in_playable_area_validation_func ); + [[ level.quantum_bomb_register_result_func ]]( "random_bonus_or_lose_points_powerup", ::quantum_bomb_random_bonus_or_lose_points_powerup_result, 25, level.quantum_bomb_in_playable_area_validation_func ); + } + registerclientfield( "scriptmover", "powerup_fx", 1000, 3, "int" ); +} + +init_player_zombie_vars() //checked matches cerberus output +{ + self.zombie_vars[ "zombie_powerup_minigun_on" ] = 0; + self.zombie_vars[ "zombie_powerup_minigun_time" ] = 0; + self.zombie_vars[ "zombie_powerup_tesla_on" ] = 0; + self.zombie_vars[ "zombie_powerup_tesla_time" ] = 0; + self.zombie_vars[ "zombie_powerup_insta_kill_ug_on" ] = 0; + self.zombie_vars[ "zombie_powerup_insta_kill_ug_time" ] = 18; +} + +set_weapon_ignore_max_ammo( str_weapon ) //checked matches cerberus output +{ + if ( !isDefined( level.zombie_weapons_no_max_ammo ) ) + { + level.zombie_weapons_no_max_ammo = []; + } + level.zombie_weapons_no_max_ammo[ str_weapon ] = 1; +} + +powerup_hud_monitor() //checked partially changed to match cerberus output +{ + flag_wait( "start_zombie_round_logic" ); + if ( isDefined( level.current_game_module ) && level.current_game_module == 2 ) + { + return; + } + flashing_timers = []; + flashing_values = []; + flashing_timer = 10; + flashing_delta_time = 0; + flashing_is_on = 0; + flashing_value = 3; + flashing_min_timer = 0.15; + while ( flashing_timer >= flashing_min_timer ) + { + if ( flashing_timer < 5 ) + { + flashing_delta_time = 0.1; + } + else + { + flashing_delta_time = 0.2; + } + if ( flashing_is_on ) + { + flashing_timer = flashing_timer - flashing_delta_time - 0.05; + flashing_value = 2; + } + else + { + flashing_timer -= flashing_delta_time; + flashing_value = 3; + } + flashing_timers[ flashing_timers.size ] = flashing_timer; + flashing_values[ flashing_values.size ] = flashing_value; + flashing_is_on = !flashing_is_on; + } + client_fields = []; + powerup_keys = getarraykeys( level.zombie_powerups ); + for ( powerup_key_index = 0; powerup_key_index < powerup_keys.size; powerup_key_index++ ) + { + if ( isDefined( level.zombie_powerups[ powerup_keys[ powerup_key_index ] ].client_field_name ) ) + { + powerup_name = powerup_keys[ powerup_key_index ]; + client_fields[ powerup_name ] = spawnstruct(); + client_fields[ powerup_name ].client_field_name = level.zombie_powerups[ powerup_name ].client_field_name; + client_fields[ powerup_name ].solo = level.zombie_powerups[ powerup_name ].solo; + client_fields[ powerup_name ].time_name = level.zombie_powerups[ powerup_name ].time_name; + client_fields[ powerup_name ].on_name = level.zombie_powerups[ powerup_name ].on_name; + } + } + client_field_keys = getarraykeys( client_fields ); + + while ( 1 ) + { + wait 0.05; + waittillframeend; + players = get_players(); + + for ( playerindex = 0; playerindex < players.size; playerindex++ ) + { + client_field_key_index = 0; + while ( client_field_key_index < client_field_keys.size ) + { + + player = players[ playerindex ]; + if ( isdefined(level.powerup_player_valid ) ) + { + if ( ![[ level.powerup_player_valid ]]( player ) ) + { + client_field_key_index++; + continue; + } + } + + client_field_name = client_fields[ client_field_keys[ client_field_key_index ] ].client_field_name; + time_name = client_fields[ client_field_keys[ client_field_key_index ] ].time_name; + on_name = client_fields[ client_field_keys[ client_field_key_index ] ].on_name; + powerup_timer = undefined; + powerup_on = undefined; + if ( client_fields[ client_field_keys[ client_field_key_index ] ].solo ) + { + if ( isdefined( player._show_solo_hud ) && player._show_solo_hud == 1 ) + { + powerup_timer = player.zombie_vars[ time_name ]; + powerup_on = player.zombie_vars[ on_name ]; + } + } + + else if ( isdefined( level.zombie_vars[ player.team ][ time_name ] ) ) + { + powerup_timer = level.zombie_vars[ player.team ][ time_name ]; + powerup_on = level.zombie_vars[ player.team ][on_name ]; + } + else if ( isdefined( level.zombie_vars[ time_name ] ) ) + { + powerup_timer = level.zombie_vars[ time_name ]; + powerup_on = level.zombie_vars[ on_name ]; + } + + if ( isdefined( powerup_timer ) && isdefined( powerup_on ) ) + { + player set_clientfield_powerups( client_field_name, powerup_timer, powerup_on, flashing_timers, flashing_values ); + } + else + { + player setclientfieldtoplayer( client_field_name, 0 ); + } + client_field_key_index++; + } + } + + } +} + +set_clientfield_powerups( clientfield_name, powerup_timer, powerup_on, flashing_timers, flashing_values ) //checked changed to match cerberus output +{ + if ( powerup_on ) + { + if ( powerup_timer < 10 ) + { + flashing_value = 3; + for ( i = flashing_timers.size - 1; i > 0; i-- ) + { + if ( powerup_timer < flashing_timers[ i ] ) + { + flashing_value = flashing_values[ i ]; + break; + } + } + self setclientfieldtoplayer( clientfield_name, flashing_value ); + } + else + { + self setclientfieldtoplayer( clientfield_name, 1 ); + } + } + else + { + self setclientfieldtoplayer( clientfield_name, 0 ); + } +} + +randomize_powerups() //checked matches cerberus output +{ + level.zombie_powerup_array = array_randomize( level.zombie_powerup_array ); +} + +get_next_powerup() //checked matches cerberus output +{ + powerup = level.zombie_powerup_array[ level.zombie_powerup_index ]; + level.zombie_powerup_index++; + if ( level.zombie_powerup_index >= level.zombie_powerup_array.size ) + { + level.zombie_powerup_index = 0; + randomize_powerups(); + } + return powerup; +} + +get_valid_powerup() //checked partially matches cerberus output did not change +{ + if ( isDefined( level.zombie_powerup_boss ) ) + { + i = level.zombie_powerup_boss; + level.zombie_powerup_boss = undefined; + return level.zombie_powerup_array[ i ]; + } + if ( isDefined( level.zombie_powerup_ape ) ) + { + powerup = level.zombie_powerup_ape; + level.zombie_powerup_ape = undefined; + return powerup; + } + powerup = get_next_powerup(); + while ( 1 ) + { + while ( !( [[ level.zombie_powerups[ powerup ].func_should_drop_with_regular_powerups ]]() ) ) + { + powerup = get_next_powerup(); + } + return powerup; + } +} + +minigun_no_drop() //checked matches cerberus output +{ + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ].zombie_vars[ "zombie_powerup_minigun_on" ] == 1 ) + { + return 1; + } + i++; + } + if ( !flag( "power_on" ) ) + { + if ( flag( "solo_game" ) ) + { + if ( level.solo_lives_given == 0 ) + { + return 1; + } + } + else + { + return 1; + } + } + return 0; +} + +get_num_window_destroyed() //checked partially matches cerberus output did not change +{ + num = 0; + for ( i = 0; i < level.exterior_goals.size; i++ ) + { + if ( all_chunks_destroyed( level.exterior_goals[ i ], level.exterior_goals[ i ].barrier_chunks ) ) + { + num += 1; + } + } + return num; +} + +watch_for_drop() //checked partially matches cerberus output did not change +{ + flag_wait( "start_zombie_round_logic" ); + flag_wait( "begin_spawning" ); + players = get_players(); + score_to_drop = ( players.size * level.zombie_vars[ "zombie_score_start_" + players.size + "p" ] ) + level.zombie_vars[ "zombie_powerup_drop_increment" ]; + while ( 1 ) + { + flag_wait( "zombie_drop_powerups" ); + players = get_players(); + curr_total_score = 0; + for ( i = 0; i < players.size; i++ ) + { + if ( isDefined( players[ i ].score_total ) ) + { + curr_total_score += players[ i ].score_total; + } + } + if ( curr_total_score > score_to_drop ) + { + level.zombie_vars[ "zombie_powerup_drop_increment" ] *= 1.14; + score_to_drop = curr_total_score + level.zombie_vars[ "zombie_powerup_drop_increment" ]; + level.zombie_vars[ "zombie_drop_item" ] = 1; + } + wait 0.5; + } + +} + +add_zombie_powerup( powerup_name, model_name, hint, func_should_drop_with_regular_powerups, solo, caution, zombie_grabbable, fx, client_field_name, time_name, on_name, clientfield_version ) //checked matches cerberus output +{ + if ( !isDefined( clientfield_version ) ) + { + clientfield_version = 1; + } + if ( isDefined( level.zombie_include_powerups ) && !isDefined( level.zombie_include_powerups[ powerup_name ] ) ) + { + return; + } + precachemodel( model_name ); + precachestring( hint ); + struct = spawnstruct(); + if ( !isDefined( level.zombie_powerups ) ) + { + level.zombie_powerups = []; + } + struct.powerup_name = powerup_name; + struct.model_name = model_name; + struct.weapon_classname = "script_model"; + struct.hint = hint; + struct.func_should_drop_with_regular_powerups = func_should_drop_with_regular_powerups; + struct.solo = solo; + struct.caution = caution; + struct.zombie_grabbable = zombie_grabbable; + if ( isDefined( fx ) ) + { + struct.fx = loadfx( fx ); + } + level.zombie_powerups[ powerup_name ] = struct; + level.zombie_powerup_array[ level.zombie_powerup_array.size ] = powerup_name; + add_zombie_special_drop( powerup_name ); + if ( !level.createfx_enabled ) + { + if ( isDefined( client_field_name ) ) + { + registerclientfield( "toplayer", client_field_name, clientfield_version, 2, "int" ); + struct.client_field_name = client_field_name; + struct.time_name = time_name; + struct.on_name = on_name; + } + } +} + +powerup_set_can_pick_up_in_last_stand( powerup_name, b_can_pick_up ) //checked matches cerberus output +{ + level.zombie_powerups[ powerup_name ].can_pick_up_in_last_stand = b_can_pick_up; +} + +add_zombie_special_drop( powerup_name ) //checked matches cerberus output +{ + level.zombie_special_drop_array[ level.zombie_special_drop_array.size ] = powerup_name; +} + +include_zombie_powerup( powerup_name ) //checked matches cerberus output +{ + if ( !isDefined( level.zombie_include_powerups ) ) + { + level.zombie_include_powerups = []; + } + level.zombie_include_powerups[ powerup_name ] = 1; +} + +powerup_round_start() //checked matches cerberus output +{ + level.powerup_drop_count = 0; +} + +powerup_drop( drop_point ) //modified function +{ + if ( level.powerup_drop_count >= level.zombie_vars[ "zombie_powerup_drop_max_per_round" ] ) + { + return; + } + if ( !isDefined( level.zombie_include_powerups ) || level.zombie_include_powerups.size == 0 ) + { + return; + } + rand_drop = randomint( 100 ); + if ( rand_drop > 2 ) + { + if ( !level.zombie_vars[ "zombie_drop_item" ] ) + { + return; + } + debug = "score"; + } + else + { + debug = "random"; + } + playable_area = getentarray( "player_volume", "script_noteworthy" ); + level.powerup_drop_count++; + powerup = maps/mp/zombies/_zm_net::network_safe_spawn( "powerup", 1, "script_model", drop_point + vectorScale( ( 0, 0, 1 ), 40 ) ); + valid_drop = 0; + for ( i = 0; i < playable_area.size; i++ ) + { + if ( powerup istouching( playable_area[ i ] ) ) + { + valid_drop = 1; + break; + } + } + if ( valid_drop && level.rare_powerups_active ) + { + pos = ( drop_point[ 0 ], drop_point[ 1 ], drop_point[ 2 ] + 42 ); + if ( check_for_rare_drop_override( pos ) ) + { + level.zombie_vars[ "zombie_drop_item" ] = 0; + valid_drop = 0; + } + } + if ( !valid_drop ) + { + level.powerup_drop_count--; + + powerup delete(); + return; + } + powerup powerup_setup(); + print_powerup_drop( powerup.powerup_name, debug ); + powerup thread powerup_timeout(); + powerup thread powerup_wobble(); + powerup thread powerup_grab(); + powerup thread powerup_move(); + powerup thread powerup_emp(); + level.zombie_vars[ "zombie_drop_item" ] = 0; + level notify( "powerup_dropped" ); +} + +specific_powerup_drop( powerup_name, drop_spot, powerup_team, powerup_location ) //checked partially changed to match cerberus output +{ + powerup = maps/mp/zombies/_zm_net::network_safe_spawn( "powerup", 1, "script_model", drop_spot + vectorScale( ( 0, 0, 1 ), 40 ) ); + level notify( "powerup_dropped" ); + if ( isDefined( powerup ) ) + { + powerup powerup_setup( powerup_name, powerup_team, powerup_location ); + powerup thread powerup_timeout(); + powerup thread powerup_wobble(); + powerup thread powerup_grab( powerup_team ); + powerup thread powerup_move(); + powerup thread powerup_emp(); + return powerup; + } +} + +quantum_bomb_random_powerup_result( position ) //changed to match cerberus output +{ + if ( !isDefined( level.zombie_include_powerups ) || !level.zombie_include_powerups.size ) + { + return; + } + keys = getarraykeys( level.zombie_include_powerups ); + while ( keys.size ) + { + index = randomint( keys.size ); + if ( !level.zombie_powerups[ keys[ index ] ].zombie_grabbable ) + { + skip = 0; + switch( keys[ index ] ) + { + case "bonus_points_player": + case "bonus_points_team": + case "random_weapon": + skip = 1; + break; + case "fire_sale": + case "full_ammo": + case "insta_kill": + case "minigun": + if ( randomint( 4 ) ) + { + skip = 1; + } + break; + case "bonfire_sale": + case "free_perk": + case "tesla": + if ( randomint( 20 ) ) + { + skip = 1; + } + break; + default: + } + if ( skip ) + { + arrayremovevalue( keys, keys[ index ] ); + continue; + } + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_good" ); + [[ level.quantum_bomb_play_player_effect_at_position_func ]]( position ); + level specific_powerup_drop( keys[ index ], position ); + return; + } + else + { + arrayremovevalue( keys, keys[ index ] ); + } + } +} + +quantum_bomb_random_zombie_grab_powerup_result( position ) //changed to match cerberus output +{ + if ( !isDefined( level.zombie_include_powerups ) || !level.zombie_include_powerups.size ) + { + return; + } + keys = getarraykeys( level.zombie_include_powerups ); + while ( keys.size ) + { + index = randomint( keys.size ); + if ( level.zombie_powerups[ keys[ index ] ].zombie_grabbable ) + { + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_bad" ); + [[ level.quantum_bomb_play_player_effect_at_position_func ]]( position ); + level specific_powerup_drop( keys[ index ], position ); + return; + } + else + { + arrayremovevalue( keys, keys[ index ] ); + } + } +} + +quantum_bomb_random_weapon_powerup_result( position ) //checked matches cerberus output +{ + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_good" ); + [[ level.quantum_bomb_play_player_effect_at_position_func ]]( position ); + level specific_powerup_drop( "random_weapon", position ); +} + +quantum_bomb_random_bonus_or_lose_points_powerup_result( position ) //checked matches cerberus output +{ + rand = randomint( 10 ); + powerup = "bonus_points_team"; + switch( rand ) + { + case 0: + case 1: + powerup = "lose_points_team"; + if ( isDefined( level.zombie_include_powerups[ powerup ] ) ) + { + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_bad" ); + break; + } + case 2: + case 3: + case 4: + powerup = "bonus_points_player"; + if ( isDefined( level.zombie_include_powerups[ powerup ] ) ) + { + break; + } + default: + powerup = "bonus_points_team"; + break; + } + [[ level.quantum_bomb_play_player_effect_at_position_func ]]( position ); + level specific_powerup_drop( powerup, position ); +} + +special_powerup_drop( drop_point ) //checked changed to match cerberus output +{ + if ( !isDefined( level.zombie_include_powerups ) || level.zombie_include_powerups.size == 0 ) + { + return; + } + powerup = spawn( "script_model", drop_point + vectorScale( ( 0, 0, 1 ), 40 ) ); + playable_area = getentarray( "player_volume", "script_noteworthy" ); + valid_drop = 0; + for ( i = 0; i < playable_area.size; i++ ) + { + if ( powerup istouching( playable_area[ i ] ) ) + { + valid_drop = 1; + break; + } + } + if ( !valid_drop ) + { + powerup delete(); + return; + } + powerup special_drop_setup(); +} + +cleanup_random_weapon_list() //checked matches cerberus output +{ + self waittill( "death" ); + arrayremovevalue( level.random_weapon_powerups, self ); +} + +powerup_setup( powerup_override, powerup_team, powerup_location ) //checked partially changed to match cerberus output +{ + powerup = undefined; + if ( !isDefined( powerup_override ) ) + { + powerup = get_valid_powerup(); + } + else + { + powerup = powerup_override; + if ( powerup == "tesla" && tesla_powerup_active() ) + { + powerup = "minigun"; + } + } + struct = level.zombie_powerups[ powerup ]; + if ( powerup == "random_weapon" ) + { + players = get_players(); + self.weapon = maps/mp/zombies/_zm_magicbox::treasure_chest_chooseweightedrandomweapon( players[ 0 ] ); + self.base_weapon = self.weapon; + if ( !isDefined( level.random_weapon_powerups ) ) + { + level.random_weapon_powerups = []; + } + level.random_weapon_powerups[ level.random_weapon_powerups.size ] = self; + self thread cleanup_random_weapon_list(); + if ( isDefined( level.zombie_weapons[ self.weapon ].upgrade_name ) && !randomint( 4 ) ) + { + self.weapon = level.zombie_weapons[ self.weapon ].upgrade_name; + } + self setmodel( getweaponmodel( self.weapon ) ); + self useweaponhidetags( self.weapon ); + offsetdw = vectorScale( ( 1, 1, 1 ), 3 ); + self.worldgundw = undefined; + if ( maps/mp/zombies/_zm_magicbox::weapon_is_dual_wield( self.weapon ) ) + { + self.worldgundw = spawn( "script_model", self.origin + offsetdw ); + self.worldgundw.angles = self.angles; + self.worldgundw setmodel( maps/mp/zombies/_zm_magicbox::get_left_hand_weapon_model_name( self.weapon ) ); + self.worldgundw useweaponhidetags( self.weapon ); + self.worldgundw linkto( self, "tag_weapon", offsetdw, ( 0, 0, 0 ) ); + } + } + else + { + self setmodel( struct.model_name ); + } + maps/mp/_demo::bookmark( "zm_powerup_dropped", getTime(), undefined, undefined, 1 ); + playsoundatposition( "zmb_spawn_powerup", self.origin ); + if ( isDefined( powerup_team ) ) + { + self.powerup_team = powerup_team; + } + if ( isDefined( powerup_location ) ) + { + self.powerup_location = powerup_location; + } + self.powerup_name = struct.powerup_name; + self.hint = struct.hint; + self.solo = struct.solo; + self.caution = struct.caution; + self.zombie_grabbable = struct.zombie_grabbable; + self.func_should_drop_with_regular_powerups = struct.func_should_drop_with_regular_powerups; + if ( isDefined( struct.fx ) ) + { + self.fx = struct.fx; + } + if ( isDefined( struct.can_pick_up_in_last_stand ) ) + { + self.can_pick_up_in_last_stand = struct.can_pick_up_in_last_stand; + } + self playloopsound( "zmb_spawn_powerup_loop" ); + level.active_powerups[ level.active_powerups.size ] = self; +} + +special_drop_setup() //checked matches cerberus output +{ + powerup = undefined; + is_powerup = 1; + if ( level.round_number <= 10 ) + { + powerup = get_valid_powerup(); + } + else + { + powerup = level.zombie_special_drop_array[ randomint( level.zombie_special_drop_array.size ) ]; + if ( level.round_number > 15 && randomint( 100 ) < ( ( level.round_number - 15 ) * 5 ) ) + { + powerup = "nothing"; + } + } + switch( powerup ) + { + case "all_revive": + case "bonfire_sale": + case "bonus_points_player": + case "bonus_points_team": + case "carpenter": + case "double_points": + case "empty_clip": + case "fire_sale": + case "free_perk": + case "insta_kill": + case "lose_perk": + case "lose_points_team": + case "minigun": + case "nuke": + case "random_weapon": + case "tesla": + case "zombie_blood": + break; + case "full_ammo": + if ( level.round_number > 10 && randomint( 100 ) < ( ( level.round_number - 10 ) * 5 ) ) + { + powerup = level.zombie_powerup_array[ randomint( level.zombie_powerup_array.size ) ]; + } + break; + case "dog": + if ( level.round_number >= 15 ) + { + is_powerup = 0; + dog_spawners = getentarray( "special_dog_spawner", "targetname" ); + thread play_sound_2d( "sam_nospawn" ); + } + else + { + powerup = get_valid_powerup(); + } + break; + default: + if ( isDefined( level._zombiemode_special_drop_setup ) ) + { + is_powerup = [[ level._zombiemode_special_drop_setup ]]( powerup ); + } + else + { + is_powerup = 0; + playfx( level._effect[ "lightning_dog_spawn" ], self.origin ); + playsoundatposition( "pre_spawn", self.origin ); + wait 1.5; + playsoundatposition( "zmb_bolt", self.origin ); + earthquake( 0.5, 0.75, self.origin, 1000 ); + playrumbleonposition( "explosion_generic", self.origin ); + playsoundatposition( "spawn", self.origin ); + wait 1; + thread play_sound_2d( "sam_nospawn" ); + self delete(); + } + } + if ( is_powerup ) + { + playfx( level._effect[ "lightning_dog_spawn" ], self.origin ); + playsoundatposition( "pre_spawn", self.origin ); + wait 1.5; + playsoundatposition( "zmb_bolt", self.origin ); + earthquake( 0.5, 0.75, self.origin, 1000 ); + playrumbleonposition( "explosion_generic", self.origin ); + playsoundatposition( "spawn", self.origin ); + self powerup_setup( powerup ); + self thread powerup_timeout(); + self thread powerup_wobble(); + self thread powerup_grab(); + self thread powerup_move(); + self thread powerup_emp(); + } +} + +powerup_zombie_grab_trigger_cleanup( trigger ) //checked matches cerberus output +{ + self waittill_any( "powerup_timedout", "powerup_grabbed", "hacked" ); + trigger delete(); +} + +powerup_zombie_grab( powerup_team ) //checked changed to match cerberus output +{ + self endon( "powerup_timedout" ); + self endon( "powerup_grabbed" ); + self endon( "hacked" ); + zombie_grab_trigger = spawn( "trigger_radius", self.origin - vectorScale( ( 0, 0, 1 ), 40 ), 4, 32, 72 ); + zombie_grab_trigger enablelinkto(); + zombie_grab_trigger linkto( self ); + zombie_grab_trigger setteamfortrigger( level.zombie_team ); + self thread powerup_zombie_grab_trigger_cleanup( zombie_grab_trigger ); + poi_dist = 300; + if ( isDefined( level._zombie_grabbable_poi_distance_override ) ) + { + poi_dist = level._zombie_grabbable_poi_distance_override; + } + zombie_grab_trigger create_zombie_point_of_interest( poi_dist, 2, 0, 1, undefined, undefined, powerup_team ); + while ( isDefined( self ) ) + { + zombie_grab_trigger waittill( "trigger", who ); + if ( isDefined( level._powerup_grab_check ) ) + { + if ( !self [[ level._powerup_grab_check ]]( who ) ) + { + continue; + } + } + else if ( !isDefined( who ) || !isai( who ) ) + { + continue; + } + playfx( level._effect[ "powerup_grabbed_red" ], self.origin ); + playfx( level._effect[ "powerup_grabbed_wave_red" ], self.origin ); + switch( self.powerup_name ) + { + case "lose_points_team": + level thread lose_points_team_powerup( self ); + players = get_players(); + players[ randomintrange( 0, players.size ) ] thread powerup_vo( "lose_points" ); + break; + case "lose_perk": + level thread lose_perk_powerup( self ); + break; + case "empty_clip": + level thread empty_clip_powerup( self ); + break; + default: + if ( isDefined( level._zombiemode_powerup_zombie_grab ) ) + { + level thread [[ level._zombiemode_powerup_zombie_grab ]]( self ); + } + if ( isDefined( level._game_mode_powerup_zombie_grab ) ) + { + level thread [[ level._game_mode_powerup_zombie_grab ]]( self, who ); + } + break; + } + level thread maps/mp/zombies/_zm_audio::do_announcer_playvox( "powerup", self.powerup_name ); + wait 0.1; + playsoundatposition( "zmb_powerup_grabbed", self.origin ); + self stoploopsound(); + self powerup_delete(); + self notify( "powerup_grabbed" ); + } +} + +powerup_grab(powerup_team) //checked partially changed to match cerberus output +{ + if ( isdefined( self ) && self.zombie_grabbable ) + { + self thread powerup_zombie_grab( powerup_team ); + return; + } + + self endon ( "powerup_timedout" ); + self endon ( "powerup_grabbed" ); + + range_squared = 4096; + while ( isdefined( self ) ) + { + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( ( self.powerup_name == "minigun" || self.powerup_name == "tesla" ) && players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() || players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && ( self.powerup_name == "random_weapon" || self.powerup_name == "meat_stink" ) || players[ i ] usebuttonpressed() && players[ i ] in_revive_trigger() ) + { + i++; + continue; + } + if ( isdefined( self.can_pick_up_in_last_stand ) && !self.can_pick_up_in_last_stand && players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + i++; + continue; + } + ignore_range = 0; + if ( isdefined( players[ i ].ignore_range_powerup ) && players[ i ].ignore_range_powerup == self ) + { + players[ i ].ignore_range_powerup = undefined; + ignore_range = 1; + } + if ( DistanceSquared( players[ i ].origin, self.origin ) < range_squared || ignore_range ) + { + if ( isdefined(level._powerup_grab_check ) ) + { + if ( !self [[ level._powerup_grab_check ]]( players[ i ] ) ) + { + i++; + continue; + } + } + else if ( isdefined( level.zombie_powerup_grab_func ) ) + { + level thread [[ level.zombie_powerup_grab_func ]](); + break; + } + switch ( self.powerup_name ) + { + case "nuke": + level thread nuke_powerup( self, players[ i ].team ); + players[ i ] thread powerup_vo( "nuke" ); + zombies = getaiarray( level.zombie_team ); + players[ i ].zombie_nuked = arraysort( zombies, self.origin ); + players[ i ] notify( "nuke_triggered" ); + break; + case "full_ammo": + level thread full_ammo_powerup( self ,players[ i ] ); + players[ i ] thread powerup_vo( "full_ammo" ); + break; + case "double_points": + level thread double_points_powerup( self, players[ i ] ); + players[ i ] thread powerup_vo( "double_points" ); + break; + case "insta_kill": + level thread insta_kill_powerup( self,players[ i ] ); + players[ i ] thread powerup_vo( "insta_kill" ); + break; + case "carpenter": + if ( is_classic() ) + { + players[ i ] thread maps/mp/zombies/_zm_pers_upgrades::persistent_carpenter_ability_check(); + } + if ( isdefined( level.use_new_carpenter_func ) ) + { + level thread [[ level.use_new_carpenter_func ]]( self.origin ); + } + else + { + level thread start_carpenter( self.origin ); + } + players[ i ] thread powerup_vo( "carpenter" ); + break; + case "fire_sale": + level thread start_fire_sale( self ); + players[ i ] thread powerup_vo( "firesale" ); + break; + case "bonfire_sale": + level thread start_bonfire_sale( self ); + players[ i ] thread powerup_vo( "firesale" ); + break; + case "minigun": + level thread minigun_weapon_powerup( players[ i ] ); + players[ i ] thread powerup_vo( "minigun" ); + break; + case "free_perk": + level thread free_perk_powerup( self ); + break; + case "tesla": + level thread tesla_weapon_powerup( players[ i ] ); + players[ i ] thread powerup_vo( "tesla" ); + break; + case "random_weapon": + if ( !level random_weapon_powerup( self, players[ i ] ) ) + { + i++; + continue; + } + break; + case "bonus_points_player": + level thread bonus_points_player_powerup( self, players[ i ] ); + players[ i ] thread powerup_vo( "bonus_points_solo" ); + break; + case "bonus_points_team": + level thread bonus_points_team_powerup( self ); + players[ i ] thread powerup_vo( "bonus_points_team" ); + break; + case "teller_withdrawl": + level thread teller_withdrawl( self ,players[ i ] ); + break; + default: + if ( IsDefined( level._zombiemode_powerup_grab ) ) + { + level thread [[ level._zombiemode_powerup_grab ]]( self, players[ i ] ); + } + break; + } + + maps\mp\_demo::bookmark( "zm_player_powerup_grabbed", gettime(), players[ i ] ); + + if( should_award_stat ( self.powerup_name )) //don't do this for things that aren't really a powerup + { + //track # of picked up powerups/drops for the player + players[i] maps/mp/zombies/_zm_stats::increment_client_stat( "drops" ); + players[i] maps/mp/zombies/_zm_stats::increment_player_stat( "drops" ); + players[i] maps/mp/zombies/_zm_stats::increment_client_stat( self.powerup_name + "_pickedup" ); + players[i] maps/mp/zombies/_zm_stats::increment_player_stat( self.powerup_name + "_pickedup" ); + } + + if ( self.solo ) + { + playfx( level._effect[ "powerup_grabbed_solo" ], self.origin ); + playfx( level._effect[ "powerup_grabbed_wave_solo" ], self.origin ); + } + else if ( self.caution ) + { + playfx( level._effect[ "powerup_grabbed_caution" ], self.origin ); + playfx( level._effect[ "powerup_grabbed_wave_caution" ], self.origin ); + } + else + { + playfx( level._effect[ "powerup_grabbed" ], self.origin ); + playfx( level._effect[ "powerup_grabbed_wave" ], self.origin ); + } + + if ( isdefined( self.stolen ) && self.stolen ) + { + level notify( "monkey_see_monkey_dont_achieved" ); + } + if ( isdefined( self.grabbed_level_notify ) ) + { + level notify( self.grabbed_level_notify ); + } + + self.claimed = true; + self.power_up_grab_player = players[ i ]; //Player who grabbed the power up + + wait 0.1 ; + + playsoundatposition("zmb_powerup_grabbed", self.origin); + self stoploopsound(); + self hide(); + + if ( self.powerup_name != "fire_sale" ) + { + if ( isdefined( self.power_up_grab_player ) ) + { + if ( isdefined( level.powerup_intro_vox ) ) + { + level thread [[ level.powerup_intro_vox ]]( self ); + return; + } + else if ( isdefined( level.powerup_vo_available ) ) + { + can_say_vo = [[ level.powerup_vo_available ]](); + if ( !can_say_vo ) + { + self powerup_delete(); + self notify( "powerup_grabbed" ); + return; + } + } + } + } + level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( self.powerup_name, self.power_up_grab_player.pers[ "team" ] ); + self powerup_delete(); + self notify( "powerup_grabbed" ); + } + i++; + } + wait 0.1; + } +} + + +start_fire_sale( item ) //checked matches cerberus output +{ + if ( level.zombie_vars[ "zombie_powerup_fire_sale_time" ] > 0 && is_true( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] ) ) + { + level.zombie_vars[ "zombie_powerup_fire_sale_time" ] += 30; + return; + } + level notify( "powerup fire sale" ); + level endon( "powerup fire sale" ); + level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "fire_sale" ); + level.zombie_vars[ "zombie_powerup_fire_sale_on" ] = 1; + level thread toggle_fire_sale_on(); + level.zombie_vars[ "zombie_powerup_fire_sale_time" ] = 30; + while ( level.zombie_vars[ "zombie_powerup_fire_sale_time" ] > 0 ) + { + wait 0.05; + level.zombie_vars[ "zombie_powerup_fire_sale_time" ] -= 0.05; + } + level.zombie_vars[ "zombie_powerup_fire_sale_on" ] = 0; + level notify( "fire_sale_off" ); +} + +start_bonfire_sale( item ) //checked matches cerberus output +{ + level notify( "powerup bonfire sale" ); + level endon( "powerup bonfire sale" ); + temp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); + temp_ent playloopsound( "zmb_double_point_loop" ); + level.zombie_vars[ "zombie_powerup_bonfire_sale_on" ] = 1; + level thread toggle_bonfire_sale_on(); + level.zombie_vars[ "zombie_powerup_bonfire_sale_time" ] = 30; + while ( level.zombie_vars[ "zombie_powerup_bonfire_sale_time" ] > 0 ) + { + wait 0.05; + level.zombie_vars[ "zombie_powerup_bonfire_sale_time" ] -= 0.05; + } + level.zombie_vars[ "zombie_powerup_bonfire_sale_on" ] = 0; + level notify( "bonfire_sale_off" ); + players = get_players(); + i = 0; + while ( i < players.size ) + { + players[ i ] playsound( "zmb_points_loop_off" ); + i++; + } + temp_ent delete(); +} + +start_carpenter( origin ) //checked partially changed to match cerberus output +{ + window_boards = getstructarray( "exterior_goal", "targetname" ); + total = level.exterior_goals.size; + carp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); + carp_ent playloopsound( "evt_carpenter" ); + while ( 1 ) + { + windows = get_closest_window_repair( window_boards, origin ); + if ( !isDefined( windows ) ) + { + carp_ent stoploopsound( 1 ); + carp_ent playsoundwithnotify( "evt_carpenter_end", "sound_done" ); + carp_ent waittill( "sound_done" ); + break; + } + else arrayremovevalue( window_boards, windows ); + while ( 1 ) + { + if ( all_chunks_intact( windows, windows.barrier_chunks ) ) + { + break; + } + else chunk = get_random_destroyed_chunk( windows, windows.barrier_chunks ); + if ( !isDefined( chunk ) ) + { + break; + } + windows thread maps/mp/zombies/_zm_blockers::replace_chunk( windows, chunk, undefined, maps/mp/zombies/_zm_powerups::is_carpenter_boards_upgraded(), 1 ); + if ( isDefined( windows.clip ) ) + { + windows.clip enable_trigger(); + windows.clip disconnectpaths(); + } + else + { + blocker_disconnect_paths( windows.neg_start, windows.neg_end ); + } + wait_network_frame(); + wait 0.05; + } + wait_network_frame(); + } + players = get_players(); + i = 0; + while ( i < players.size ) + { + players[ i ] maps/mp/zombies/_zm_score::player_add_points( "carpenter_powerup", 200 ); + i++; + } + carp_ent delete(); +} + +get_closest_window_repair( windows, origin ) //checked partially changed to match cerberus output +{ + current_window = undefined; + shortest_distance = undefined; + i = 0; + while ( i < windows.size ) + { + if ( all_chunks_intact( windows, windows[ i ].barrier_chunks ) ) + { + i++; + continue; + } + if ( !isDefined( current_window ) ) + { + current_window = windows[ i ]; + shortest_distance = distancesquared( current_window.origin, origin ); + i++; + continue; + } + if ( distancesquared( windows[ i ].origin, origin ) < shortest_distance ) + { + current_window = windows[ i ]; + shortest_distance = distancesquared( windows[ i ].origin, origin ); + } + i++; + } + return current_window; +} + +powerup_vo( type ) //checked matches cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + if ( isDefined( level.powerup_vo_available ) ) + { + if ( ![[ level.powerup_vo_available ]]() ) + { + return; + } + } + wait randomfloatrange( 2, 2.5 ); + if ( type == "tesla" ) + { + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "weapon_pickup", type ); + } + else + { + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "powerup", type ); + } + if ( isDefined( level.custom_powerup_vo_response ) ) + { + level [[ level.custom_powerup_vo_response ]]( self, type ); + } +} + +powerup_wobble_fx() //checked matches cerberus output +{ + self endon( "death" ); + if ( !isDefined( self ) ) + { + return; + } + if ( isDefined( level.powerup_fx_func ) ) + { + self thread [[ level.powerup_fx_func ]](); + return; + } + if ( self.solo ) + { + self setclientfield( "powerup_fx", 2 ); + } + else if ( self.caution ) + { + self setclientfield( "powerup_fx", 4 ); + } + else if ( self.zombie_grabbable ) + { + self setclientfield( "powerup_fx", 3 ); + } + else + { + self setclientfield( "powerup_fx", 1 ); + } +} + +powerup_wobble() //checked matches cerberus output +{ + self endon( "powerup_grabbed" ); + self endon( "powerup_timedout" ); + self thread powerup_wobble_fx(); + while ( isDefined( self ) ) + { + waittime = randomfloatrange( 2.5, 5 ); + yaw = randomint( 360 ); + if ( yaw > 300 ) + { + yaw = 300; + } + else + { + if ( yaw < 60 ) + { + yaw = 60; + } + } + yaw = self.angles[ 1 ] + yaw; + new_angles = ( -60 + randomint( 120 ), yaw, -45 + randomint( 90 ) ); + self rotateto( new_angles, waittime, waittime * 0.5, waittime * 0.5 ); + if ( isDefined( self.worldgundw ) ) + { + self.worldgundw rotateto( new_angles, waittime, waittime * 0.5, waittime * 0.5 ); + } + wait randomfloat( waittime - 0.1 ); + } +} + +powerup_timeout() //checked partially changed to match cerberus output +{ + if ( isDefined( level._powerup_timeout_override ) && !isDefined( self.powerup_team ) ) + { + self thread [[ level._powerup_timeout_override ]](); + return; + } + self endon( "powerup_grabbed" ); + self endon( "death" ); + self endon( "powerup_reset" ); + self show(); + wait_time = 15; + if ( isDefined( level._powerup_timeout_custom_time ) ) + { + time = [[ level._powerup_timeout_custom_time ]]( self ); + if ( time == 0 ) + { + return; + } + wait_time = time; + } + wait wait_time; + i = 0; + while ( i < 40 ) + { + if ( i % 2 ) + { + self ghost(); + if ( isDefined( self.worldgundw ) ) + { + self.worldgundw ghost(); + } + } + else + { + self show(); + if ( isDefined( self.worldgundw ) ) + { + self.worldgundw show(); + } + } + if ( i < 15 ) + { + wait 0.5; + i++; + continue; + } + else if ( i < 25 ) + { + wait 0.25; + i++; + continue; + } + wait 0.1; + i++; + } + self notify( "powerup_timedout" ); + self powerup_delete(); +} + +powerup_delete() //checked matches cerberus output +{ + arrayremovevalue( level.active_powerups, self, 0 ); + if ( isDefined( self.worldgundw ) ) + { + self.worldgundw delete(); + } + self delete(); +} + +powerup_delete_delayed( time ) //checked matches cerberus output +{ + if ( isDefined( time ) ) + { + wait time; + } + else + { + wait 0.01; + } + self powerup_delete(); +} + +nuke_powerup( drop_item, player_team ) //checked changed to match cerberus output +{ + location = drop_item.origin; + playfx( drop_item.fx, location ); + level thread nuke_flash( player_team ); + wait 0.5; + zombies = getaiarray( level.zombie_team ); + zombies = arraysort( zombies, location ); + zombies_nuked = []; + i = 0; + while ( i < zombies.size ) + { + if ( isdefined( zombies[ i ].ignore_nuke ) && zombies[ i ].ignore_nuke ) + { + i++; + continue; + } + if ( isdefined( zombies[ i ].marked_for_death ) && zombies[ i ].marked_for_death ) + { + i++; + continue; + } + if ( isdefined( zombies[ i ].nuke_damage_func ) ) + { + zombies[ i ] thread [[ zombies[ i ].nuke_damage_func ]](); + i++; + continue; + } + if ( is_magic_bullet_shield_enabled( zombies[ i ] ) ) + { + i++; + continue; + } + zombies[ i ].marked_for_death = 1; + //imported from bo3 _zm_powerup_nuke.gsc + if ( !zombies[ i ].nuked && !is_magic_bullet_shield_enabled( zombies[ i ] ) ) + { + zombies[ i ].nuked = 1; + zombies_nuked[ zombies_nuked.size ] = zombies[ i ]; + } + i++; + } + i = 0; + while ( i < zombies_nuked.size ) + { + wait randomfloatrange( 0.1, 0.7 ); + if ( !isdefined( zombies_nuked[ i ] ) ) + { + i++; + continue; + } + if ( is_magic_bullet_shield_enabled( zombies_nuked[ i ] ) ) + { + i++; + continue; + } + if ( i < 5 && !zombies_nuked[ i ].isdog ) + { + zombies_nuked[ i ] thread maps/mp/animscripts/zm_death::flame_death_fx(); + } + if ( !zombies_nuked[ i ].isdog ) + { + if ( isdefined( zombies_nuked[ i ].no_gib ) && !zombies_nuked[ i ].no_gib ) + { + zombies_nuked[ i ] maps/mp/zombies/_zm_spawner::zombie_head_gib(); + } + zombies_nuked[ i ] playsound("evt_nuked"); + } + zombies_nuked[ i ] dodamage(zombies_nuked[i].health + 666, zombies_nuked[ i ].origin ); + i++; + } + players = get_players( player_team ); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] maps/mp/zombies/_zm_score::player_add_points( "nuke_powerup", 400 ); + } +} + +nuke_flash( team ) //checked matches cerberus output +{ + if ( isDefined( team ) ) + { + get_players()[ 0 ] playsoundtoteam( "evt_nuke_flash", team ); + } + else + { + get_players()[ 0 ] playsound( "evt_nuke_flash" ); + } + fadetowhite = newhudelem(); + fadetowhite.x = 0; + fadetowhite.y = 0; + fadetowhite.alpha = 0; + fadetowhite.horzalign = "fullscreen"; + fadetowhite.vertalign = "fullscreen"; + fadetowhite.foreground = 1; + fadetowhite setshader( "white", 640, 480 ); + fadetowhite fadeovertime( 0.2 ); + fadetowhite.alpha = 0.8; + wait 0.5; + fadetowhite fadeovertime( 1 ); + fadetowhite.alpha = 0; + wait 1.1; + fadetowhite destroy(); +} + +double_points_powerup( drop_item, player ) //checked partially matches cerberus output did not change +{ + level notify( "powerup points scaled_" + player.team ); + level endon( "powerup points scaled_" + player.team ); + team = player.team; + level thread point_doubler_on_hud( drop_item, team ); + if ( isDefined( level.pers_upgrade_double_points ) && level.pers_upgrade_double_points ) + { + player thread maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_double_points_pickup_start(); + } + if ( isDefined( level.current_game_module ) && level.current_game_module == 2 ) + { + if ( isDefined( player._race_team ) ) + { + if ( player._race_team == 1 ) + { + level._race_team_double_points = 1; + } + else + { + level._race_team_double_points = 2; + } + } + } + level.zombie_vars[ team ][ "zombie_point_scalar" ] = 2; + players = get_players(); + for ( player_index = 0; player_index < players.size; player_index++ ) + { + if ( team == players[ player_index ].team ) + { + players[ player_index ] setclientfield( "score_cf_double_points_active", 1 ); + } + } + wait 30; + level.zombie_vars[ team ][ "zombie_point_scalar" ] = 1; + level._race_team_double_points = undefined; + players = get_players(); + for ( player_index = 0; player_index < players.size; player_index++ ) + { + if ( team == players[ player_index ].team ) + { + players[ player_index ] setclientfield( "score_cf_double_points_active", 0 ); + } + } +} + +full_ammo_powerup( drop_item, player ) //checked changed to match cerberus output +{ + players = get_players( player.team ); + if ( isdefined( level._get_game_module_players ) ) + { + players = [[ level._get_game_module_players ]]( player ); + } + i = 0; + while ( i < players.size ) + { + if ( players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + i++; + continue; + } + primary_weapons = players[ i ] getweaponslist( 1 ); + players[ i ] notify( "zmb_max_ammo" ); + players[ i ] notify( "zmb_lost_knife" ); + players[ i ] notify( "zmb_disable_claymore_prompt" ); + players[ i ] notify( "zmb_disable_spikemore_prompt" ); + x = 0; + while ( x < primary_weapons.size ) + { + if ( level.headshots_only && is_lethal_grenade(primary_weapons[ x ] ) ) + { + x++; + continue; + } + if ( isdefined( level.zombie_include_equipment ) && isdefined( level.zombie_include_equipment[ primary_weapons[ x ] ] ) ) + { + x++; + continue; + } + if ( isdefined( level.zombie_weapons_no_max_ammo ) && isdefined( level.zombie_weapons_no_max_ammo[ primary_weapons[ x ] ] ) ) + { + x++; + continue; + } + if ( players[ i ] hasweapon( primary_weapons[ x ] ) ) + { + players[ i ] givemaxammo( primary_weapons[ x ] ); + } + x++; + } + i++; + } + level thread full_ammo_on_hud( drop_item, player.team ); +} + +insta_kill_powerup( drop_item, player ) //checked matches cerberus output +{ + level notify( "powerup instakill_" + player.team ); + level endon( "powerup instakill_" + player.team ); + if ( isDefined( level.insta_kill_powerup_override ) ) + { + level thread [[ level.insta_kill_powerup_override ]]( drop_item, player ); + return; + } + if ( is_classic() ) + { + player thread maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_insta_kill_upgrade_check(); + } + team = player.team; + level thread insta_kill_on_hud( drop_item, team ); + level.zombie_vars[ team ][ "zombie_insta_kill" ] = 1; + wait 30; + level.zombie_vars[ team ][ "zombie_insta_kill" ] = 0; + players = get_players( team ); + i = 0; + while ( i < players.size ) + { + if ( isDefined( players[ i ] ) ) + { + players[ i ] notify( "insta_kill_over" ); + } + i++; + } +} + +is_insta_kill_active() //checked matches cerberus output +{ + return level.zombie_vars[ self.team ][ "zombie_insta_kill" ]; +} + +check_for_instakill( player, mod, hit_location ) //checked changed to match cerberus output +{ + if ( isDefined( player ) && isalive( player ) && isDefined( level.check_for_instakill_override ) ) + { + if ( !self [[ level.check_for_instakill_override ]]( player ) ) + { + return; + } + if ( player.use_weapon_type == "MOD_MELEE" ) + { + player.last_kill_method = "MOD_MELEE"; + } + else + { + player.last_kill_method = "MOD_UNKNOWN"; + } + modname = remove_mod_from_methodofdeath( mod ); + if ( isDefined( self.no_gib ) && self.no_gib ) + { + self maps/mp/zombies/_zm_spawner::zombie_head_gib(); + } + self.health = 1; + self dodamage( self.health + 666, self.origin, player, self, hit_location, modname ); + player notify( "zombie_killed" ); + } + if ( isDefined( player ) && isalive( player ) && level.zombie_vars[ player.team ][ "zombie_insta_kill" ] || isDefined( player.personal_instakill ) && player.personal_instakill ) + { + if ( is_magic_bullet_shield_enabled( self ) ) + { + return; + } + if ( isDefined( self.instakill_func ) ) + { + self thread [[ self.instakill_func ]](); + return; + } + if ( player.use_weapon_type == "MOD_MELEE" ) + { + player.last_kill_method = "MOD_MELEE"; + } + else + { + player.last_kill_method = "MOD_UNKNOWN"; + } + modname = remove_mod_from_methodofdeath( mod ); + if ( flag( "dog_round" ) ) + { + self.health = 1; + self dodamage( self.health + 666, self.origin, player, self, hit_location, modname ); + player notify( "zombie_killed" ); + } + else if ( isdefined( self.no_gib ) && !self.no_gib ) + { + self maps/mp/zombies/_zm_spawner::zombie_head_gib(); + } + self.health = 1; + self dodamage( self.health + 666, self.origin, player, self, hit_location, modname ); + player notify( "zombie_killed" ); + } +} + +insta_kill_on_hud( drop_item, player_team ) //checked matches cerberus output +{ + if ( level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_on" ] ) + { + level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_time" ] = 30; + return; + } + level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_on" ] = 1; + level thread time_remaning_on_insta_kill_powerup( player_team ); +} + +time_remaning_on_insta_kill_powerup( player_team ) //checked matches cerberus output +{ + temp_enta = spawn( "script_origin", ( 0, 0, 0 ) ); + temp_enta playloopsound( "zmb_insta_kill_loop" ); + while ( level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_time" ] >= 0 ) + { + wait 0.05; + level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_time" ] -= 0.05; + } + get_players()[ 0 ] playsoundtoteam( "zmb_insta_kill", player_team ); + temp_enta stoploopsound( 2 ); + level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_on" ] = 0; + level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_time" ] = 30; + temp_enta delete(); +} + +point_doubler_on_hud( drop_item, player_team ) //checked matches cerberus output +{ + self endon( "disconnect" ); + if ( level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_on" ] ) + { + level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_time" ] = 30; + return; + } + level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_on" ] = 1; + level thread time_remaining_on_point_doubler_powerup( player_team ); +} + +time_remaining_on_point_doubler_powerup( player_team ) //checked partially matches cerberus output did not change +{ + temp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); + temp_ent playloopsound( "zmb_double_point_loop" ); + while ( level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_time" ] >= 0 ) + { + wait 0.05; + level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_time" ] -= 0.05; + } + level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_on" ] = 0; + players = get_players( player_team ); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] playsound( "zmb_points_loop_off" ); + } + temp_ent stoploopsound( 2 ); + level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_time" ] = 30; + temp_ent delete(); +} + +toggle_bonfire_sale_on() //checked matches cerberus output +{ + level endon( "powerup bonfire sale" ); + if ( !isDefined( level.zombie_vars[ "zombie_powerup_bonfire_sale_on" ] ) ) + { + return; + } + if ( level.zombie_vars[ "zombie_powerup_bonfire_sale_on" ] ) + { + if ( isDefined( level.bonfire_init_func ) ) + { + level thread [[ level.bonfire_init_func ]](); + } + level waittill( "bonfire_sale_off" ); + } +} + +toggle_fire_sale_on() //checked partially matches cerberus output did not change +{ + level endon( "powerup fire sale" ); + if ( !isDefined( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] ) ) + { + return; + } + while ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] ) + { + for ( i = 0; i < level.chests.size; i++ ) + { + show_firesale_box = level.chests[ i ] [[ level._zombiemode_check_firesale_loc_valid_func ]](); + if ( show_firesale_box ) + { + level.chests[ i ].zombie_cost = 10; + if ( level.chest_index != i ) + { + level.chests[ i ].was_temp = 1; + if ( is_true( level.chests[ i ].hidden ) ) + { + level.chests[ i ] thread maps/mp/zombies/_zm_magicbox::show_chest(); + } + wait_network_frame(); + } + } + } + level waittill( "fire_sale_off" ); + waittillframeend; + for ( i = 0; i < level.chests.size; i++ ) + { + show_firesale_box = level.chests[ i ] [[ level._zombiemode_check_firesale_loc_valid_func ]](); + if ( show_firesale_box ) + { + if ( level.chest_index != i && isDefined( level.chests[ i ].was_temp ) ) + { + level.chests[ i ].was_temp = undefined; + level thread remove_temp_chest( i ); + } + level.chests[ i ].zombie_cost = level.chests[ i ].old_cost; + } + } + } +} + +fire_sale_weapon_wait() //checked matches cerberus output +{ + self.zombie_cost = self.old_cost; + while ( isDefined( self.chest_user ) ) + { + wait_network_frame(); + } + self set_hint_string( self, "default_treasure_chest", self.zombie_cost ); +} + +remove_temp_chest( chest_index ) //checked partially matches cerberus output did not change +{ + while ( isDefined( level.chests[ chest_index ].chest_user ) || isDefined( level.chests[ chest_index ]._box_open ) && level.chests[ chest_index ]._box_open == 1 ) + { + wait_network_frame(); + } + if ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] ) + { + level.chests[ chest_index ].was_temp = 1; + level.chests[ chest_index ].zombie_cost = 10; + return; + } + for ( i = 0; i < chest_index; i++ ) + { + wait_network_frame(); + } + playfx( level._effect[ "poltergeist" ], level.chests[ chest_index ].orig_origin ); + level.chests[ chest_index ].zbarrier playsound( "zmb_box_poof_land" ); + level.chests[ chest_index ].zbarrier playsound( "zmb_couch_slam" ); + wait_network_frame(); + level.chests[ chest_index ] maps/mp/zombies/_zm_magicbox::hide_chest(); +} + +devil_dialog_delay() //checked matches cerberus output +{ + wait 1; +} + +full_ammo_on_hud( drop_item, player_team ) //checked matches cerberus output +{ + self endon( "disconnect" ); + hudelem = maps/mp/gametypes_zm/_hud_util::createserverfontstring( "objective", 2, player_team ); + hudelem maps/mp/gametypes_zm/_hud_util::setpoint( "TOP", undefined, 0, level.zombie_vars[ "zombie_timer_offset" ] - ( level.zombie_vars[ "zombie_timer_offset_interval" ] * 2 ) ); + hudelem.sort = 0.5; + hudelem.alpha = 0; + hudelem fadeovertime( 0.5 ); + hudelem.alpha = 1; + if ( isDefined( drop_item ) ) + { + hudelem.label = drop_item.hint; + } + hudelem thread full_ammo_move_hud( player_team ); +} + +full_ammo_move_hud( player_team ) //checked matches cerberus output +{ + players = get_players( player_team ); + players[ 0 ] playsoundtoteam( "zmb_full_ammo", player_team ); + wait 0.5; + move_fade_time = 1.5; + self fadeovertime( move_fade_time ); + self moveovertime( move_fade_time ); + self.y = 270; + self.alpha = 0; + wait move_fade_time; + self destroy(); +} + +check_for_rare_drop_override( pos ) //checked matches cerberus output +{ + if ( isDefined( flag( "ape_round" ) ) && flag( "ape_round" ) ) + { + return 0; + } + return 0; +} + +setup_firesale_audio() //checked changed to match cerberus output +{ + wait 2; + intercom = getentarray( "intercom", "targetname" ); + while ( 1 ) + { + while ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 0 ) + { + wait 0.2; + } + for ( i = 0; i < intercom.size; i++ ) + { + intercom [i ] thread play_firesale_audio(); + } + while ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 1 ) + { + wait 0.1; + } + level notify( "firesale_over" ); + } +} + +play_firesale_audio() //checked matches cerberus output +{ + if ( isDefined( level.sndfiresalemusoff ) && level.sndfiresalemusoff ) + { + return; + } + if ( isDefined( level.sndannouncerisrich ) && level.sndannouncerisrich ) + { + self playloopsound( "mus_fire_sale_rich" ); + } + else + { + self playloopsound( "mus_fire_sale" ); + } + level waittill( "firesale_over" ); + self stoploopsound(); +} + +setup_bonfiresale_audio() //checked changed to match cerberus output +{ + wait 2; + intercom = getentarray( "intercom", "targetname" ); + while ( 1 ) + { + while ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 0 ) + { + wait 0.2; + } + for ( i = 0; i < intercom.size; i++ ) + { + intercom[ i ] thread play_bonfiresale_audio(); + } + while ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 1 ) + { + wait 0.1; + } + level notify( "firesale_over" ); + } +} + +play_bonfiresale_audio() //checked matches cerberus output +{ + if ( isDefined( level.sndfiresalemusoff ) && level.sndfiresalemusoff ) + { + return; + } + if ( isDefined( level.sndannouncerisrich ) && level.sndannouncerisrich ) + { + self playloopsound( "mus_fire_sale_rich" ); + } + else + { + self playloopsound( "mus_fire_sale" ); + } + level waittill( "firesale_over" ); + self stoploopsound(); +} + +free_perk_powerup( item ) //checked changed to match cerberus output +{ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && players[ i ].sessionstate != "spectator" ) + { + player = players[ i ]; + if ( isDefined( item.ghost_powerup ) ) + { + player maps/mp/zombies/_zm_stats::increment_client_stat( "buried_ghost_perk_acquired", 0 ); + player maps/mp/zombies/_zm_stats::increment_player_stat( "buried_ghost_perk_acquired" ); + player notify( "player_received_ghost_round_free_perk" ); + } + free_perk = player maps/mp/zombies/_zm_perks::give_random_perk(); + if ( isDefined( level.disable_free_perks_before_power ) && level.disable_free_perks_before_power ) + { + player thread disable_perk_before_power( free_perk ); + } + } + } +} + +disable_perk_before_power( perk ) //checked matches cerberus output +{ + self endon( "disconnect" ); + if ( isDefined( perk ) ) + { + wait 0.1; + if ( !flag( "power_on" ) ) + { + a_players = get_players(); + if ( isDefined( a_players ) && a_players.size == 1 && perk == "specialty_quickrevive" ) + { + return; + } + self perk_pause( perk ); + flag_wait( "power_on" ); + self perk_unpause( perk ); + } + } +} + +random_weapon_powerup_throttle() //checked matches cerberus output +{ + self.random_weapon_powerup_throttle = 1; + wait 0.25; + self.random_weapon_powerup_throttle = 0; +} + +random_weapon_powerup( item, player ) //checked partially matches cerberus output did not change +{ + if ( player.sessionstate == "spectator" || player maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + return 0; + } + if ( isDefined( player.random_weapon_powerup_throttle ) && !player.random_weapon_powerup_throttle || player isswitchingweapons() && player.is_drinking > 0 ) + { + return 0; + } + current_weapon = player getcurrentweapon(); + current_weapon_type = weaponinventorytype( current_weapon ); + if ( !is_tactical_grenade( item.weapon ) ) + { + if ( current_weapon_type != "primary" && current_weapon_type != "altmode" ) + { + return 0; + } + if ( !isDefined( level.zombie_weapons[ current_weapon ] ) && !maps/mp/zombies/_zm_weapons::is_weapon_upgraded( current_weapon ) && current_weapon_type != "altmode" ) + { + return 0; + } + } + player thread random_weapon_powerup_throttle(); + weapon_string = item.weapon; + if ( weapon_string == "knife_ballistic_zm" ) + { + weapon = player maps/mp/zombies/_zm_melee_weapon::give_ballistic_knife( weapon_string, 0 ); + } + else + { + if ( weapon_string == "knife_ballistic_upgraded_zm" ) + { + weapon = player maps/mp/zombies/_zm_melee_weapon::give_ballistic_knife( weapon_string, 1 ); + } + } + player thread maps/mp/zombies/_zm_weapons::weapon_give( weapon_string ); + return 1; +} + +bonus_points_player_powerup( item, player ) //checked matches cerberus output +{ + points = randomintrange( 1, 25 ) * 100; + if ( isDefined( level.bonus_points_powerup_override ) ) + { + points = [[ level.bonus_points_powerup_override ]](); + } + if ( !player maps/mp/zombies/_zm_laststand::player_is_in_laststand() && player.sessionstate != "spectator" ) + { + player maps/mp/zombies/_zm_score::player_add_points( "bonus_points_powerup", points ); + } +} + +bonus_points_team_powerup( item ) //checked changed to match cerberus output +{ + points = randomintrange( 1, 25 ) * 100; + if ( isDefined( level.bonus_points_powerup_override ) ) + { + points = [[ level.bonus_points_powerup_override ]](); + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && players[ i ].sessionstate != "spectator" ) + { + players[ i ] maps/mp/zombies/_zm_score::player_add_points( "bonus_points_powerup", points ); + } + } +} + +lose_points_team_powerup( item ) //checked partially changed to match cerberus output +{ + points = randomintrange( 1, 25 ) * 100; + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && players[ i ].sessionstate != "spectator" ) + { + if ( ( players[ i ].score - points ) <= 0 ) + { + players[ i ] maps/mp/zombies/_zm_score::minus_to_player_score( players[ i ].score ); + i++; + continue; + } + else + { + players[ i ] maps/mp/zombies/_zm_score::minus_to_player_score( points ); + } + } + i++; + } +} + +lose_perk_powerup( item ) //checked partially matches cerberus output +{ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + player = players[ i ]; + if ( !player maps/mp/zombies/_zm_laststand::player_is_in_laststand() && player.sessionstate != "spectator" ) + { + player maps/mp/zombies/_zm_perks::lose_random_perk(); + } + } +} + +empty_clip_powerup( item ) //checked partially matches cerberus output +{ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + player = players[ i ]; + if ( !player maps/mp/zombies/_zm_laststand::player_is_in_laststand() && player.sessionstate != "spectator" ) + { + weapon = player getcurrentweapon(); + player setweaponammoclip( weapon, 0 ); + } + } +} + +minigun_weapon_powerup( ent_player, time ) //checked matches cerberus output +{ + ent_player endon( "disconnect" ); + ent_player endon( "death" ); + ent_player endon( "player_downed" ); + if ( !isDefined( time ) ) + { + time = 30; + } + if ( isDefined( level._minigun_time_override ) ) + { + time = level._minigun_time_override; + } + if ( ent_player.zombie_vars[ "zombie_powerup_minigun_on" ] || ent_player getcurrentweapon() == "minigun_zm" && isDefined( ent_player.has_minigun ) && ent_player.has_minigun ) + { + if ( ent_player.zombie_vars[ "zombie_powerup_minigun_time" ] < time ) + { + ent_player.zombie_vars[ "zombie_powerup_minigun_time" ] = time; + } + return; + } + ent_player notify( "replace_weapon_powerup" ); + ent_player._show_solo_hud = 1; + level._zombie_minigun_powerup_last_stand_func = ::minigun_watch_gunner_downed; + ent_player.has_minigun = 1; + ent_player.has_powerup_weapon = 1; + ent_player increment_is_drinking(); + ent_player._zombie_gun_before_minigun = ent_player getcurrentweapon(); + ent_player giveweapon( "minigun_zm" ); + ent_player switchtoweapon( "minigun_zm" ); + ent_player.zombie_vars[ "zombie_powerup_minigun_on" ] = 1; + level thread minigun_weapon_powerup_countdown( ent_player, "minigun_time_over", time ); + level thread minigun_weapon_powerup_replace( ent_player, "minigun_time_over" ); +} + +minigun_weapon_powerup_countdown( ent_player, str_gun_return_notify, time ) //checked matches cerberus output +{ + ent_player endon( "death" ); + ent_player endon( "disconnect" ); + ent_player endon( "player_downed" ); + ent_player endon( str_gun_return_notify ); + ent_player endon( "replace_weapon_powerup" ); + setclientsysstate( "levelNotify", "minis", ent_player ); + ent_player.zombie_vars[ "zombie_powerup_minigun_time" ] = time; + while ( ent_player.zombie_vars[ "zombie_powerup_minigun_time" ] > 0 ) + { + wait 0.05; + ent_player.zombie_vars[ "zombie_powerup_minigun_time" ] -= 0.05; + } + setclientsysstate( "levelNotify", "minie", ent_player ); + level thread minigun_weapon_powerup_remove( ent_player, str_gun_return_notify ); +} + +minigun_weapon_powerup_replace( ent_player, str_gun_return_notify ) //checked matches cerberus output +{ + ent_player endon( "death" ); + ent_player endon( "disconnect" ); + ent_player endon( "player_downed" ); + ent_player endon( str_gun_return_notify ); + ent_player waittill( "replace_weapon_powerup" ); + ent_player takeweapon( "minigun_zm" ); + ent_player.zombie_vars[ "zombie_powerup_minigun_on" ] = 0; + ent_player.has_minigun = 0; + ent_player decrement_is_drinking(); +} + +minigun_weapon_powerup_remove( ent_player, str_gun_return_notify ) //checked partially matches cerberus output did not change +{ + ent_player endon( "death" ); + ent_player endon( "player_downed" ); + ent_player takeweapon( "minigun_zm" ); + ent_player.zombie_vars[ "zombie_powerup_minigun_on" ] = 0; + ent_player._show_solo_hud = 0; + ent_player.has_minigun = 0; + ent_player.has_powerup_weapon = 0; + ent_player notify( str_gun_return_notify ); + ent_player decrement_is_drinking(); + while ( isDefined( ent_player._zombie_gun_before_minigun ) ) + { + player_weapons = ent_player getweaponslistprimaries(); + + for ( i = 0; i < player_weapons.size; i++ ) + { + if ( player_weapons[ i ] == ent_player._zombie_gun_before_minigun ) + { + ent_player switchtoweapon( ent_player._zombie_gun_before_minigun ); + return; + } + } + } + primaryweapons = ent_player getweaponslistprimaries(); + if ( primaryweapons.size > 0 ) + { + ent_player switchtoweapon( primaryweapons[ 0 ] ); + } + else + { + allweapons = ent_player getweaponslist( 1 ); + for ( i = 0; i < allweapons.size; i++ ) + { + if ( is_melee_weapon( allweapons[ i ] ) ) + { + ent_player switchtoweapon( allweapons[ i ] ); + return; + } + } + } +} + +minigun_weapon_powerup_off() //checked matches cerberus output +{ + self.zombie_vars[ "zombie_powerup_minigun_time" ] = 0; +} + +minigun_watch_gunner_downed() //checked partially matches cerberus output did not change +{ + if ( isDefined( self.has_minigun ) && !self.has_minigun ) + { + return; + } + primaryweapons = self getweaponslistprimaries(); + for ( i = 0; i < primaryweapons.size; i++ ) + { + if ( primaryweapons[ i ] == "minigun_zm" ) + { + self takeweapon( "minigun_zm" ); + } + } + self notify( "minigun_time_over" ); + self.zombie_vars[ "zombie_powerup_minigun_on" ] = 0; + self._show_solo_hud = 0; + wait 0.05; + self.has_minigun = 0; + self.has_powerup_weapon = 0; +} + +tesla_weapon_powerup( ent_player, time ) //checked changed to match cerberus output +{ + ent_player endon( "disconnect" ); + ent_player endon( "death" ); + ent_player endon( "player_downed" ); + if ( !isDefined( time ) ) + { + time = 11; + } + if ( ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] && ent_player getcurrentweapon() == "tesla_gun_zm" || isDefined( ent_player.has_tesla ) && ent_player.has_tesla ) + { + ent_player givemaxammo( "tesla_gun_zm" ); + if ( ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] < time ) + { + ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = time; + } + return; + } + ent_player notify( "replace_weapon_powerup" ); + ent_player._show_solo_hud = 1; + level._zombie_tesla_powerup_last_stand_func = ::tesla_watch_gunner_downed; + ent_player.has_tesla = 1; + ent_player.has_powerup_weapon = 1; + ent_player increment_is_drinking(); + ent_player._zombie_gun_before_tesla = ent_player getcurrentweapon(); + ent_player giveweapon( "tesla_gun_zm" ); + ent_player givemaxammo( "tesla_gun_zm" ); + ent_player switchtoweapon( "tesla_gun_zm" ); + ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] = 1; + level thread tesla_weapon_powerup_countdown( ent_player, "tesla_time_over", time ); + level thread tesla_weapon_powerup_replace( ent_player, "tesla_time_over" ); +} + +tesla_weapon_powerup_countdown( ent_player, str_gun_return_notify, time ) //checked changed to match cerberus output +{ + ent_player endon( "death" ); + ent_player endon( "player_downed" ); + ent_player endon( str_gun_return_notify ); + ent_player endon( "replace_weapon_powerup" ); + setclientsysstate( "levelNotify", "minis", ent_player ); + ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = time; + while ( 1 ) + { + ent_player waittill_any( "weapon_fired", "reload", "zmb_max_ammo" ); + if ( !ent_player getweaponammostock( "tesla_gun_zm" ) ) + { + clip_count = ent_player getweaponammoclip( "tesla_gun_zm" ); + if ( !clip_count ) + { + break; + } + else if ( clip_count == 1 ) + { + ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = 1; + } + else if ( clip_count == 3 ) + { + ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = 6; + } + } + else + { + ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = 11; + } + } + setclientsysstate( "levelNotify", "minie", ent_player ); + level thread tesla_weapon_powerup_remove( ent_player, str_gun_return_notify ); +} + +tesla_weapon_powerup_replace( ent_player, str_gun_return_notify ) //checked matches cerberus output +{ + ent_player endon( "death" ); + ent_player endon( "disconnect" ); + ent_player endon( "player_downed" ); + ent_player endon( str_gun_return_notify ); + ent_player waittill( "replace_weapon_powerup" ); + ent_player takeweapon( "tesla_gun_zm" ); + ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] = 0; + ent_player.has_tesla = 0; + ent_player decrement_is_drinking(); +} + +tesla_weapon_powerup_remove( ent_player, str_gun_return_notify ) //checked changed to match cerberus output +{ + ent_player endon( "death" ); + ent_player endon( "player_downed" ); + ent_player takeweapon( "tesla_gun_zm" ); + ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] = 0; + ent_player._show_solo_hud = 0; + ent_player.has_tesla = 0; + ent_player.has_powerup_weapon = 0; + ent_player notify( str_gun_return_notify ); + ent_player decrement_is_drinking(); + if ( isDefined( ent_player._zombie_gun_before_tesla ) ) + { + player_weapons = ent_player getweaponslistprimaries(); + for ( i = 0; i < player_weapons.size; i++ ) + { + if ( player_weapons[ i ] == ent_player._zombie_gun_before_tesla ) + { + ent_player switchtoweapon( ent_player._zombie_gun_before_tesla ); + return; + } + } + } + primaryweapons = ent_player getweaponslistprimaries(); + if ( primaryweapons.size > 0 ) + { + ent_player switchtoweapon( primaryweapons[ 0 ] ); + } + allweapons = ent_player getweaponslist( 1 ); + for ( i = 0; i < allweapons.size; i++ ) + { + if ( is_melee_weapon( allweapons[ i ] ) ) + { + ent_player switchtoweapon( allweapons[ i ] ); + return; + } + } +} + +tesla_weapon_powerup_off() //checked matches cerberus output +{ + self.zombie_vars[ "zombie_powerup_tesla_time" ] = 0; +} + +tesla_watch_gunner_downed() //checked changed to match cerberus output +{ + if ( isDefined( self.has_tesla ) && !self.has_tesla ) + { + return; + } + primaryweapons = self getweaponslistprimaries(); + for ( i = 0; i < primaryweapons.size; i++ ) + { + if ( primaryweapons[ i ] == "tesla_gun_zm" ) + { + self takeweapon( "tesla_gun_zm" ); + } + } + self notify( "tesla_time_over" ); + self.zombie_vars[ "zombie_powerup_tesla_on" ] = 0; + self._show_solo_hud = 0; + wait 0.05; + self.has_tesla = 0; + self.has_powerup_weapon = 0; +} + +tesla_powerup_active() //checked changed to match cerberus output +{ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[ i ].zombie_vars[ "zombie_powerup_tesla_on" ] ) + { + return 1; + } + } + return 0; +} + +print_powerup_drop( powerup, type ) //devcall only, deleted +{ + /* + /# + if(!isdefined(level.powerup_drop_time)) + { + level.powerup_drop_time = 0; + level.powerup_random_count = 0; + level.powerup_score_count = 0; + } + time = GetTime() - level.powerup_drop_time * 0.001; + level.powerup_drop_time = GetTime(); + if(type == "random") + { + level.powerup_random_count++; + } + else + { + level.powerup_score_count++; + } + println("========== POWER UP DROPPED =========="); + println("DROPPED: " + powerup); + println("HOW IT DROPPED: " + type); + println("--------------------"); + println("Drop Time: " + time); + println("Random Powerup Count: " + level.powerup_random_count); + println("Random Powerup Count: " + level.powerup_score_count); + println("======================================"); + #/ + */ +} + +register_carpenter_node( node, callback ) //checked matches cerberus output +{ + if ( !isDefined( level._additional_carpenter_nodes ) ) + { + level._additional_carpenter_nodes = []; + } + node._post_carpenter_callback = callback; + level._additional_carpenter_nodes[ level._additional_carpenter_nodes.size ] = node; +} + +start_carpenter_new( origin ) //checked partially changed to match cerberus output +{ + level.carpenter_powerup_active = 1; + window_boards = getstructarray( "exterior_goal", "targetname" ); + if ( isDefined( level._additional_carpenter_nodes ) ) + { + window_boards = arraycombine( window_boards, level._additional_carpenter_nodes, 0, 0 ); + } + carp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); + carp_ent playloopsound( "evt_carpenter" ); + boards_near_players = get_near_boards( window_boards ); + boards_far_from_players = get_far_boards( window_boards ); + level repair_far_boards( boards_far_from_players, maps/mp/zombies/_zm_powerups::is_carpenter_boards_upgraded() ); + + i = 0; + while ( i < boards_near_players.size ) + { + window = boards_near_players[ i ]; + num_chunks_checked = 0; + last_repaired_chunk = undefined; + while ( 1 ) + { + if ( all_chunks_intact( window, window.barrier_chunks ) ) + { + break; + } + chunk = get_random_destroyed_chunk( window, window.barrier_chunks ); + if ( !isDefined( chunk ) ) + { + break; + } + window thread maps/mp/zombies/_zm_blockers::replace_chunk( window, chunk, undefined, maps/mp/zombies/_zm_powerups::is_carpenter_boards_upgraded(), 1 ); + last_repaired_chunk = chunk; + if ( isDefined( window.clip ) ) + { + window.clip enable_trigger(); + window.clip disconnectpaths(); + } + else + { + blocker_disconnect_paths( window.neg_start, window.neg_end ); + } + wait_network_frame(); + num_chunks_checked++; + if ( num_chunks_checked >= 20 ) + { + break; + } + } + if ( isDefined( window.zbarrier ) ) + { + if ( isDefined( last_repaired_chunk ) ) + { + while ( window.zbarrier getzbarrierpiecestate( last_repaired_chunk ) == "closing" ) + { + wait 0.05; + } + if ( isDefined( window._post_carpenter_callback ) ) + { + window [[ window._post_carpenter_callback ]](); + } + } + i++; + continue; + } + while ( isDefined( last_repaired_chunk ) && last_repaired_chunk.state == "mid_repair" ) + { + wait 0.05; + } + i++; + } + carp_ent stoploopsound( 1 ); + carp_ent playsoundwithnotify( "evt_carpenter_end", "sound_done" ); + carp_ent waittill( "sound_done" ); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] maps/mp/zombies/_zm_score::player_add_points( "carpenter_powerup", 200 ); + } + carp_ent delete(); + level notify( "carpenter_finished" ); + level.carpenter_powerup_active = undefined; +} + +is_carpenter_boards_upgraded() //checked matches cerberus output +{ + if ( isDefined( level.pers_carpenter_boards_active ) && level.pers_carpenter_boards_active == 1 ) + { + return 1; + } + return 0; +} + +get_near_boards( windows ) //checked changed to match cerberus output +{ + players = get_players(); + boards_near_players = []; + for ( j = 0; j < windows.size; j++ ) + { + close = 0; + for ( i = 0; i < players.size; i++ ) + { + origin = undefined; + if ( isdefined( windows[ j ].zbarrier ) ) + { + origin = windows[ j ].zbarrier.origin; + } + else + { + origin = windows[ j ].origin; + } + if ( distancesquared( players[ i ].origin, origin ) <= level.board_repair_distance_squared ) + { + close = 1; + break; + } + } + if ( close ) + { + boards_near_players[ boards_near_players.size ] = windows[ j ]; + } + } + return boards_near_players; +} + +get_far_boards( windows ) //checked changed to match cerberus output +{ + players = get_players(); + boards_far_from_players = []; + for ( j = 0; j < windows.size; j++ ) + { + close = 0; + for ( i = 0; i < players.size; i++ ) + { + origin = undefined; + if ( isdefined( windows[ j ].zbarrier ) ) + { + origin = windows[ j ].zbarrier.origin; + } + else + { + origin = windows[ j ].origin; + } + if ( distancesquared( players[ i ].origin, origin ) >= level.board_repair_distance_squared ) + { + close = 1; + break; + } + } + if ( close ) + { + boards_far_from_players[ boards_far_from_players.size ] = windows[ j ]; + } + } + return boards_far_from_players; +} + +repair_far_boards( barriers, upgrade ) //checked changed to match cerberus output +{ + i = 0; + while ( i < barriers.size ) + { + barrier = barriers[ i ]; + if ( all_chunks_intact( barrier, barrier.barrier_chunks ) ) + { + i++; + continue; + } + if ( isdefined( barrier.zbarrier ) ) + { + a_pieces = barrier.zbarrier getzbarrierpieceindicesinstate( "open" ); + if ( isdefined( a_pieces ) ) + { + xx = 0; + while ( xx < a_pieces.size ) + { + chunk = a_pieces[ xx ]; + if ( upgrade ) + { + barrier.zbarrier zbarrierpieceuseupgradedmodel( chunk ); + barrier.zbarrier.chunk_health[ chunk ] = barrier.zbarrier getupgradedpiecenumlives( chunk ); + xx++; + continue; + } + barrier.zbarrier zbarrierpieceusedefaultmodel( chunk ); + barrier.zbarrier.chunk_health[ chunk ] = 0; + xx++; + } + } + for ( x = 0; x < barrier.zbarrier getnumzbarrierpieces(); x++ ) + { + barrier.zbarrier setzbarrierpiecestate( x, "closed" ); + barrier.zbarrier showzbarrierpiece( x ); + } + } + else if ( isdefined( barrier.clip ) ) + { + barrier.clip enable_trigger(); + barrier.clip disconnectpaths(); + } + else + { + blocker_disconnect_paths( barrier.neg_start, barrier.neg_end ); + } + if ( i % 4 == 0 ) + { + wait_network_frame(); + } + i++; + } +} + +track_pack_a_punch_drops() +{ + level endon("end_game"); + level.rounds_since_last_pack_a_punch = 0; + for(;;) + { + level waittill("start_of_round"); + level.rounds_since_last_pack_a_punch_drop += 1; + wait 0.5; + } +} + +func_should_drop_pack_a_punch() +{ + 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 ) + { + return 0; + } + return 1; +} + +func_should_never_drop() //checked matches cerberus output +{ + return 0; +} + +func_should_always_drop() //checked matches cerberus output +{ + return 1; +} + +func_should_drop_minigun() +{ + if ( minigun_no_drop() ) + { + return 0; + } + return 1; +} + +func_should_drop_carpenter() +{ + if ( get_num_window_destroyed() < 5 ) + { + return 0; + } + return 1; +} + +func_should_drop_fire_sale() +{ + if ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 1 || level.chest_moves < 1 || isDefined( level.disable_firesale_drop ) && level.disable_firesale_drop ) + { + return 0; + } + return 1; +} + +powerup_move() +{ + self endon( "powerup_timedout" ); + self endon( "powerup_grabbed" ); + drag_speed = 75; + while ( 1 ) + { + self waittill( "move_powerup", moveto, distance ); + drag_vector = moveto - self.origin; + range_squared = lengthsquared( drag_vector ); + if ( range_squared > distance * distance ) + { + drag_vector = vectornormalize( drag_vector ); + drag_vector = distance * drag_vector; + moveto = self.origin + drag_vector; + } + self.origin = moveto; + } +} + +powerup_emp() +{ + self endon( "powerup_timedout" ); + self endon( "powerup_grabbed" ); + if ( !should_watch_for_emp() ) + { + return; + } + while ( 1 ) + { + level waittill( "emp_detonate", origin, radius ); + if ( distancesquared( origin, self.origin ) < ( radius * radius ) ) + { + playfx( level._effect[ "powerup_off" ], self.origin ); + self thread powerup_delete_delayed(); + self notify( "powerup_timedout" ); + } + } +} + +get_powerups( origin, radius ) +{ + if ( isDefined( origin ) && isDefined( radius ) ) + { + powerups = []; + foreach ( powerup in level.active_powerups ) + { + if ( distancesquared( origin, powerup.origin ) < radius * radius ) + { + powerups[ powerups.size ] = powerup; + } + } + return powerups; + } + return level.active_powerups; +} + +should_award_stat( powerup_name ) +{ + if ( powerup_name == "teller_withdrawl" || powerup_name == "blue_monkey" || powerup_name == "free_perk" || powerup_name == "bonus_points_player" ) + { + return 0; + } + if ( isDefined( level.statless_powerups ) && isDefined( level.statless_powerups[ powerup_name ] ) ) + { + return 0; + } + return 1; +} + +teller_withdrawl( powerup, player ) +{ + player maps/mp/zombies/_zm_score::add_to_player_score( powerup.value ); +} + +zombies_always_drop_powerups() +{ + if ( !level.zombiesAlwaysDropPowerups ) + { + return; + } + while ( 1 ) + { + level.zombie_vars[ "zombie_drop_item" ] = level.zombiesAlwaysDropPowerups; + wait 0.05; + } +} + +doFastFeet() +{ + level endon("end_game"); + self endon( "disconnect" ); + self thread poweruptext("Fast Feet!"); + self playsound("zmb_cha_ching"); + self setmovespeedscale(3); + wait 15; + self setmovespeedscale(1); + self playsound("zmb_insta_kill"); +} + +doUnlimitedAmmo() +{ + level endon("end_game"); + foreach(player in level.players) + { + player notify("end_unlimited_ammo"); + player playsound("zmb_cha_ching"); + player thread poweruptext("Bottomless Clip"); + player thread monitorUnlimitedAmmo(); + player thread notifyUnlimitedAmmoEnd(); + } +} + +monitorUnlimitedAmmo() +{ + level endon("end_game"); + self endon("disonnect"); + self endon("end_unlimited_ammo"); + for(;;) + { + self setWeaponAmmoClip(self GetCurrentWeapon(), 150); + wait .05; + } +} + +notifyUnlimitedAmmoEnd() +{ + level endon("end_game"); + self endon("disonnect"); + self endon("end_unlimited_ammo"); + wait level.unlimited_ammo_duration; + self playsound("zmb_insta_kill"); + self notify("end_unlimited_ammo"); +} + +doPackAPunchWeapon() +{ + baseweapon = get_base_name(self getcurrentweapon()); + weapon = get_upgrade(baseweapon); + if(IsDefined(weapon) && isDefined(self.packapunching)) + { + level.rounds_since_last_pack_a_punch_drop = 0; + self.packapunching = undefined; + self takeweapon(baseweapon); + self giveweapon(weapon, 0, self get_pack_a_punch_weapon_options(weapon)); + self switchtoweapon(weapon); + self givemaxammo(weapon); + } + else + self playsoundtoplayer( level.zmb_laugh_alias, self ); +} + +get_upgrade(weapon) +{ + if(IsDefined(level.zombie_weapons[weapon].upgrade_name) && IsDefined(level.zombie_weapons[weapon])) + { + self.packapunching = true; + return get_upgrade_weapon(weapon, 0 ); + } + else + return get_upgrade_weapon(weapon, 1 ); +} + +doRandomScore() +{ + x = randomInt(9); + self playsound("zmb_cha_ching"); + if(x==1) + self.score += 50; + else if(x==2) + self.score += 100; + else if(x==3) + self.score += 250; + else if(x==4) + self.score += 500; + else if(x==5) + self.score += 750; + else if(x==6) + self.score += 1000; + else if(x==7) + self.score += 2500; + else if(x==8) + self.score += 5000; + else if(x==9) + self.score += 7500; + else + self.score += 10000; +} + +poweruptext(text) +{ + self endon("disconnect"); + level endon("end_game"); + hud_string = newclienthudelem(self); + hud_string.elemtype = "font"; + hud_string.font = "objective"; + hud_string.fontscale = 2; + hud_string.x = 0; + hud_string.y = 0; + hud_string.width = 0; + hud_string.height = int( level.fontheight * 2 ); + hud_string.xoffset = 0; + hud_string.yoffset = 0; + hud_string.children = []; + hud_string setparent(level.uiparent); + hud_string.hidden = 0; + 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)); + hud_string.sort = .5; + hud_string.alpha = 0; + hud_string fadeovertime(.5); + hud_string.alpha = 1; + hud_string setText(text); + hud_string thread poweruptextmove(); +} + +poweruptextmove() +{ + wait .5; + self fadeovertime(1.5); + self moveovertime(1.5); + self.y = 270; + self.alpha = 0; + wait 1.5; + self destroy(); +} diff --git a/Zombies Mods/Zombies++/v1.2/dedicated_zm.cfg b/Zombies Mods/Zombies++/v1.2/dedicated_zm.cfg new file mode 100644 index 0000000..6eacfa3 --- /dev/null +++ b/Zombies Mods/Zombies++/v1.2/dedicated_zm.cfg @@ -0,0 +1,249 @@ +////////////////////////////////////////////////// +/// PlutoT6 ZM ServerConfiguration file // +////////////////////////////////////////////////// +// This config best view with Notepad++ OR // +// Other *nix compatible editors of your choice.// +////////////////////////////////////////////////// +// 0.1 Basic version // +// 0.2 Added map list and map rotation // +// 0.3 Added Colors and B3/Log/RCon section // +// 0.4 Added gametype to map list and rotation // +// 0.5 Added location to map list and rotation // +// 0.6 Added Sharp Shooter and Gun game // +// 0.7 Clean up // +// 0.8 Additional gts -Fry // +// 0.9 Cleaned up the mess Fry merged, // +// added more comments // +////////////////////////////////////////////////// +// SERVER NAME & COLORS TIPS // +////////////////////////////////////////////////// +// ^0 Black // +// ^1 Red // +// ^2 Green // +// ^3 Yellow // +// ^4 Blue // +// ^5 Cyan // +// ^6 Pink // +// ^7 White // +////////////////////////////////////////////////// + +sv_hostname "^5ZOMBIES++ ^3[Dev:@ItsCahz]" //Give your server a name so you can spot it on the serverlist. + +////////////////////////////////////////////////// +// GENERAL SETTINGS // +////////////////////////////////////////////////// +sv_offline "0" // Enables the offline mode. 1 = offline, 0 = online useful for LANs or in the case we get shut down. +//g_password "" // Password protected Game Server +party_maxplayers "4" // Maximum players that are allowed in your server (1-8) +//sv_minPing "0" // Minimum ping neede to the server? (Terribly broken and inaccurate since ages!) +//sv_maxPing "400" // Maximum ping allowed to the server? (Terribly broken and inaccurate since ages!) +//zm_gungame "1" // Enable Pluto's custom Gun Game? +//zm_sharpshooter "1" // Enable Pluto's custom Sharp Shooter? +gts zmDifficulty "1" // Difficulty? 0 = Easy, 1 = Normal +gts startRound "1" // Starting Round. Only Survival and Grief have this option! +//gts autoTeamBalance "1" // Auto team balancing +//gts teamCount "2" // Turn this on for grief only! +//gts magic "0" // Remove all supernatural assistance? Only Survival and Grief have this option! +//gts headshotsonly "1" // Headshots only? Only Survival and Grief have this option! +//gts allowdogs "1" // Allow Hellhounds? Only Survival has this option! +//gts cleansedLoadout "1" // Allow players to choose their Loadout? Only Turned has this option! +//set g_loadScripts "0" + +//Welcome to Zombies++! you can enable or disable all functions in this file! +//almost no need to edit the GSC +//Developed by @ItsCahz +//huge credits to _Ox and JezuzLizard! without their releases, this wouldn't be possible! +//Zombies++ is not meant to be an "over the top" modded experience +//I wanted this to be an addition to the vanilla zombies +//credit to JezuzLizard! huge thanks for the server config base! +//game options +set playerStartingPoints 500 //staring points +set perkLimit 9 //perk limit *NOTE CUSTOM PERKS COUNT TOWARDS THE PERK LIMIT! EXCEPT PHD FLOPPER +set zombieAiLimit 24 //32 = hard mode fuck yes +set zombieActorLimit 32 //32 zombies tryna eat ur face haha get fuckd +set midroundDogs 0 //mid round puppers +set noEndGameCheck 0 //noendgamecheck +set soloLaststandWeapon "m1911_upgraded_zm" //Solo last stand weapon (so like if ur reviving urself with quick revive typ shit) +set coopLaststandWeapon "m1911_zm" //last stand weapon is in co-op +set startWeaponZm "m1911_zm" //weapon player starts with +set disableWalkers 0 //make all zombies runners (theyre fast af boi) +set roundNumber 1 //round number to start on +set soloModeDisabled 1 //disable solo mode - fixes quick revive price and Mob of the Dead Afterlife count to 1 instead of 3 +//main Zombies++ options +set enableZombieCounter 1 //enable or disable on screen zombie counter +set customMysteryBoxPriceEnabled 0 //override mystery box price +set customMysteryBoxPrice 10 //custom mystery box price +set disableAllCustomPerks 0 //override any enabled custom perks and disable all +set zmPowerupsNoPowerupDrops 0 //override powerup drops +//Zombies++ options + +//custom perk machines +set enablePHDFlopper 1 //enable custom phdflopper perk machine on maps (Nuketown, Tranzit, Buried, MOTD, Die Rise) +set enableStaminUp 1 //enable custom staminup perk machine on maps (Nuketown, Tranzit, MOTD, Die Rise) +set enableDeadshot 1 //enable custom deadshot perk machine on maps (Nuketown, Tranzit, Buried, Die Rise) +set enableMuleKick 1 //enable custom mulekick perk machine on maps (Nuketown, Tranzit) + +//custom powerup drops +set zmPowerupsMoneyDropEnabled 1 +set zmPowerupsPackAPunchEnabled 0 +set zmPowerupsUnlimitedAmmoEnabled 1 +set zmPowerupsFastFeetEnabled 1 + +//powerups properties +set maxPowerupsPerRound 4 //max number of powerups in any 1 round +set powerupDropRate 6000 //drop rate for powerups (lower is faster) 2000 is default(?) but that feels too easy +set zombiesAlwaysDropPowerups 0 //zombies always drop powerups (will stop dropping after max limit is hit) +set fourPlayerPowerupScore 50 //powerup score per kill with 4 players +set threePlayerPowerupScore 50 //powerup score per kill with 3 players +set twoPlayerPowerupScore 50 //powerup score per kill with 2 players +set onePlayerPowerupScore 50 //powerup score per kill with 1 player +set powerupScoreMeleeKill 80 //powerup score per melee kill +set powerupScoreHeadshotKill 50 //powerup score per headshot kill +set powerupScoreNeckKill 20 //powerup score per neck kill +set powerupScoreTorsoKill 10 //powerup score per torso kill + +//enable or disable powerups +set zmPowerupsNukeEnabled 1 //enable nuke powerup +set zmPowerupsInstaKillEnabled 1 //enable insta kill powerup +set zmPowerupsMaxAmmoEnabled 1 //enable max ammo powerup +set zmPowerupsDoublePointsEnabled 1 //enable double points powerup +set zmPowerupsCarpenterEnabled 1 //enable carpenter powerup +set zmPowerupsFireSaleEnabled 1 //enable fire sale powerup +set zmPowerupsPerkBottleEnabled 1 //enable perk bottle powerup +set zmPowerupsZombieBloodEnabled 1 //enable zombie blood powerup + +//zombie properties dvars +set overrideZombieTotalPermanently 0 +set overrideZombieTotalPermanentlyValue 100 +set overrideZombieHealthPermanently 0 +set overrideZombieHealthPermanentlyValue 150 +set overrideZombieMaxHealth 0 +set overrideZombieMaxHealthValue 150 +set zombieSpawnRate 1.75 //2 is default 1.75 feels slightly nicer +set zombieSpawnRateMultiplier 0.95 +set zombieSpawnRateLocked 0 +set zombiesPerPlayer 6 +set zombieHealthIncreaseFlat 100 +set zombieHealthIncreaseMultiplier 0.1 +set zombieHealthStart 150 +set zombieNewRunnerInterval 10 +set zombieMoveSpeed 10 +set zombieMoveSpeedLocked 1 +set zombieMoveSpeedCap 0 +set zombieMoveSpeedCapValue 1 +set zombieMoveSpeedMultiplier 10 +set zombieMoveSpeedMultiplierEasy 8 +set zombieMaxAi 24 +set belowWorldCheck -1000 + +//round properties +set customSpectatorsRespawn 1 +set zombieIntermissionTime 10 +set zombieBetweenRoundTime 15 +set roundStartDelay 0 + +//player properties +set bleedoutPointsLostAllPlayers 0.1 +set bleedoutPointsLostSelf 0.1 +set downedPointsLostSelf 0.05 +set playerStartingLives 1 +set fourPlayerScorePerZombieKill 50 +set threePlayerScorePerZombieKill 50 +set twoPlayerScorePerZombieKill 50 +set onePlayerScorePerZombieKill 50 +set pointsPerNormalAttack 10 +set pointsPerLightAttack 10 +set shouldZombifyPlayer 0 +set alliesPointsMultiplier 1 +set axisPointsMultiplier 1 + +//perk properties +set empPerkExplosionRadius 420 +set empPerkOffDuration 90 +set riotshieldHitPoints 2250 +set juggHealthBonus 160 +set permaJuggHealthBonus 190 +set minPhdExplosionDamage 1000 +set maxPhdExplosionDamage 5000 +set phdDamageRadius 300 + +//builtin dvars +//sets whether the mystery box moves ever +set magic_chest_movable 1 +//sets how close players have to be to revive another player +set revive_trigger_radius 75 +//sets the amount time before a player will bleedout after going down +set player_lastStandBleedoutTime 90 +//sets speed colas reload multiplier lower is better WARNING: animation doesn't sync +set perk_weapReloadMultiplier 0.5 +//sets double taps firing speed multiplier lower is better +set perk_weapRateMultiplier 0.75 +//sets deadshot crosshair size multiplier lower is better +set perk_weapSpreadMultiplier 0.70 +////////////////////////////////////////////////// +////////////////////////////////////////////////// +// B3, GAME LOG & RCON SETTINGS // +////////////////////////////////////////////////// +g_logSync 2 // 0 only flush on game end, 1 flush when buffer full, 2 always flush after a write, 3 append to old logs. +g_log "" // Disable logs per default. +g_log "logs\games_zm.log" // If you choose to use this make sure the filename is unique for each server! +rcon_password "" // RemoteCONtrol password, needed for most management tools. +////////////////////////////////////////////////// +////////////////////////////////////////////////// +// MAP LIST WITH ALL GAME MODES AND LOCATIONS // +////////////////////////////////////////////////// +// At the moment only the first game mode of // +// each map works on dedicated servers (31/3/18)// +////////////////////////////////////////////////// +// Buried aka Resolution 1295 // +////////////////////////////////////////////////// +//gametype zclassic loc processing map zm_buried// +////////////////////////////////////////////////// +// Die Rise aka Great Leap Forward // +////////////////////////////////////////////////// +//gametype zclassic loc rooftop map zm_highrise// +////////////////////////////////////////////////// +// Nuketown // +////////////////////////////////////////////////// +//gametype zstandard loc nuked map zm_nuked // +////////////////////////////////////////////////// +// Mob of the Dead // +////////////////////////////////////////////////// +//gametype zclassic loc prison map zm_prison// +////////////////////////////////////////////////// +// Origins // +//Make sure you don't allow more than 4 players!// +////////////////////////////////////////////////// +//gametype zclassic loc tomb map zm_tomb // +////////////////////////////////////////////////// +// Diner (Turned only) // +////////////////////////////////////////////////// +//gametype zcleansed loc diner map zm_transit_dr// +////////////////////////////////////////////////// +// Green Run aka Bus Depot aka Farm aka Town // +////////////////////////////////////////////////// +//gametype zclassic loc transit map zm_transit // +////////////////////////////////////////////////// +//g_gametype zgrief +////////////////////////////////////////////////////////////////////////////////////// +//Unlike in other games/MP you should always define the game type and location. // +////////////////////////////////////////////////////////////////////////////////////// +//Die Rise +sv_maprotation "gametype zclassic loc rooftop map zm_highrise" + +//Buried +//sv_maprotation "gametype zclassic loc processing map zm_buried" + +//Alcatraz +//sv_maprotation "gametype zclassic loc prison map zm_prison" + +//Tranzit +//sv_maprotation "gametype zclassic loc transit map zm_transit" + +//Origins +//sv_maprotation "gametype zclassic loc tomb map zm_tomb" + +//Nuketown +//sv_maprotation "gametype zstandard loc nuked map zm_nuked" + +map_rotate \ No newline at end of file diff --git a/Zombies Mods/Zombies++/v1.3/Precompiled/maps/mp/gametypes_zm/_clientids.gsc b/Zombies Mods/Zombies++/v1.3/Precompiled/maps/mp/gametypes_zm/_clientids.gsc new file mode 100644 index 0000000000000000000000000000000000000000..cd824683a337790b3268cb3d6917885636ad9dd4 GIT binary patch literal 38126 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 E2T~BzPyhe` literal 0 HcmV?d00001 diff --git a/Zombies Mods/Zombies++/v1.3/README.md b/Zombies Mods/Zombies++/v1.3/README.md new file mode 100644 index 0000000..95f3e90 --- /dev/null +++ b/Zombies Mods/Zombies++/v1.3/README.md @@ -0,0 +1,12 @@ +# ZOMBIES++ +If you want to just run the mod, use the precompiled version of the files to save time. If you want to change anything about Z++, you need to edit the open source code. +## DIRECTIONS +###### PRECOMPILED +- Take the **maps** folder containing the precompiled files and directories and place it in your **/t6r/data** folder +- You can now load Custom Games or a dedicated server to play Z++ +###### EDITING SOURCE CODE +- Compile _**_clientids.gsc**_ as _**_clientids.gsc**_ and place it in the directory _**/t6r/data/maps/mp/gametypes_zm/_clientids.gsc**_ +###### UPDATES V1.3 +- _**_clientids.gsc**_ now holds all functions for Z++ as a Plutonium update broke the other files +- Disabled Staminup on MOTD to prevent crashes with the afterlife system +- Disabled Staminup & Deadshot on Die Rise to prevent crashes with Who's Who diff --git a/Zombies Mods/Zombies++/v1.3/Source Code/_clientids.gsc b/Zombies Mods/Zombies++/v1.3/Source Code/_clientids.gsc new file mode 100644 index 0000000..fdff021 --- /dev/null +++ b/Zombies Mods/Zombies++/v1.3/Source Code/_clientids.gsc @@ -0,0 +1,1591 @@ +#include maps/mp/_utility; +#include common_scripts/utility; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/zombies/_zm; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/gametypes_zm/_hud_message; +#include maps/mp/zombies/_zm_powerups; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_chugabud; + +init() +{ + startInit(); //precaching models + level thread onPlayerConnect(); //on connect + thread initServerDvars(); //initilize server dvars (credit JezuzLizard) + thread startCustomPerkMachines(); //custom perk machines + level.afterlife_give_loadout = maps/mp/gametypes_zm/_clientids::give_afterlife_loadout; //override function that gives loadout back to the player. + level.playerDamageStub = level.callbackplayerdamage; //damage callback for phd flopper + level.callbackplayerdamage = ::phd_flopper_dmg_check; //more damage callback stuff. everybody do the flop + //level.using_solo_revive = 0; //disables solo revive, fixing only 3 revives per game. + //level.is_forever_solo_game = 0; //changes afterlives on motd from 3 to 1 + isTown(); //jezuzlizard's fix for tombstone :) +} + +onPlayerConnect() +{ + level endon( "end_game" ); + self endon( "disconnect" ); + for (;;) + { + level waittill( "connected", player ); + + player thread [[level.givecustomcharacters]](); + player thread startCustomPowerups(); + player thread doPHDdive(); + player thread onPlayerDowned(); + player thread onPlayerRevived(); + player thread spawnIfRoundOne(); //force spawns if round 1. no more spectating one player on round 1 + } +} + +startCustomPerkMachines() +{ + if(level.disableAllCustomPerks == 0) + { + if(getDvar("mapname") == "zm_prison") //mob of the dead + { + if(level.enablePHDFlopper == 1) + level 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) ); + //if(level.enableStaminUp == 1) + //level 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) ); + } + else if(getDvar("mapname") == "zm_highrise") //die rise + { + if(level.enablePHDFlopper == 1) + level 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) ); + //if(level.enableDeadshot == 1) + //level thread CustomPerkMachine( "zombie_perk_bottle_whoswho", "zombie_vending_revive", "Deadshot Daiquiri", 1500, (3690.54, 1932.36, 1420), "specialty_deadshot", (-15, 0, 0) ); + //if(level.enableStaminUp == 1) + //level thread CustomPerkMachine( "zombie_perk_bottle_revive", "zombie_vending_doubletap2", "Stamin-Up", 2000, (1704, -35, 1120.13), "specialty_longersprint", (0, -30, 0) ); + } + else if(getDvar("mapname") == "zm_buried") //buried + { + if(level.enablePHDFlopper == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_marathon", "zombie_vending_jugg", "PHD Flopper", 3000, (2631.73, 304.165, 240.125), "PHD_FLOPPER", (5, 0, 0) ); + if(level.enableDeadshot == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_marathon", "zombie_vending_revive", "Deadshot Daiquiri", 1500, (1055.18, -1055.55, 201), "specialty_deadshot", (3, 270, 0) ); + } + else if(getDvar("mapname") == "zm_nuked") //nuketown + { + if(level.enablePHDFlopper == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_revive", "zombie_vending_jugg", "PHD Flopper", 3000, (683, 727, -56), "PHD_FLOPPER", (5, 250, 0) ); + if(level.enableDeadshot == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_jugg", "zombie_vending_revive", "Deadshot Daiquiri", 1500, (747, 356, 91), "specialty_deadshot", (0, 330, 0) ); + if(level.enableStaminUp == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_revive", "zombie_vending_doubletap2", "Stamin-Up", 2000, (-638, 268, -54), "specialty_longersprint", (0, 165, 0) ); + if(level.enableMuleKick == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_jugg", "zombie_vending_sleight", "Mule Kick", 3000, (-953, 715, 83), "specialty_additionalprimaryweapon", (0, 75, 0) ); + } + else if(getDvar("mapname") == "zm_transit") //transit + { + if(level.enablePHDFlopper == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_revive", "zombie_vending_jugg", "PHD Flopper", 3000, (-6304, 5430, -55), "PHD_FLOPPER", (0, 90, 0) ); + if(level.enableDeadshot == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_jugg", "zombie_vending_revive", "Deadshot Daiquiri", 1500, (-6088, -7419, 0), "specialty_deadshot", (0, 90, 0) ); + if(level.enableMuleKick == 1) + level thread CustomPerkMachine( "zombie_perk_bottle_jugg", "zombie_vending_sleight", "Mule Kick", 3000, (1149, -215, -304), "specialty_additionalprimaryweapon", (0, 180, 0) ); + } + } +} + +onPlayerDowned() +{ + self endon("disconnect"); + level endon("end_game"); + + for(;;) + { + self waittill_any( "player_downed", "fake_death", "entering_last_stand"); + self unsetperk( "specialty_additionalprimaryweapon" ); //removes the mulekick perk functionality + self unsetperk( "specialty_longersprint" ); //removes the staminup perk functionality + self unsetperk( "specialty_deadshot" ); //removes the deadshot perk functionality + self.hasPHD = undefined; //resets the flopper variable + self.hasMuleKick = undefined; //resets the mule kick variable + self.hasStaminUp = undefined; //resets the staminup variable + self.hasDeadshot = undefined; //resets the deadshot variable + self.icon1 Destroy();self.icon1 = undefined; //deletes the perk icons and resets the variable + self.icon2 Destroy();self.icon2 = undefined; //deletes the perk icons and resets the variable + self.icon3 Destroy();self.icon3 = undefined; //deletes the perk icons and resets the variable + self.icon4 Destroy();self.icon4 = undefined; //deletes the perk icons and resets the variable + } +} + +doPHDdive() //credit to extinct. just edited to add self.hasPHD variable +{ + self endon("disconnect"); + level endon("end_game"); + + for(;;) + { + if(isDefined(self.divetoprone) && self.divetoprone) + { + if(self isOnGround() && isDefined(self.hasPHD)) + { + if(level.script == "zm_tomb" || level.script == "zm_buried") + explosionfx = level._effect["divetonuke_groundhit"]; + else + explosionfx = loadfx("explosions/fx_default_explosion"); + self playSound("zmb_phdflop_explo"); + playfx(explosionfx, self.origin); + self damageZombiesInRange(310, self, "kill"); + wait .3; + } + } + wait .05; + } +} + +damageZombiesInRange(range, what, amount) //damage zombies for phd flopper +{ + enemy = getAiArray(level.zombie_team); + foreach(zombie in enemy) + { + if(distance(zombie.origin, what.origin) < range) + { + if(amount == "kill") + zombie doDamage(zombie.health * 2, zombie.origin, self); + else + zombie doDamage(amount, zombie.origin, self); + } + } +} + +phd_flopper_dmg_check( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) //phdflopdmgchecker lmao +{ + if ( smeansofdeath == "MOD_SUICIDE" || smeansofdeath == "MOD_FALLING" || smeansofdeath == "MOD_PROJECTILE" || smeansofdeath == "MOD_PROJECTILE_SPLASH" || smeansofdeath == "MOD_GRENADE" || smeansofdeath == "MOD_GRENADE_SPLASH" || smeansofdeath == "MOD_EXPLOSIVE" ) + { + if(isDefined(self.hasPHD)) //if player has phd flopper, dont damage the player + return; + } + [[ level.playerDamageStub ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ); +} + +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 +{ + level endon( "end_game" ); + if(!isDefined(level.customPerkNum)) + level.customPerkNum = 1; + else + level.customPerkNum += 1; + collision = spawn("script_model", origin); + collision setModel("collision_geo_cylinder_32x128_standard"); + collision rotateTo(angles, .1); + RPerks = spawn( "script_model", origin ); + RPerks setModel( model ); + RPerks rotateTo(angles, .1); + level thread LowerMessage( "Custom Perks", "Hold ^3F ^7for "+perkname+" [Cost: "+cost+"]" ); + trig = spawn("trigger_radius", origin, 1, 25, 25); + trig SetCursorHint( "HINT_NOICON" ); + trig setLowerMessage( trig, "Custom Perks" ); + for(;;) + { + trig waittill("trigger", player); + if(player useButtonPressed() && player.score >= cost) + { + wait .25; + if(player useButtonPressed()) + { + if(perk != "PHD_FLOPPER" && !player hasPerk(perk) || perk == "PHD_FLOPPER" && !isDefined(player.hasPHD)) + { + player playsound( "zmb_cha_ching" ); //money shot + player.score -= cost; //take points + level.trig hide(); + player thread GivePerk( bottle, perk, perkname ); //give perk + wait 2; + level.trig show(); + } + else + player iprintln("You Already Have "+perkname+"!"); + } + } + } +} + +GivePerk( model, perk, perkname ) +{ + self DisableOffhandWeapons(); + self DisableWeaponCycling(); + weaponA = self getCurrentWeapon(); + weaponB = model; + self GiveWeapon( weaponB ); + self SwitchToWeapon( weaponB ); + self waittill( "weapon_change_complete" ); + self EnableOffhandWeapons(); + self EnableWeaponCycling(); + self TakeWeapon( weaponB ); + self SwitchToWeapon( weaponA ); + self setperk( perk ); + self maps/mp/zombies/_zm_audio::playerexert( "burp" ); + self setblur( 4, 0.1 ); + wait 0.1; + self setblur( 0, 0.1 ); + if(perk == "PHD_FLOPPER") + { + self.hasPHD = true; + self thread drawCustomPerkHUD("specialty_doubletap_zombies", 0, (1, 0.25, 1)); + } + else if(perk == "specialty_additionalprimaryweapon") + { + self.hasMuleKick = true; + self thread drawCustomPerkHUD("specialty_fastreload_zombies", 0, (0, 0.7, 0)); + } + else if(perk == "specialty_longersprint") + { + self.hasStaminUp = true; + self thread drawCustomPerkHUD("specialty_juggernaut_zombies", 0, (1, 1, 0)); + } + else if(perk == "specialty_deadshot") + { + self.hasDeadshot = true; + self thread drawCustomPerkHUD("specialty_quickrevive_zombies", 0, (0.125, 0.125, 0.125)); + } +} + +LowerMessage( ref, text ) +{ + if( !IsDefined( level.zombie_hints ) ) + level.zombie_hints = []; + PrecacheString( text ); + level.zombie_hints[ref] = text; +} + +setLowerMessage( ent, default_ref ) +{ + if( IsDefined( ent.script_hint ) ) + self SetHintString( get_zombie_hint( ent.script_hint ) ); + else + self SetHintString( get_zombie_hint( default_ref ) ); +} + +drawshader( shader, x, y, width, height, color, alpha, sort ) +{ + hud = newclienthudelem( self ); + hud.elemtype = "icon"; + hud.color = color; + hud.alpha = alpha; + hud.sort = sort; + hud.children = []; + hud setparent( level.uiparent ); + hud setshader( shader, width, height ); + hud.x = x; + hud.y = y; + return hud; +} + +drawCustomPerkHUD(perk, x, color, perkname) //perk hud thinking or whatever. probably not the best method but whatever lol +{ + if(!isDefined(self.icon1)) + { + x = -408; + if(getDvar("mapname") == "zm_buried") + self.icon1 = self drawshader( perk, x, 293, 24, 25, color, 100, 0 ); + else + self.icon1 = self drawshader( perk, x, 320, 24, 25, color, 100, 0 ); + } + else if(!isDefined(self.icon2)) + { + x = -378; + if(getDvar("mapname") == "zm_buried") + self.icon2 = self drawshader( perk, x, 293, 24, 25, color, 100, 0 ); + else + self.icon2 = self drawshader( perk, x, 320, 24, 25, color, 100, 0 ); + } + else if(!isDefined(self.icon3)) + { + x = -348; + if(getDvar("mapname") == "zm_buried") + self.icon3 = self drawshader( perk, x, 293, 24, 25, color, 100, 0 ); + else + self.icon3 = self drawshader( perk, x, 320, 24, 25, color, 100, 0 ); + } + else if(!isDefined(self.icon4)) + { + x = -318; + if(getDvar("mapname") == "zm_buried") + self.icon4 = self drawshader( perk, x, 293, 24, 25, color, 100, 0 ); + else + self.icon4 = self drawshader( perk, x, 320, 24, 25, color, 100, 0 ); + } +} + +LowerMessage( ref, text ) +{ + if( !IsDefined( level.zombie_hints ) ) + level.zombie_hints = []; + PrecacheString( text ); + level.zombie_hints[ref] = text; +} + +setLowerMessage( ent, default_ref ) +{ + if( IsDefined( ent.script_hint ) ) + self SetHintString( get_zombie_hint( ent.script_hint ) ); + else + self SetHintString( get_zombie_hint( default_ref ) ); +} + +startInit() +{ + PrecacheModel("collision_geo_cylinder_32x128_standard"); + PrecacheModel("zombie_vending_jugg"); + PrecacheModel("zombie_perk_bottle_marathon"); + PrecacheModel("zombie_perk_bottle_whoswho"); + PrecacheModel("zombie_vending_nuke_on_lo"); + PrecacheModel("p6_zm_al_vending_pap_on"); + PrecacheModel("p6_anim_zm_buildable_pap"); + PrecacheModel("p6_zm_al_vending_pap_on"); + PrecacheModel("p6_zm_al_vending_jugg_on"); + PrecacheModel("p6_zm_al_vending_sleight_on"); + PrecacheModel("p6_zm_al_vending_doubletap2_on"); + PrecacheModel("p6_zm_al_vending_ads_on"); + PrecacheModel("p6_zm_al_vending_nuke_on"); + PrecacheModel("p6_zm_al_vending_three_gun_on"); + PrecacheModel("zombie_vending_revive"); + PrecacheModel("zombie_vending_doubletap2"); + PrecacheModel("zombie_x2_icon"); + PrecacheModel("zombie_bomb"); + PrecacheModel("zombie_ammocan"); + PrecacheModel("zombie_x2_icon"); + PrecacheModel("zombie_skull"); + PrecacheShader("specialty_deadshot_zombies"); + if(isDefined(level.player_out_of_playable_area_monitor)) + level.player_out_of_playable_area_monitor = false; + level.pers_sniper_misses = 9999; //sniper perma perk! never lose it hahahahahahahahaha + thread gscRestart(); //JezuzLizard fix sound stuff + thread setPlayersToSpectator(); //JezuzLizard fix sound stuff +} + +initServerDvars() //credits to JezuzLizard!!! This is a huge help in making this happen +{ + level.player_starting_points = getDvarIntDefault( "playerStartingPoints", 500 ); + //sets the perk limit for all players + level.perk_purchase_limit = getDvarIntDefault( "perkLimit", 4 ); + //sets the maximum number of zombies that can be on the map at once 32 max + level.zombie_ai_limit = getDvarIntDefault( "zombieAiLimit", 24 ); + //sets the number of zombie bodies that can be on the map at once + level.zombie_actor_limit = getDvarIntDefault( "zombieActorLimit", 32 ); + //enables midround hellhounds WARNING: causes permanent round pauses on maps that aren't bus depot, town or farm + level.mixed_rounds_enabled = getDvarIntDefault( "midroundDogs", 0 ); + //disables the end game check WARNING: make sure to include a spectator respawner and auto revive function + level.no_end_game_check = getDvarIntDefault( "noEndGameCheck", 0 ); + //sets the solo laststand pistol + level.default_solo_laststandpistol = getDvar( "soloLaststandWeapon" ); + //the default laststand pistol + level.default_laststandpistol = getDvar( "coopLaststandWeapon" ); + //set the starting weapon + level.start_weapon = getDvar( "startWeaponZm" ); + //sets all zombies to this speed lower values result in walkers higher values sprinters + level.zombie_move_speed = getDvarIntDefault( "zombieMoveSpeed", 1 ); + //locks the zombie movespeed to the above value + level.zombieMoveSpeedLocked = getDvarIntDefault( "zombieMoveSpeedLocked", 0 ); + //sets whether there is a cap to the zombie movespeed active + level.zombieMoveSpeedCap = getDvarIntDefault( "zombieMoveSpeedCap", 0 ); + //sets the value to the zombie movespeed cap + level.zombieMoveSpeedCapValue = getDvarIntDefault( "zombieMoveSpeedCapValue", 1 ); + //sets the round number any value between 1-255 + level.round_number = getDvarIntDefault( "roundNumber", 1 ); + //enables the override for zombies per round + level.overrideZombieTotalPermanently = getDvarIntDefault( "overrideZombieTotalPermanently", 0 ); + //sets the number of zombies per round to the value indicated + level.overrideZombieTotalPermanentlyValue = getDvarIntDefault( "overrideZombieTotalPermanentlyValue", 6 ); + //enables the override for zombie health + level.overrideZombieHealthPermanently = getDvarIntDefault( "overrideZombieHealthPermanently", 0 ); + //sets the health of zombies every round to the value indicated + level.overrideZombieHealthPermanentlyValue = getDvarIntDefault( "overrideZombieHealthPermanentlyValue", 150 ); + //enables the health cap override so zombies health won't grow beyond the value indicated + level.overrideZombieMaxHealth = getDvarIntDefault( "overrideZombieMaxHealth", 0 ); + //sets the maximum health zombie health will increase to + level.overrideZombieMaxHealthValue = getDvarIntDefault( "overrideZombieMaxHealthValue" , 150 ); + + //disables walkers + level.disableWalkers = getDvarIntDefault( "disableWalkers", 0 ); + if ( level.disableWalkers ) + { + level.speed_change_round = undefined; + } + //set afterlives on mob to 1 like a normal coop match and sets the prices of doors on origins to be higher + level.disableSoloMode = getDvarIntDefault( "disableSoloMode", 0 ); + if ( level.disableSoloMode ) + { + level.is_forever_solo_game = undefined; + } + //disables all drops + level.zmPowerupsNoPowerupDrops = getDvarIntDefault( "zmPowerupsNoPowerupDrops", 0 ); + + //Zombie_Vars: + //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 + //sets the maximum number of drops per round + level.maxPowerupsPerRound = getDvarIntDefault( "maxPowerupsPerRound", 4 ); + level.zombie_vars["zombie_powerup_drop_max_per_round"] = level.maxPowerupsPerRound; + //sets the powerup drop rate lower is better + level.powerupDropRate = getDvarIntDefault( "powerupDropRate", 2000 ); + level.zombie_vars["zombie_powerup_drop_increment"] = level.powerupDropRate; + //makes every zombie drop a powerup + level.zombiesAlwaysDropPowerups = getDvarIntDefault( "zombiesAlwaysDropPowerups", 0 ); + level.zombie_vars[ "zombie_drop_item" ] = level.zombiesAlwaysDropPowerups; + //increase these below vars to increase drop rate + //points to the powerup increment to a powerup drop related to level.zombie_vars["zombie_powerup_drop_increment"] + level.fourPlayerPowerupScore = getDvarIntDefault( "fourPlayerPowerupScore", 50 ); + level.zombie_vars[ "zombie_score_kill_4p_team" ] = level.fourPlayerPowerupScore; + //points to the powerup increment to a powerup drop related to level.zombie_vars["zombie_powerup_drop_increment"] + level.threePlayerPowerupScore = getDvarIntDefault( "threePlayerPowerupScore", 50 ); + level.zombie_vars[ "zombie_score_kill_3p_team" ] = level.threePlayerPowerupScore; + //points to the powerup increment to a powerup drop related to level.zombie_vars["zombie_powerup_drop_increment"] + level.twoPlayerPowerupScore = getDvarIntDefault( "twoPlayerPowerupScore", 50 ); + level.zombie_vars[ "zombie_score_kill_2p_team" ] = level.twoPlayerPowerupScore; + //points to the powerup increment to a powerup drop related to level.zombie_vars["zombie_powerup_drop_increment"] + level.onePlayerPowerupScore = getDvarIntDefault( "onePlayerPowerupScore", 50 ); + level.zombie_vars[ "zombie_score_kill_1p_team" ] = level.onePlayerPowerupScore; + //points for melee kills to the powerup increment to a powerup drop + level.powerupScoreMeleeKill = getDvarIntDefault( "powerupScoreMeleeKill", 80 ); + level.zombie_vars[ "zombie_score_bonus_melee" ] = level.powerupScoreMeleeKill; + //points for headshot kills to the powerup increment to a powerup drop + level.powerupScoreHeadshotKill = getDvarIntDefault( "powerupScoreHeadshotKill", 50 ); + level.zombie_vars[ "zombie_score_bonus_head" ] = level.powerupScoreHeadshotKill; + //points for neck kills to the powerup increment to a powerup drop + level.powerupScoreNeckKill = getDvarIntDefault( "powerupScoreNeckKill", 20 ); + level.zombie_vars[ "zombie_score_bonus_neck" ] = level.powerupScoreNeckKill; + //points for torso kills to the powerup increment to a powerup drop + level.powerupScoreTorsoKill = getDvarIntDefault( "powerupScoreTorsoKill", 10 ); + level.zombie_vars[ "zombie_score_bonus_torso" ] = level.powerupScoreTorsoKill; + //sets the zombie spawnrate; max is 0.08 + level.zombieSpawnRate = getDvarFloatDefault( "zombieSpawnRate", 2 ); + level.zombie_vars[ "zombie_spawn_delay" ] = level.zombieSpawnRate; + //sets the zombie spawnrate multiplier increase + level.zombieSpawnRateMultiplier = getDvarFloatDefault( "zombieSpawnRateMultiplier", 0.95 ); + //locks the spawnrate so it does not change throughout gameplay + level.zombieSpawnRateLocked = getDvarIntDefault( "zombieSpawnRateLocked", 0 ); + //alters the number of zombies per round formula amount of zombies per round is roughly correlated to this value + //ie half as many zombies per player is half as many zombies per round + level.zombiesPerPlayer = getDvarIntDefault( "zombiesPerPlayer", 6 ); + level.zombie_vars["zombie_ai_per_player"] = level.zombiesPerPlayer; + //sets the flat amount of hp the zombies gain per round not used after round 10 + level.zombieHealthIncreaseFlat = getDvarIntDefault( "zombieHealthIncreaseFlat", 100 ); + level.zombie_vars[ "zombie_health_increase" ] = level.zombieHealthIncreaseFlat; + //multiplies zombie health by this value every round after round 10 + level.zombieHealthIncreaseMultiplier = getDvarFloatDefault( "zombieHealthIncreaseMultiplier", 0.1 ); + level.zombie_vars[ "zombie_health_increase_multiplier" ] = level.zombieHealthIncreaseMultiplier; + //base zombie health before any multipliers or additions + level.zombieHealthStart = getDvarIntDefault( "zombieHealthStart", 150 ); + level.zombie_vars[ "zombie_health_start" ] = level.zombieHealthStart; + //time before new runners spawn on early rounds + level.zombieNewRunnerInterval = getDvarIntDefault( "zombieNewRunnerInterval", 10 ); + level.zombie_vars[ "zombie_new_runner_interval" ] = level.zombieNewRunnerInterval; + //determines level.zombie_move_speed on original + level.zombieMoveSpeedMultiplier = getDvarIntDefault( "zombieMoveSpeedMultiplier", 10 ); + level.zombie_vars[ "zombie_move_speed_multiplier" ] = level.zombieMoveSpeedMultiplier; + //determines level.zombie_move_speed on easy + level.zombieMoveSpeedMultiplierEasy = getDvarIntDefault( "zombieMoveSpeedMultiplierEasy", 8 ); + level.zombie_vars[ "zombie_move_speed_multiplier_easy"] = level.zombieMoveSpeedMultiplierEasy; + //affects the number of zombies per round formula + level.zombieMaxAi = getDvarIntDefault( "zombieMaxAi", 24 ); + level.zombie_vars[ "zombie_max_ai" ] = level.zombieMaxAi; + //affects the check for zombies that have fallen thru the map + level.belowWorldCheck = getDvarIntDefault( "belowWorldCheck", -1000 ); + level.zombie_vars[ "below_world_check" ] = level.belowWorldCheck; + //sets whether spectators respawn at the end of the round + level.customSpectatorsRespawn = getDvarIntDefault( "customSpectatorsRespawn", 1 ); + level.zombie_vars[ "spectators_respawn" ] = level.customSpectatorsRespawn; + //sets the time that the game takes during the end game intermission + level.zombieIntermissionTime = getDvarIntDefault( "zombieIntermissionTime", 20 ); + level.zombie_vars["zombie_intermission_time"] = level.zombieIntermissionTime; + //the time between rounds + level.zombieBetweenRoundTime = getDvarIntDefault( "zombieBetweenRoundTime", 15 ); + level.zombie_vars["zombie_between_round_time"] = level.zombieBetweenRoundTime; + //time before the game starts + level.roundStartDelay = getDvarIntDefault( "roundStartDelay", 0 ); + level.zombie_vars[ "game_start_delay" ] = level.roundStartDelay; + //points all players lose when a player bleeds out %10 default + level.bleedoutPointsLostAllPlayers = getDvarFloatDefault( "bleedoutPointsLostAllPlayers", 0.1 ); + level.zombie_vars[ "penalty_no_revive" ] = level.bleedoutPointsLostAllPlayers; + //penalty to the player who died 10% of points by default + level.bleedoutPointsLostSelf = getDvarFloatDefault( "bleedoutPointsLostSelf", 0.1 ); + level.zombie_vars[ "penalty_died" ] = level.bleedoutPointsLostSelf; + //points players lose on down %5 by default + level.downedPointsLostSelf = getDvarFloatDefault( "downedPointsLostSelf", 0.05 ); + level.zombie_vars[ "penalty_downed" ] = level.downedPointsLostSelf; + //unknown + level.playerStartingLives = getDvarIntDefault( "playerStartingLives", 1 ); + level.zombie_vars[ "starting_lives" ] = level.playerStartingLives; + //points earned per zombie kill in a 4 player game + level.fourPlayerScorePerZombieKill = getDvarIntDefault( "fourPlayerScorePerZombieKill", 50 ); + level.zombie_vars[ "zombie_score_kill_4player" ] = level.fourPlayerScorePerZombieKill; + //points earned per zombie kill in a 3 player game + level.threePlayerScorePerZombieKill = getDvarIntDefault( "threePlayerScorePerZombieKill", 50 ); + level.zombie_vars[ "zombie_score_kill_3player" ] = level.threePlayerScorePerZombieKill; + //points earned per zombie kill in a 2 player game + level.twoPlayerScorePerZombieKill = getDvarIntDefault( "twoPlayerScorePerZombieKill", 50 ); + level.zombie_vars[ "zombie_score_kill_2player" ] = level.twoPlayerScorePerZombieKill; + //points earned per zombie kill in a 1 player game + level.onePlayerScorePerZombieKill = getDvarIntDefault( "onePlayerScorePerZombieKill", 50 ); + level.zombie_vars[ "zombie_score_kill_1player" ] = level.onePlayerScorePerZombieKill; + //points given for a normal attack + level.pointsPerNormalAttack = getDvarIntDefault( "pointsPerNormalAttack", 10 ); + level.zombie_vars[ "zombie_score_damage_normal" ] = level.pointsPerNormalAttack; + //points given for a light attack + level.pointsPerLightAttack = getDvarIntDefault( "pointsPerLightAttack", 10 ); + level.zombie_vars[ "zombie_score_damage_light" ] = level.pointsPerLightAttack; + //players turn into a zombie on death WARNING: buggy as can be and is missing assets + level.shouldZombifyPlayer = getDvarIntDefault( "shouldZombifyPlayer", 0 ); + level.zombie_vars[ "zombify_player" ] = level.shouldZombifyPlayer; + //points scalar for allies team + level.alliesPointsMultiplier = getDvarIntDefault( "alliesPointsMultiplier", 1 ); + level.zombie_vars[ "allies" ][ "zombie_point_scalar" ] = level.alliesPointsMultiplier; + //points scalar for axis team + level.axisPointsMultiplier = getDvarIntDefault( "axisPointsMultiplier", 1 ); + level.zombie_vars[ "axis" ][ "zombie_point_scalar" ] = level.axisPointsMultiplier; + //sets the radius of emps explosion lower this to 1 to render emps useless + level.empPerkExplosionRadius = getDvarIntDefault( "empPerkExplosionRadius", 420 ); + level.zombie_vars[ "emp_perk_off_range" ] = level.empPerkExplosionRadius; + //sets the duration of emps on perks set to 0 for infiinite emps + level.empPerkOffDuration = getDvarIntDefault( "empPerkOffDuration", 90 ); + level.zombie_vars[ "emp_perk_off_time" ] = level.empPerkOffDuration; + //riotshield health + level.riotshieldHitPoints = getDvarIntDefault( "riotshieldHitPoints", 2250 ); + level.zombie_vars[ "riotshield_hit_points" ] = level.riotshieldHitPoints; + //jugg health bonus + level.juggHealthBonus = getDvarIntDefault( "juggHealthBonus", 160 ); + level.zombie_vars[ "zombie_perk_juggernaut_health" ] = level.juggHealthBonus; + //perma jugg health bonus + level.permaJuggHealthBonus = getDvarIntDefault( "permaJuggHealthBonus", 190 ); + level.zombie_vars[ "zombie_perk_juggernaut_health_upgrade" ] = level.permaJuggHealthBonus; + //phd min explosion damage + level.minPhdExplosionDamage = getDvarIntDefault( "minPhdExplosionDamage", 1000 ); + level.zombie_vars[ "zombie_perk_divetonuke_min_damage" ] = level.minPhdExplosionDamage; + //phd max explosion damage + level.maxPhdExplosionDamage = getDvarIntDefault( "maxPhdExplosionDamage", 5000 ); + level.zombie_vars[ "zombie_perk_divetonuke_max_damage" ] = level.maxPhdExplosionDamage; + //phd explosion radius + level.phdDamageRadius = getDvarIntDefault( "phdDamageRadius", 300 ); + level.zombie_vars[ "zombie_perk_divetonuke_radius" ] = level.phdDamageRadius; + //zombie counter onscreen + level.enableZombieCounter = getDvarIntDefault( "enableZombieCounter", 1 ); + level.zombie_vars[ "enableZombieCounter" ] = level.enableZombieCounter; + //change mystery box price + level.customMysteryBoxPriceEnabled = getDvarIntDefault( "customMysteryBoxPriceEnabled", 0 ); + level.zombie_vars[ "customMysteryBoxPriceEnabled" ] = level.customMysteryBoxPriceEnabled; + //set mystery box price + level.customMysteryBoxPrice = getDvarIntDefault( "customMysteryBoxPrice", 500 ); + level.zombie_vars[ "customMysteryBoxPrice" ] = level.customMysteryBoxPrice; + //disable custom perks + level.disableAllCustomPerks = getDvarIntDefault( "disableAllCustomPerks", 0 ); + level.zombie_vars[ "disableAllCustomPerks" ] = level.disableAllCustomPerks; + //enable custom phdflopper + level.enablePHDFlopper = getDvarIntDefault( "enablePHDFlopper", 1 ); + level.zombie_vars[ "enablePHDFlopper" ] = level.enablePHDFlopper; + //enable custom staminup + level.enableStaminUp = getDvarIntDefault( "enableStaminUp", 1 ); + level.zombie_vars[ "enableStaminUp" ] = level.enableStaminUp; + //enable custom deadshot + level.enableDeadshot = getDvarIntDefault( "enableDeadshot", 1 ); + level.zombie_vars[ "enableDeadshot" ] = level.enableDeadshot; + //enable custom mule kick + level.enableMuleKick = getDvarIntDefault( "enableMuleKick", 1 ); + level.zombie_vars[ "enableMuleKick" ] = level.enableMuleKick; + disable_specific_powerups(); + checks(); + thread zombies_always_drop_powerups(); + thread zombies_per_round_override(); + thread zombie_health_override(); + thread zombie_health_cap_override(); + thread zombie_spawn_delay_fix(); + thread zombie_speed_fix(); +} + +trackPackAPunchDrops() +{ + level endon("end_game"); + level.rounds_since_last_pack_a_punch = 0; + for(;;) + { + level waittill("start_of_round"); + level.rounds_since_last_pack_a_punch_drop += 1; + wait 0.5; + } +} + +gscRestart() +{ + level waittill( "end_game" ); + wait 15; + map_restart( false ); +} + +setPlayersToSpectator() +{ + level.no_end_game_check = 1; + wait 3; + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( i == 0 ) + { + i++; + } + players[ i ] setToSpectator(); + i++; + } + wait 5; + spawnAllPlayers(); +} + +setToSpectator() +{ + self.sessionstate = "spectator"; + if (isDefined(self.is_playing)) + { + self.is_playing = false; + } +} + +spawnAllPlayers() +{ + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ].sessionstate == "spectator" && isDefined( players[ i ].spectator_respawn ) ) + { + players[ i ] [[ level.spawnplayer ]](); + if ( level.script != "zm_tomb" || level.script != "zm_prison" || !is_classic() ) + { + thread maps\mp\zombies\_zm::refresh_player_navcard_hud(); + } + } + i++; + } + level.no_end_game_check = 0; +} + +disable_all_powerups() +{ + if ( level.zmPowerupsNoPowerupDrops ) + { + flag_clear( "zombie_drop_powerups" ); + } +} + +zombies_always_drop_powerups() +{ + if ( !level.zombiesAlwaysDropPowerups ) + { + return; + } + while ( 1 ) + { + level.zombie_vars[ "zombie_drop_item" ] = level.zombiesAlwaysDropPowerups; + wait 0.05; + } +} + +zombies_per_round_override() +{ + if ( !level.overrideZombieTotalPermanently ) + { + return; + } + while ( 1 ) + { + level waittill( "start_of_round" ); + level.zombie_total = getDvarIntDefault( "overrideZombieTotalPermanentlyValue", 6 ); + } +} + +zombie_health_override() +{ + if ( !level.overrideZombieHealthPermanently ) + { + return; + } + while ( 1 ) + { + level waittill( "start_of_round" ); + level.zombie_health = getDvarIntDefault( "overrideZombieHealthPermanentlyValue", 150 ); + } +} + +zombie_health_cap_override() +{ + if ( !level.overrideZombieMaxHealth ) + { + return; + } + while ( 1 ) + { + level waittill( "start_of_round" ); + if ( level.zombie_health > level.overrideZombieMaxHealthValue ) + { + level.zombie_health = getDvarIntDefault( "overrideZombieHealthMaxHealthValue", 150 ); + } + } +} + +zombie_spawn_delay_fix() +{ + if ( level.zombieSpawnRateLocked ) + { + return; + } + i = 1; + while ( i <= level.round_number ) + { + timer = level.zombieSpawnRate; + if ( timer > 0.08 ) + { + level.zombieSpawnRate = timer * level.zombieSpawnRateMultiplier; + i++; + continue; + } + else if ( timer < 0.08 ) + { + level.zombieSpawnRate = 0.08; + break; + } + i++; + } + while ( 1 ) + { + level waittill( "start_of_round" ); + if ( level.zombieSpawnRate > 0.08 ) + { + level.zombieSpawnRate = level.zombieSpawnRate * level.zombieSpawnRateMultiplier; + } + level.zombie_vars[ "zombie_spawn_delay" ] = level.zombieSpawnRate; + } +} + +zombie_speed_fix() +{ + if ( level.zombieMoveSpeedLocked ) + { + return; + } + if ( level.gamedifficulty == 0 ) + { + level.zombie_move_speed = level.round_number * level.zombie_vars[ "zombie_move_speed_multiplier_easy" ]; + } + else + { + level.zombie_move_speed = level.round_number * level.zombie_vars[ "zombie_move_speed_multiplier" ]; + } +} + +zombie_speed_override() +{ + if ( !level.zombieMoveSpeedLocked ) + { + return; + } + while ( 1 ) + { + level waittill( "start_of_round" ); + level.zombie_move_speed = getDvarIntDefault( "zombieMoveSpeed", 1 ); + } +} + +zombie_speed_cap_override() +{ + if ( !level.zombieMoveSpeedCap ) + { + return; + } + while ( 1 ) + { + level waittill( "start_of_round" ); + if ( level.zombie_move_speed > level.zombieMoveSpeedCapValue ) + { + level.zombie_move_speed = level.zombieMoveSpeedCapValue; + } + } +} + +checks() +{ + if( level.customMysteryBoxPriceEnabled == 1) //custom mystery box price + { + level thread setMysteryBoxPrice(); + } + if( level.enableZombieCounter == 1 ) //draw zombie counter + { + level thread drawZombiesCounter(); //credit carbonmodding + } + if ( level.mixed_rounds_enabled ) + { + if ( level.script != "zm_transit" || is_classic() || level.scr_zm_ui_gametype == "zgrief" ) + { + level.mixed_rounds_enabled = 0; + } + } + + if ( level.start_weapon == "" || level.start_weapon== "m1911_zm" ) + { + level.start_weapon = "m1911_zm"; + if ( level.script == "zm_tomb" ) + { + level.start_weapon = "c96_zm"; + } + } + if ( level.default_laststandpistol == "" || level.default_laststandpistol == "m1911_zm" ) + { + level.default_laststandpistol = "m1911_zm"; + if ( level.script == "zm_tomb" ) + { + level.default_laststandpistol = "c96_zm"; + } + } + if ( level.default_solo_laststandpistol == "" || level.default_solo_laststandpistol == "m1911_upgraded_zm" ) + { + level.default_solo_laststandpistol = "m1911_upgraded_zm"; + if ( level.script == "zm_tomb" ) + { + level.default_solo_laststandpistol = "c96_upgraded_zm"; + } + } + +} + +disable_specific_powerups() +{ + level.powerupNames = array( "fast_feet", "unlimited_ammo", "pack_a_punch", "money_drop", "nuke", "insta_kill", "full_ammo", "double_points", "fire_sale", "free_perk", "carpenter" ); + array = level.powerupNames; + //custom powerups and regular powerups + level.zmPowerupsEnabled = []; + //fast feet custom drop + level.zmPowerupsEnabled[ "fast_feet" ] = spawnstruct(); + level.zmPowerupsEnabled[ "fast_feet" ].name = "fast_feet"; + level.zmPowerupsEnabled[ "fast_feet" ].active = getDvarIntDefault( "zmPowerupsFastFeetEnabled", 1 ); + //custom unlimited ammo drop + level.zmPowerupsEnabled[ "unlimited_ammo" ] = spawnstruct(); + level.zmPowerupsEnabled[ "unlimited_ammo" ].name = "unlimited_ammo"; + level.zmPowerupsEnabled[ "unlimited_ammo" ].active = getDvarIntDefault( "zmPowerupsUnlimitedAmmoEnabled", 1 ); + //custom pack a punch drop + level.zmPowerupsEnabled[ "pack_a_punch" ] = spawnstruct(); + level.zmPowerupsEnabled[ "pack_a_punch" ].name = "pack_a_punch"; + level.zmPowerupsEnabled[ "pack_a_punch" ].active = getDvarIntDefault( "zmPowerupsPackAPunchEnabled", 1 ); + //custom money drop + level.zmPowerupsEnabled[ "money_drop" ] = spawnstruct(); + level.zmPowerupsEnabled[ "money_drop" ].name = "money_drop"; + level.zmPowerupsEnabled[ "money_drop" ].active = getDvarIntDefault( "zmPowerupsMoneyDropEnabled", 1 ); + //nuke + level.zmPowerupsEnabled[ "nuke" ] = spawnstruct(); + level.zmPowerupsEnabled[ "nuke" ].name = "nuke"; + level.zmPowerupsEnabled[ "nuke" ].active = getDvarIntDefault( "zmPowerupsNukeEnabled", 1 ); + //remove insta kills from the drop cycle and special drops + level.zmPowerupsEnabled[ "insta_kill" ] = spawnstruct(); + level.zmPowerupsEnabled[ "insta_kill" ].name = "insta_kill"; + level.zmPowerupsEnabled[ "insta_kill" ].active = getDvarIntDefault( "zmPowerupsInstaKillEnabled", 1 ); + //remove max ammos from the drop cycle and special drops + level.zmPowerupsEnabled[ "full_ammo" ] = spawnstruct(); + level.zmPowerupsEnabled[ "full_ammo" ].name = "full_ammo"; + level.zmPowerupsEnabled[ "full_ammo" ].active = getDvarIntDefault( "zmPowerupsMaxAmmoEnabled", 1 ); + //remove carpenter from the drop cycle and special drops + level.zmPowerupsEnabled[ "double_points" ] = spawnstruct(); + level.zmPowerupsEnabled[ "double_points" ].name = "double_points"; + level.zmPowerupsEnabled[ "double_points" ].active = getDvarIntDefault( "zmPowerupsDoublePointsEnabled", 1 ); + //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 + level.zmPowerupsEnabled[ "fire_sale" ] = spawnstruct(); + level.zmPowerupsEnabled[ "fire_sale" ].name = "fire_sale"; + level.zmPowerupsEnabled[ "fire_sale" ].active = getDvarIntDefault( "zmPowerupsFireSaleEnabled", 1 ); + //remove the perk bottle from the drop cycle and special drops + level.zmPowerupsEnabled[ "free_perk" ] = spawnstruct(); + level.zmPowerupsEnabled[ "free_perk" ].name = "free_perk"; + level.zmPowerupsEnabled[ "free_perk" ].active = getDvarIntDefault( "zmPowerupsPerkBottleEnabled", 1 ); + //removes carpenter from the drop cycle and special drops + level.zmPowerupsEnabled[ "carpenter" ] = spawnstruct(); + level.zmPowerupsEnabled[ "carpenter" ].name = "carpenter"; + level.zmPowerupsEnabled[ "carpenter" ].active = getDvarIntDefault( "zmPowerupsCarpenterEnabled", 1 ); + //removes zombie blood from the drop cycle and special drops + level.zmPowerupsEnabled[ "zombie_blood" ] = spawnstruct(); + level.zmPowerupsEnabled[ "zombie_blood" ].name = "zombie_blood"; + level.zmPowerupsEnabled[ "zombie_blood" ].active = getDvarIntDefault( "zmPowerupsZombieBloodEnabled", 1 ); + + //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 + + for ( i = 0; i < array.size; i++ ) + { + if ( !level.zmPowerupsEnabled[ array[ i ] ].active ) + { + name = level.zmPowerupsEnabled[ array[ i ] ].name; + if ( isInArray( level.zombie_include_powerups, name ) ) + { + arrayremovevalue( level.zombie_include_powerups, name ); + } + if ( isInArray( level.zombie_powerups, name ) ) + { + arrayremovevalue( level.zombie_powerups, name ); + } + if ( isInArray( level.zombie_powerup_array, name ) ) + { + arrayremovevalue( level.zombie_powerup_array, name ); + } + } + } +} + +drawZombiesCounter() +{ + level.zombiesCounter = createServerFontString("hudsmall" , 1.9); + level.zombiesCounter setPoint("CENTER", "CENTER", "CENTER", 190); + while(true) + { + enemies = get_round_enemy_array().size + level.zombie_total; + if( enemies != 0 ) + level.zombiesCounter.label = &"Zombies: ^1"; + else + level.zombiesCounter.label = &"Zombies: ^6"; + level.zombiesCounter setValue( enemies ); + wait 0.05; + } +} + +setMysteryBoxPrice() //mystery box price +{ + i = 0; + while (i < level.chests.size) + { + level.chests[ i ].zombie_cost = level.customMysteryBoxPrice; + level.chests[ i ].old_cost = level.customMysteryBoxPrice; + i++; + } +} + +spawnIfRoundOne() //spawn player +{ + wait 3; + if ( self.sessionstate == "spectator" && level.round_number == 1 ) + self iprintln("Get ready to be spawned!"); + wait 5; + if ( self.sessionstate == "spectator" && level.round_number == 1 ) + { + self [[ level.spawnplayer ]](); + if ( level.script != "zm_tomb" || level.script != "zm_prison" || !is_classic() ) + thread maps\mp\zombies\_zm::refresh_player_navcard_hud(); + } +} + +solo_tombstone_removal() +{ + notify( "tombstone_on" ); +} + +turn_tombstone_on() +{ + while ( 1 ) + { + machine = getentarray( "vending_tombstone", "targetname" ); + machine_triggers = getentarray( "vending_tombstone", "target" ); + i = 0; + while ( i < machine.size ) + { + machine[ i ] setmodel( level.machine_assets[ "tombstone" ].off_model ); + i++; + } + level thread do_initial_power_off_callback( machine, "tombstone" ); + array_thread( machine_triggers, ::set_power_on, 0 ); + level waittill( "tombstone_on" ); + i = 0; + while ( i < machine.size ) + { + machine[ i ] setmodel( level.machine_assets[ "tombstone" ].on_model ); + machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 ); + machine[ i ] playsound( "zmb_perks_power_on" ); + machine[ i ] thread perk_fx( "tombstone_light" ); + machine[ i ] thread play_loop_on_machine(); + i++; + } + level notify( "specialty_scavenger_power_on" ); + array_thread( machine_triggers, ::set_power_on, 1 ); + if ( isDefined( level.machine_assets[ "tombstone" ].power_on_callback ) ) + { + array_thread( machine, level.machine_assets[ "tombstone" ].power_on_callback ); + } + level waittill( "tombstone_off" ); + if ( isDefined( level.machine_assets[ "tombstone" ].power_off_callback ) ) + { + array_thread( machine, level.machine_assets[ "tombstone" ].power_off_callback ); + } + array_thread( machine, ::turn_perk_off ); + players = get_players(); + _a1718 = players; + _k1718 = getFirstArrayKey( _a1718 ); + while ( isDefined( _k1718 ) ) + { + player = _a1718[ _k1718 ]; + player.hasperkspecialtytombstone = undefined; + _k1718 = getNextArrayKey( _a1718, _k1718 ); + } + } +} + +perk_machine_spawn_init() +{ + match_string = ""; + location = level.scr_zm_map_start_location; + if ( location != "default" && location == "" && isDefined( level.default_start_location ) ) + { + location = level.default_start_location; + } + match_string = ( level.scr_zm_ui_gametype + "_perks_" ) + location; + pos = []; + if ( isDefined( level.override_perk_targetname ) ) + { + structs = getstructarray( level.override_perk_targetname, "targetname" ); + } + else + { + structs = getstructarray( "zm_perk_machine", "targetname" ); + } + _a3578 = structs; + _k3578 = getFirstArrayKey( _a3578 ); + while ( isDefined( _k3578 ) ) + { + struct = _a3578[ _k3578 ]; + if ( isDefined( struct.script_string ) ) + { + tokens = strtok( struct.script_string, " " ); + _a3583 = tokens; + _k3583 = getFirstArrayKey( _a3583 ); + while ( isDefined( _k3583 ) ) + { + token = _a3583[ _k3583 ]; + if ( token == match_string ) + { + pos[ pos.size ] = struct; + } + _k3583 = getNextArrayKey( _a3583, _k3583 ); + } + } + else pos[ pos.size ] = struct; + _k3578 = getNextArrayKey( _a3578, _k3578 ); + } + if ( !isDefined( pos ) || pos.size == 0 ) + { + return; + } + precachemodel( "zm_collision_perks1" ); + i = 0; + while ( i < pos.size ) + { + perk = pos[ i ].script_noteworthy; + if ( isDefined( perk ) && isDefined( pos[ i ].model ) ) + { + use_trigger = spawn( "trigger_radius_use", pos[ i ].origin + vectorScale( ( 0, -1, 0 ), 30 ), 0, 40, 70 ); + use_trigger.targetname = "zombie_vending"; + use_trigger.script_noteworthy = perk; + use_trigger triggerignoreteam(); + perk_machine = spawn( "script_model", pos[ i ].origin ); + perk_machine.angles = pos[ i ].angles; + perk_machine setmodel( pos[ i ].model ); + if ( isDefined( level._no_vending_machine_bump_trigs ) && level._no_vending_machine_bump_trigs ) + { + bump_trigger = undefined; + } + else + { + bump_trigger = spawn( "trigger_radius", pos[ i ].origin, 0, 35, 64 ); + bump_trigger.script_activated = 1; + bump_trigger.script_sound = "zmb_perks_bump_bottle"; + bump_trigger.targetname = "audio_bump_trigger"; + if ( perk != "specialty_weapupgrade" ) + { + bump_trigger thread thread_bump_trigger(); + } + } + collision = spawn( "script_model", pos[ i ].origin, 1 ); + collision.angles = pos[ i ].angles; + collision setmodel( "zm_collision_perks1" ); + collision.script_noteworthy = "clip"; + collision disconnectpaths(); + use_trigger.clip = collision; + use_trigger.machine = perk_machine; + use_trigger.bump = bump_trigger; + if ( isDefined( pos[ i ].blocker_model ) ) + { + use_trigger.blocker_model = pos[ i ].blocker_model; + } + if ( isDefined( pos[ i ].script_int ) ) + { + perk_machine.script_int = pos[ i ].script_int; + } + if ( isDefined( pos[ i ].turn_on_notify ) ) + { + perk_machine.turn_on_notify = pos[ i ].turn_on_notify; + } + if ( perk == "specialty_scavenger" || perk == "specialty_scavenger_upgrade" ) + { + use_trigger.script_sound = "mus_perks_tombstone_jingle"; + use_trigger.script_string = "tombstone_perk"; + use_trigger.script_label = "mus_perks_tombstone_sting"; + use_trigger.target = "vending_tombstone"; + perk_machine.script_string = "tombstone_perk"; + perk_machine.targetname = "vending_tombstone"; + if ( isDefined( bump_trigger ) ) + { + bump_trigger.script_string = "tombstone_perk"; + } + } + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].perk_machine_set_kvps ) ) + { + [[ level._custom_perks[ perk ].perk_machine_set_kvps ]]( use_trigger, perk_machine, bump_trigger, collision ); + } + } + i++; + } +} + +isTown() +{ + if (isDefined(level.zombiemode_using_tombstone_perk) && level.zombiemode_using_tombstone_perk) + { + level thread perk_machine_spawn_init(); + thread solo_tombstone_removal(); + thread turn_tombstone_on(); + } +} +give_afterlife_loadout() +{ + + self takeallweapons(); + loadout = self.loadout; + primaries = self getweaponslistprimaries(); + if ( loadout.weapons.size > 1 || primaries.size > 1 ) + { + foreach ( weapon in primaries ) + { + self takeweapon( weapon ); + } + } + i = 0; + while ( i < loadout.weapons.size ) + { + + if ( !isDefined( loadout.weapons[ i ] ) ) + { + i++; + + continue; + } + if ( loadout.weapons[ i ][ "name" ] == "none" ) + { + i++; + + continue; + } + self maps/mp/zombies/_zm_weapons::weapondata_give( loadout.weapons[ i ] ); + i++; + } + self setspawnweapon( loadout.weapons[ loadout.current_weapon ] ); + self switchtoweaponimmediate( loadout.weapons[ loadout.current_weapon ] ); + if ( isDefined( self get_player_melee_weapon() ) ) + { + self giveweapon( self get_player_melee_weapon() ); + } + self maps/mp/zombies/_zm_equipment::equipment_give( self.loadout.equipment ); + if ( isDefined( loadout.hasclaymore ) && loadout.hasclaymore && !self hasweapon( "claymore_zm" ) ) + { + self giveweapon( "claymore_zm" ); + self set_player_placeable_mine( "claymore_zm" ); + self setactionslot( 4, "weapon", "claymore_zm" ); + self setweaponammoclip( "claymore_zm", loadout.claymoreclip ); + } + if ( isDefined( loadout.hasemp ) && loadout.hasemp ) + { + self giveweapon( "emp_grenade_zm" ); + self setweaponammoclip( "emp_grenade_zm", loadout.empclip ); + } + if ( isDefined( loadout.hastomahawk ) && loadout.hastomahawk ) + { + self giveweapon( self.current_tomahawk_weapon ); + self set_player_tactical_grenade( self.current_tomahawk_weapon ); + self setclientfieldtoplayer( "tomahawk_in_use", 1 ); + } + self.score = loadout.score; + perk_array = maps/mp/zombies/_zm_perks::get_perk_array( 1 ); + i = 0; + while ( i < perk_array.size ) + { + perk = perk_array[ i ]; + self unsetperk( perk ); + self set_perk_clientfield( perk, 0 ); + i++; + } + if (is_true(self.keep_perks)) + { + if(is_true(self.hadphd)) + { + self.hasphd = true; + self.hadphd = undefined; + self thread maps/mp/gametypes_zm/_clientids::drawCustomPerkHUD("specialty_doubletap_zombies", 0, (1, 0.25, 1)); + } + } + if ( isDefined( self.keep_perks ) && self.keep_perks && isDefined( loadout.perks ) && loadout.perks.size > 0 ) + { + i = 0; + while ( i < loadout.perks.size ) + { + if ( self hasperk( loadout.perks[ i ] ) ) + { + i++; + continue; + } + if ( loadout.perks[ i ] == "specialty_quickrevive" && flag( "solo_game" ) ) + { + level.solo_game_free_player_quickrevive = 1; + } + if ( loadout.perks[ i ] == "specialty_longersprint" ) + { + self setperk( "specialty_longersprint" ); //removes the staminup perk functionality + self.hasStaminUp = true; //resets the staminup variable + self thread maps/mp/gametypes_zm/_clientids::drawCustomPerkHUD("specialty_juggernaut_zombies", 0, (1, 1, 0)); + arrayremovevalue( loadout.perks, "specialty_longersprint" ); + + continue; + } + if ( loadout.perks[ i ] == "specialty_additionalprimaryweapon" ) + { + self setperk( "specialty_additionalprimaryweapon"); //removes the deadshot perk functionality + self.hasMuleKick = true; //resets the deadshot variable + self thread maps/mp/gametypes_zm/_clientids::drawCustomPerkHUD("specialty_fastreload_zombies", 0, (0, 0.7, 0)); + arrayremovevalue( loadout.perks, "specialty_additionalprimaryweapon" ); + continue; + } + if ( loadout.perks[ i ] == "specialty_finalstand" ) + { + i++; + continue; + } + maps/mp/zombies/_zm_perks::give_perk( loadout.perks[ i ] ); + i++; + wait 0.05; + } + } + self.keep_perks = undefined; + self set_player_lethal_grenade( self.loadout.lethal_grenade ); + if ( loadout.grenade > 0 ) + { + curgrenadecount = 0; + if ( self hasweapon( self get_player_lethal_grenade() ) ) + { + self getweaponammoclip( self get_player_lethal_grenade() ); + } + else + { + self giveweapon( self get_player_lethal_grenade() ); + } + self setweaponammoclip( self get_player_lethal_grenade(), loadout.grenade + curgrenadecount ); + } + +} +save_afterlife_loadout() //checked changed to match cerberus output +{ + primaries = self getweaponslistprimaries(); + currentweapon = self getcurrentweapon(); + self.loadout = spawnstruct(); + self.loadout.player = self; + self.loadout.weapons = []; + self.loadout.score = self.score; + self.loadout.current_weapon = -1; + index = 0; + foreach ( weapon in primaries ) + { + self.loadout.weapons[ index ] = maps/mp/zombies/_zm_weapons::get_player_weapondata( self, weapon ); + if ( weapon == currentweapon || self.loadout.weapons[ index ][ "alt_name" ] == currentweapon ) + { + self.loadout.current_weapon = index; + } + index++; + } + self.loadout.equipment = self get_player_equipment(); + if ( isDefined( self.loadout.equipment ) ) + { + self maps/mp/zombies/_zm_equipment::equipment_take( self.loadout.equipment ); + } + if ( self hasweapon( "claymore_zm" ) ) + { + self.loadout.hasclaymore = 1; + self.loadout.claymoreclip = self getweaponammoclip( "claymore_zm" ); + } + if ( self hasweapon( "emp_grenade_zm" ) ) + { + self.loadout.hasemp = 1; + self.loadout.empclip = self getweaponammoclip( "emp_grenade_zm" ); + } + if ( self hasweapon( "bouncing_tomahawk_zm" ) || self hasweapon( "upgraded_tomahawk_zm" ) ) + { + self.loadout.hastomahawk = 1; + self setclientfieldtoplayer( "tomahawk_in_use", 0 ); + } + self.loadout.perks = afterlife_save_perks( self ); + lethal_grenade = self get_player_lethal_grenade(); + if ( self hasweapon( lethal_grenade ) ) + { + self.loadout.grenade = self getweaponammoclip( lethal_grenade ); + } + else + { + self.loadout.grenade = 0; + } + self.loadout.lethal_grenade = lethal_grenade; + self set_player_lethal_grenade( undefined ); +} + +afterlife_save_perks( ent ) //checked changed to match cerberus output +{ + perk_array = ent get_perk_array( 1 ); + foreach ( perk in perk_array ) + { + ent unsetperk( perk ); + } + return perk_array; +} +onPlayerRevived() +{ + self endon("disconnect"); + level endon("end_game"); + + for(;;) + { + self waittill_any( "whos_who_self_revive","player_revived","fake_revive","do_revive_ended_normally", "al_t" ); + wait 1; + if(is_true(self.hadPHD)) + { + self setperk( "PHD_FLOPPER" ); //removes the staminup perk functionality + self.hasPHD = true; + self.hadPHD = undefined; + self thread drawCustomPerkHUD("specialty_doubletap_zombies", 0, (1, 0.25, 1)); + } + else + return; + } +} + +init_custom_powerups() //credit goes to _Ox for most code +{ + level.unlimited_ammo_duration = 20; + include_zombie_powerup("unlimited_ammo"); + add_zombie_powerup("unlimited_ammo", "T6_WPN_AR_GALIL_WORLD", &"ZOMBIE_POWERUP_UNLIMITED_AMMO", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("unlimited_ammo", 1); + if(getDvar("mapname") == "zm_prison") + { + + include_zombie_powerup("fast_feet"); + add_zombie_powerup("fast_feet", "bottle_whisky_01", &"ZOMBIE_POWERUP_FAST_FEET", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("fast_feet", 1); + + include_zombie_powerup("pack_a_punch"); + 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); + powerup_set_can_pick_up_in_last_stand("pack_a_punch", 0); + + include_zombie_powerup("money_drop"); + add_zombie_powerup("money_drop", "p6_anim_zm_al_magic_box_lock_red", &"ZOMBIE_POWERUP_MONEY_DROP", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("money_drop", 1); + } + else if ( level.script == "zm_nuked" ) + { + include_zombie_powerup("fast_feet"); + add_zombie_powerup("fast_feet", "t6_wpn_zmb_perk_bottle_doubletap_world", &"ZOMBIE_POWERUP_FAST_FEET", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("fast_feet", 1); + + include_zombie_powerup("pack_a_punch"); + 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); + powerup_set_can_pick_up_in_last_stand("pack_a_punch", 0); + + include_zombie_powerup("money_drop"); + add_zombie_powerup("money_drop", "zombie_teddybear", &"ZOMBIE_POWERUP_MONEY_DROP", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("money_drop", 1); + } + else + { + include_zombie_powerup("fast_feet"); + add_zombie_powerup("fast_feet", "zombie_pickup_perk_bottle", &"ZOMBIE_POWERUP_FAST_FEET", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("fast_feet", 1); + + include_zombie_powerup("pack_a_punch"); + 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); + powerup_set_can_pick_up_in_last_stand("pack_a_punch", 0); + + include_zombie_powerup("money_drop"); + add_zombie_powerup("money_drop", "zombie_teddybear", &"ZOMBIE_POWERUP_MONEY_DROP", ::func_should_always_drop, 0, 0, 0); + powerup_set_can_pick_up_in_last_stand("money_drop", 1); + } +} + +custom_powerup_grab(powerup, player) //credit to _Ox much thx for powerup functions +{ + if(powerup.powerup_name == "money_drop") + player thread doRandomScore(); + else if(powerup.powerup_name == "pack_a_punch") + player thread doPackAPunchWeapon(); + else if(powerup.powerup_name == "unlimited_ammo") + player thread doUnlimitedAmmo(); + else if(powerup.powerup_name == "fast_feet") + player thread doFastFeet(); + else if (isDefined(level.original_zombiemode_powerup_grab)) + level thread [[level.original_zombiemode_powerup_grab]](powerup, player); +} + +startCustomPowerups() +{ + if(!isDefined(level.custompowerupinit)) + { + level.custompowerupinit = true; + wait 2; + if(isDefined(level._zombiemode_powerup_grab)) + level.original_zombiemode_powerup_grab = level._zombiemode_powerup_grab; + wait 2; + level._zombiemode_powerup_grab = ::custom_powerup_grab; + } +} + +doFastFeet() +{ + level endon("end_game"); + self endon( "disconnect" ); + self thread poweruptext("Fast Feet!"); + self playsound("zmb_cha_ching"); + self setmovespeedscale(3); + wait 15; + self setmovespeedscale(1); + self playsound("zmb_insta_kill"); +} + +doUnlimitedAmmo() +{ + level endon("end_game"); + foreach(player in level.players) + { + player notify("end_unlimited_ammo"); + player playsound("zmb_cha_ching"); + player thread poweruptext("Bottomless Clip"); + player thread monitorUnlimitedAmmo(); + player thread notifyUnlimitedAmmoEnd(); + } +} + +monitorUnlimitedAmmo() +{ + level endon("end_game"); + self endon("disonnect"); + self endon("end_unlimited_ammo"); + for(;;) + { + self setWeaponAmmoClip(self GetCurrentWeapon(), 150); + wait .05; + } +} + +notifyUnlimitedAmmoEnd() +{ + level endon("end_game"); + self endon("disonnect"); + self endon("end_unlimited_ammo"); + wait level.unlimited_ammo_duration; + self playsound("zmb_insta_kill"); + self notify("end_unlimited_ammo"); +} + +doPackAPunchWeapon() +{ + baseweapon = get_base_name(self getcurrentweapon()); + weapon = get_upgrade(baseweapon); + if(IsDefined(weapon) && isDefined(self.packapunching)) + { + level.rounds_since_last_pack_a_punch_drop = 0; + self.packapunching = undefined; + self takeweapon(baseweapon); + self giveweapon(weapon, 0, self get_pack_a_punch_weapon_options(weapon)); + self switchtoweapon(weapon); + self givemaxammo(weapon); + } + else + self playsoundtoplayer( level.zmb_laugh_alias, self ); +} + +get_upgrade(weapon) +{ + if(IsDefined(level.zombie_weapons[weapon].upgrade_name) && IsDefined(level.zombie_weapons[weapon])) + { + self.packapunching = true; + return get_upgrade_weapon(weapon, 0 ); + } + else + return get_upgrade_weapon(weapon, 1 ); +} + +doRandomScore() +{ + x = randomInt(9); + self playsound("zmb_cha_ching"); + if(x==1) + self.score += 50; + else if(x==2) + self.score += 100; + else if(x==3) + self.score += 250; + else if(x==4) + self.score += 500; + else if(x==5) + self.score += 750; + else if(x==6) + self.score += 1000; + else if(x==7) + self.score += 2500; + else if(x==8) + self.score += 5000; + else if(x==9) + self.score += 7500; + else + self.score += 10000; +} + +poweruptext(text) +{ + self endon("disconnect"); + level endon("end_game"); + hud_string = newclienthudelem(self); + hud_string.elemtype = "font"; + hud_string.font = "objective"; + hud_string.fontscale = 2; + hud_string.x = 0; + hud_string.y = 0; + hud_string.width = 0; + hud_string.height = int( level.fontheight * 2 ); + hud_string.xoffset = 0; + hud_string.yoffset = 0; + hud_string.children = []; + hud_string setparent(level.uiparent); + hud_string.hidden = 0; + 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)); + hud_string.sort = .5; + hud_string.alpha = 0; + hud_string fadeovertime(.5); + hud_string.alpha = 1; + hud_string setText(text); + hud_string thread poweruptextmove(); +} + +poweruptextmove() +{ + wait .5; + self fadeovertime(1.5); + self moveovertime(1.5); + self.y = 270; + self.alpha = 0; + wait 1.5; + self destroy(); +} + +func_should_drop_pack_a_punch() +{ + 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 ) + { + return 0; + } + return 1; +}