commit bc6a56ae441083414827ae6293e5da9f05590a7a Author: Jbleezy Date: Thu Feb 13 16:52:11 2020 -0800 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..8d285e96 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1 @@ +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..66031bb9 --- /dev/null +++ b/README.md @@ -0,0 +1,99 @@ +# Call of Duty: Black Ops 2 Zombies - Reimagined + +## Created by: Jbleezy + +[YouTube](https://youtube.com/ItsJbirdJustin) + +[Twitch](https://twitch.tv/Jbleezy) + +[Twitter](https://twitter.com/ItsJbleezy) + +[Donate](https://streamlabs.com/jbleezy) + +## Change Notes + +## Players +* Unlimited sprint + +## Zombies +* Health capped at 1 million +* Removed walkers in high rounds + +## Weapons + +### Jet Gun +* Kills whenever the right gauge is above 20% +* Kills multiple enemies significantly faster +* Must be firing weapon to kill +* Overheats while attempting to fire while meleeing +* Cools down while not holding weapon +* No longer automatically switched to weapon when picked up +* No longer disassembles when overheated +* Weapon is taken when overheated + +### Sliquifier +* Kills on any round (normally stops killing after round 100) +* Removed additional goo being created by chain kills + +## Perks + +### Speed Cola +* Aim twice as fast +* Switch weapons twice as fast + +### Deadshot +* Move faster while aiming + +## Powerups + +### Carpenter +* Removed + +## Buildables +* Automatically crafted (Tranzit, Die Rise, Buried) +* Parts automatically picked up (Mob of the Dead, Origins) + +### Electric Trap +* No longer needs to be powered by a Turbine +* Gets destroyed after being deployed for 60 seconds +* Kills on any round (normally stops killing after round 50) + +### Turret +* No longer needs to be powered by a Turbine +* Gets destroyed after being deployed for 60 seconds +* No longer damages players if they have Juggernog + +### Subsurface Resonator +* No longer needs to be powered by a Turbine + +## Bank +* Removed + +## Weapon Locker +* Removed + +## Maps + +### Tranzit +* Pack-a-Punch door is automatically open whenever the power is on + +### Town +* Moved Stamin-Up to its location on Tranzit + +#### Farm +* Zombies now spawn in the Center zone when in the Farm zone + +### Die Rise +* Zombies no longer spawn in the Skyscraper Tower zone when in the Trample Steam zone +* Zombies no longer spawn in the zone next to the AN94 when in the AN94 zone while the debris is closed + +### Mob of the Dead +* Acid Trap kills on any round (normally stops killing after round 158 on PC) +* Plane fuel automatically picked up + +### Buried +* Removed Sloth barricades +* Fountain portal automatically active + +### Origins +* Shovels automatically picked up \ No newline at end of file diff --git a/redacted.gsc b/redacted.gsc new file mode 100644 index 00000000..8fae441d --- /dev/null +++ b/redacted.gsc @@ -0,0 +1,1084 @@ +#include maps/mp/zombies/_zm_utility; +#include common_scripts/utility; +#include maps/mp/_utility; + +init() +{ + level.inital_spawn = true; + thread onplayerconnect(); + //SetDvar("r_enablePlayerShadow", 1); // Causes laser flickering +} + +onplayerconnect() +{ + while(true) + { + level waittill("connecting", player); + player thread onplayerspawned(); + } +} + +onplayerspawned() +{ + level endon( "game_ended" ); + self endon( "disconnect" ); + + for(;;) + { + self waittill( "spawned_player" ); + + if(level.inital_spawn) + { + level.inital_spawn = false; + + level thread post_all_players_spawned(); + } + + self setperk( "specialty_unlimitedsprint" ); + + self thread on_equipment_placed(); + self thread give_additional_perks(); + + self thread jetgun_fast_cooldown(); + self thread jetgun_fast_spinlerp(); + self thread jetgun_overheated_fix(); + + self thread tomb_give_shovel(); + + //self thread test(); + + //self.score = 1000000; + //maps/mp/zombies/_zm_perks::give_perk( "specialty_armorvest", 0 ); + //self GiveWeapon("ray_gun_zm"); + //self GiveMaxAmmo("ray_gun_zm"); + } +} + +post_all_players_spawned() +{ + flag_wait( "start_zombie_round_logic" ); + + wait 0.05; + + disable_high_round_walkers(); + + disable_carpenter(); + + disable_bank(); + disable_weapon_locker(); + + zone_changes(); + + jetgun_disable_explode_overheat(); + + //disable_pers_upgrades(); // TODO + + //level thread replace_wallbuys(); // TODO + + level thread buildbuildables(); + level thread buildcraftables(); + + level thread zombie_health_fix(); + + level thread jetgun_remove_forced_weapon_switch(); + + level thread transit_power_pap_door_globally(); + + level thread town_move_staminup_machine(); + + level thread prison_auto_refuel_plane(); + + level thread buried_deleteslothbarricades(); + level thread buried_enable_fountain_transport(); + + level thread tomb_remove_shovels_from_map(); + + // not working + //level.zombies_vars["jetgun_grind_range"] = 256; + + level.etrap_damage = maps/mp/zombies/_zm::ai_zombie_health( 255 ); + + level.zombie_vars["slipgun_reslip_rate"] = 0; + level.slipgun_damage = maps/mp/zombies/_zm::ai_zombie_health( 255 ); + + //level.round_number = 115; + //level.zombie_move_speed = 105; + //level.zombie_vars[ "zombie_spawn_delay" ] = 0.08; + + //level.local_doors_stay_open = 1; + //level.power_local_doors_globally = 1; +} + +disable_high_round_walkers() +{ + level.speed_change_round = undefined; +} + +disable_bank() +{ + for(i = 0; i < level._unitriggers.trigger_stubs.size; i++) + { + if(IsDefined(level._unitriggers.trigger_stubs[i].targetname)) + { + if(level._unitriggers.trigger_stubs[i].targetname == "bank_deposit" || level._unitriggers.trigger_stubs[i].targetname == "bank_withdraw") + { + maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( level._unitriggers.trigger_stubs[i] ); + } + } + } + + level notify( "stop_bank_teller" ); + bank_teller_dmg_trig = getent( "bank_teller_tazer_trig", "targetname" ); + if(IsDefined(bank_teller_dmg_trig)) + { + bank_teller_transfer_trig = getent( bank_teller_dmg_trig.target, "targetname" ); + bank_teller_dmg_trig delete(); + bank_teller_transfer_trig delete(); + } +} + +disable_weapon_locker() +{ + for(i = 0; i < level._unitriggers.trigger_stubs.size; i++) + { + if(IsDefined(level._unitriggers.trigger_stubs[i].targetname)) + { + if(level._unitriggers.trigger_stubs[i].targetname == "weapon_locker") + { + maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( level._unitriggers.trigger_stubs[i] ); + } + } + } +} + +disable_pers_upgrades() +{ + level.pers_upgrades_keys = []; + level.pers_upgrades = []; +} + +disable_carpenter() +{ + arrayremoveindex(level.zombie_include_powerups, "carpenter"); + arrayremoveindex(level.zombie_powerups, "carpenter"); + arrayremovevalue(level.zombie_powerup_array, "carpenter"); +} + +replace_wallbuys() +{ + if(level.scr_zm_ui_gametype == "zstandard") + { + if(level.scr_zm_map_start_location == "farm") + { + replace_wallbuy( "tazer_knuckles_zm", "claymore_zm" ); + } + } +} + +replace_wallbuy( replace_from, replace_to ) +{ + str = level.scr_zm_ui_gametype + "_" + level.scr_zm_map_start_location; + replace_from_struct = undefined; + replace_to_struct = undefined; + spawnable_weapon_spawns = getstructarray( "weapon_upgrade", "targetname" ); + spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "bowie_upgrade", "targetname" ), 1, 0 ); + spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "sickle_upgrade", "targetname" ), 1, 0 ); + spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "tazer_upgrade", "targetname" ), 1, 0 ); + spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "buildable_wallbuy", "targetname" ), 1, 0 ); + spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "claymore_purchase", "targetname" ), 1, 0 ); + for(i = 0; i < spawnable_weapon_spawns.size; i++) + { + if(IsDefined(spawnable_weapon_spawns[i].zombie_weapon_upgrade)) + { + if(spawnable_weapon_spawns[i].zombie_weapon_upgrade == replace_from && IsDefined(spawnable_weapon_spawns[i].script_noteworthy) && IsSubStr(spawnable_weapon_spawns[i].script_noteworthy, str)) + { + replace_from_struct = spawnable_weapon_spawns[i]; + } + else if(spawnable_weapon_spawns[i].zombie_weapon_upgrade == replace_to) + { + replace_to_struct = spawnable_weapon_spawns[i]; + } + } + } + + for(i = 0; i < level._unitriggers.trigger_stubs.size; i++) + { + if(IsDefined(level._unitriggers.trigger_stubs[i].zombie_weapon_upgrade)) + { + if(level._unitriggers.trigger_stubs[i].zombie_weapon_upgrade == replace_from) + { + level._unitriggers.trigger_stubs[i].weapon_upgrade = replace_to_struct.zombie_weapon_upgrade; + level._unitriggers.trigger_stubs[i].zombie_weapon_upgrade = replace_to_struct.zombie_weapon_upgrade; + level._unitriggers.trigger_stubs[i].targetname = replace_to_struct.targetname; + level._unitriggers.trigger_stubs[i].cost = maps/mp/zombies/_zm_weapons::get_weapon_cost( replace_to_struct.zombie_weapon_upgrade ); + level._unitriggers.trigger_stubs[i].hint_string = maps/mp/zombies/_zm_weapons::get_weapon_hint( replace_to_struct.zombie_weapon_upgrade ); + level._unitriggers.trigger_stubs[i].hint_parm1 = level._unitriggers.trigger_stubs[i].cost; + //clientfieldname = ( replace_to_struct.zombie_weapon_upgrade + "_" ) + replace_from_struct.origin; + //level._unitriggers.trigger_stubs[i].clientfieldname = clientfieldname; + + if(replace_to_struct.targetname == "claymore_purchase") + { + //level._unitriggers.trigger_stubs[i].trigger_func = ::maps/mp/zombies/_zm_weap_claymore::buy_claymores; + //level._unitriggers.trigger_stubs[i].prompt_and_visibility_func = ::maps/mp/zombies/_zm_weap_claymore::claymore_unitrigger_update_prompt; + } + + break; + } + } + } +} + +buildbuildables() +{ + // need a wait or else some buildables dont build + wait 1; + + if(is_classic()) + { + if(level.scr_zm_map_start_location == "transit") + { + buildbuildable( "powerswitch" ); + buildbuildable( "pap" ); + buildbuildable( "turbine" ); + buildbuildable( "electric_trap" ); + buildbuildable( "turret" ); // TODO - fix turret loop sound not going away when picked up + buildbuildable( "riotshield_zm" ); + buildbuildable( "jetgun_zm" ); + + // power switch is not showing up from forced build + show_powerswitch(); + } + else if(level.scr_zm_map_start_location == "rooftop") + { + buildbuildable( "slipgun_zm" ); + buildbuildable( "springpad_zm" ); + } + else if(level.scr_zm_map_start_location == "processing") + { + buildbuildable( "turbine" ); + buildbuildable( "springpad_zm" ); + buildbuildable( "subwoofer_zm" ); + buildbuildable( "headchopper_zm" ); + } + } +} + +buildbuildable( buildable ) +{ + player = get_players()[ 0 ]; + _a197 = level.buildable_stubs; + _k197 = getFirstArrayKey( _a197 ); + while ( isDefined( _k197 ) ) + { + stub = _a197[ _k197 ]; + if ( !isDefined( buildable ) || stub.equipname == buildable ) + { + if ( isDefined( buildable ) || stub.persistent != 3 ) + { + stub maps/mp/zombies/_zm_buildables::buildablestub_finish_build( player ); + stub maps/mp/zombies/_zm_buildables::buildablestub_remove(); + _a206 = stub.buildablezone.pieces; + _k206 = getFirstArrayKey( _a206 ); + while ( isDefined( _k206 ) ) + { + piece = _a206[ _k206 ]; + piece maps/mp/zombies/_zm_buildables::piece_unspawn(); + _k206 = getNextArrayKey( _a206, _k206 ); + } + stub.model notsolid(); + stub.model show(); + return; + } + } + _k197 = getNextArrayKey( _a197, _k197 ); + } +} + +// MOTD/Origins style buildables +buildcraftables() +{ + if(is_classic()) + { + if(level.scr_zm_map_start_location == "prison") + { + buildcraftable( "alcatraz_shield_zm" ); + buildcraftable( "packasplat" ); + } + else if(level.scr_zm_map_start_location == "tomb") + { + buildcraftable( "tomb_shield_zm" ); + buildcraftable( "equip_dieseldrone_zm" ); + } + } +} + +buildcraftable( buildable ) +{ + player = get_players()[ 0 ]; + _a197 = level.a_uts_craftables; + _k197 = getFirstArrayKey( _a197 ); + while ( isDefined( _k197 ) ) + { + stub = _a197[ _k197 ]; + if ( stub.craftablestub.name == buildable ) + { + _a206 = stub.craftablespawn.a_piecespawns; + _k206 = getFirstArrayKey( _a206 ); + while ( isDefined( _k206 ) ) + { + piece = _a206[ _k206 ]; + piecespawn = get_craftable_piece( stub.craftablestub.name, piece.piecename ); + if ( isDefined( piecespawn ) ) + { + player player_take_piece( piecespawn ); + } + _k206 = getNextArrayKey( _a206, _k206 ); + } + + // TODO - auto build at crafting table + + return; + } + _k197 = getNextArrayKey( _a197, _k197 ); + } +} + +get_craftable_piece( str_craftable, str_piece ) +{ + _a3564 = level.a_uts_craftables; + _k3564 = getFirstArrayKey( _a3564 ); + while ( isDefined( _k3564 ) ) + { + uts_craftable = _a3564[ _k3564 ]; + if ( uts_craftable.craftablestub.name == str_craftable ) + { + _a3568 = uts_craftable.craftablespawn.a_piecespawns; + _k3568 = getFirstArrayKey( _a3568 ); + while ( isDefined( _k3568 ) ) + { + piecespawn = _a3568[ _k3568 ]; + if ( piecespawn.piecename == str_piece ) + { + return piecespawn; + } + _k3568 = getNextArrayKey( _a3568, _k3568 ); + } + } + else _k3564 = getNextArrayKey( _a3564, _k3564 ); + } + return undefined; +} + +player_take_piece( piecespawn ) +{ + piecestub = piecespawn.piecestub; + damage = piecespawn.damage; + + if ( isDefined( piecestub.onpickup ) ) + { + piecespawn [[ piecestub.onpickup ]]( self ); + } + + if ( isDefined( piecestub.is_shared ) && piecestub.is_shared ) + { + if ( isDefined( piecestub.client_field_id ) ) + { + level setclientfield( piecestub.client_field_id, 1 ); + } + } + else + { + if ( isDefined( piecestub.client_field_state ) ) + { + self setclientfieldtoplayer( "craftable", piecestub.client_field_state ); + } + } + + piecespawn piece_unspawn(); + piecespawn notify( "pickup" ); + + if ( isDefined( piecestub.is_shared ) && piecestub.is_shared ) + { + piecespawn.in_shared_inventory = 1; + } + + self adddstat( "buildables", piecespawn.craftablename, "pieces_pickedup", 1 ); +} + +piece_unspawn() +{ + if ( isDefined( self.model ) ) + { + self.model delete(); + } + self.model = undefined; + if ( isDefined( self.unitrigger ) ) + { + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.unitrigger ); + } + self.unitrigger = undefined; +} + +remove_buildable_pieces( buildable_name ) +{ + buildables = level.zombie_include_buildables; + buildables_key = getFirstArrayKey( buildables ); + while(IsDefined(buildables_key)) + { + buildable = buildables[buildables_key]; + + if(IsDefined(buildable.name) && buildable.name == buildable_name) + { + pieces = buildable.buildablepieces; + for(i = 0; i < pieces.size; i++) + { + pieces[i] maps/mp/zombies/_zm_buildables::piece_unspawn(); + } + return; + } + + buildables_key = getNextArrayKey( buildables, buildables_key ); + } +} + +enemies_ignore_equipments() +{ + maps/mp/zombies/_zm_equipment::enemies_ignore_equipment("turbine"); + maps/mp/zombies/_zm_equipment::enemies_ignore_equipment("electric_trap"); + maps/mp/zombies/_zm_equipment::enemies_ignore_equipment("turret"); + maps/mp/zombies/_zm_equipment::enemies_ignore_equipment("riotshield_zm"); +} + +jetgun_fast_cooldown() +{ + self endon( "death_or_disconnect" ); + + if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "jetgun_zm" ) ) + { + return; + } + + val = 0; + + while ( 1 ) + { + if (!IsDefined(self.jetgun_heatval)) + { + wait 0.05; + continue; + } + + if ( self getcurrentweapon() == "jetgun_zm" ) + { + if (self AttackButtonPressed() && self IsMeleeing()) + { + self.jetgun_heatval += .85; + + self setweaponoverheating( self.jetgun_overheating, self.jetgun_heatval ); + } + } + else + { + self.jetgun_heatval -= .05; + + if (self.jetgun_heatval < 0) + { + self.jetgun_heatval = 0; + } + } + + wait 0.05; + } +} + +jetgun_fast_spinlerp() +{ + self endon( "death_or_disconnect" ); + + if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "jetgun_zm" ) ) + { + return; + } + + previous_spinlerp = 0; + + while ( 1 ) + { + if ( self getcurrentweapon() == "jetgun_zm" ) + { + if (self AttackButtonPressed() && !self IsSwitchingWeapons()) + { + previous_spinlerp -= 0.0165; + if (previous_spinlerp < -1) + { + previous_spinlerp = -1; + } + + if (self IsMeleeing()) + { + self setcurrentweaponspinlerp(previous_spinlerp / 2); + } + else + { + self setcurrentweaponspinlerp(previous_spinlerp); + } + } + else + { + previous_spinlerp += 0.01; + if (previous_spinlerp > 0) + { + previous_spinlerp = 0; + } + self setcurrentweaponspinlerp(0); + } + } + else + { + previous_spinlerp = 0; + } + + wait 0.05; + } +} + +jetgun_disable_explode_overheat() +{ + level.explode_overheated_jetgun = false; + level.unbuild_overheated_jetgun = false; + level.take_overheated_jetgun = true; +} + +jetgun_overheated_fix() +{ + self endon( "disconnect" ); + + if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "jetgun_zm" ) ) + { + return; + } + + while ( 1 ) + { + self waittill( "jetgun_overheated" ); + + weapon_org = self gettagorigin( "tag_weapon" ); + self dodamage( 50, weapon_org ); + self playsound( "wpn_jetgun_explo" ); + + wait 0.05; + + self.jetgun_heatval = 100; + self.jetgun_overheating = 0; + } +} + +jetgun_remove_forced_weapon_switch() +{ + buildables = level.zombie_include_buildables; + buildables_key = getFirstArrayKey( buildables ); + while(IsDefined(buildables_key)) + { + buildable = buildables[buildables_key]; + + if(IsDefined(buildable.name) && buildable.name == "jetgun_zm") + { + buildable.onbuyweapon = undefined; + return; + } + + buildables_key = getNextArrayKey( buildables, buildables_key ); + } +} + +on_equipment_placed() +{ + self endon( "death" ); + self endon( "disconnect" ); + + //level.equipment_etrap_needs_power = 0; + //level.equipment_turret_needs_power = 0; + //level.equipment_subwoofer_needs_power = 0; + + for ( ;; ) + { + self waittill( "equipment_placed", weapon, weapname ); + + if ( (IsDefined(level.turret_name) && weapname == level.turret_name) || (IsDefined(level.electrictrap_name) && weapname == level.electrictrap_name) || (IsDefined(level.subwoofer_name) && weapname == level.subwoofer_name) ) + { + weapon.local_power = maps/mp/zombies/_zm_power::add_local_power( weapon.origin, 16 ); + + weapon thread remove_local_power_on_death(weapon.local_power); + + if ( IsDefined(level.turret_name) && weapname == level.turret_name ) + { + self thread turret_decay(weapon); + + self thread turret_disable_team_damage(weapon); + } + else if ( IsDefined(level.electrictrap_name) && weapname == level.electrictrap_name ) + { + self thread electrictrap_decay(weapon); + } + } + } +} + +remove_local_power_on_death( local_power ) +{ + while ( isDefined(self) ) + { + wait 0.05; + } + + maps/mp/zombies/_zm_power::end_local_power( local_power ); +} + +turret_disable_team_damage( weapon ) +{ + self endon ( "death" ); + weapon endon( "death" ); + + while ( !IsDefined( weapon.turret ) ) + { + wait 0.05; + } + + weapon.turret.damage_own_team = 0; +} + +turret_decay( weapon ) +{ + self endon( "death" ); + self endon( "disconnect" ); + + if ( !isDefined( self.turret_health ) ) + { + self.turret_health = 60; + } + + while ( isDefined( weapon ) ) + { + if ( weapon.power_on ) + { + self.turret_health--; + + if ( self.turret_health <= 0 ) + { + self thread turret_expired( weapon ); + return; + } + } + wait 1; + } +} + +turret_expired( weapon ) +{ + maps/mp/zombies/_zm_equipment::equipment_disappear_fx( weapon.origin ); + self cleanupoldturret(); + self maps/mp/zombies/_zm_equipment::equipment_release( level.turret_name ); + self.turret_health = undefined; +} + +cleanupoldturret() +{ + if ( isDefined( self.buildableturret ) ) + { + if ( isDefined( self.buildableturret.stub ) ) + { + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildableturret.stub ); + self.buildableturret.stub = undefined; + } + if ( isDefined( self.buildableturret.turret ) ) + { + if ( isDefined( self.buildableturret.turret.sound_ent ) ) + { + self.buildableturret.turret.sound_ent delete(); + } + self.buildableturret.turret delete(); + } + if ( isDefined( self.buildableturret.sound_ent ) ) + { + self.buildableturret.sound_ent delete(); + self.buildableturret.sound_ent = undefined; + } + self.buildableturret delete(); + self.turret_health = undefined; + } + else + { + if ( isDefined( self.turret ) ) + { + self.turret notify( "stop_burst_fire_unmanned" ); + self.turret delete(); + } + } + self.turret = undefined; + self notify( "turret_cleanup" ); +} + +electrictrap_decay( weapon ) +{ + self endon( "death" ); + self endon( "disconnect" ); + + if ( !isDefined( self.electrictrap_health ) ) + { + self.electrictrap_health = 60; + } + + while ( isDefined( weapon ) ) + { + if ( weapon.power_on ) + { + self.electrictrap_health--; + + if ( self.electrictrap_health <= 0 ) + { + self thread electrictrap_expired( weapon ); + return; + } + } + wait 1; + } +} + +electrictrap_expired( weapon ) +{ + maps/mp/zombies/_zm_equipment::equipment_disappear_fx( weapon.origin ); + self cleanupoldtrap(); + self maps/mp/zombies/_zm_equipment::equipment_release( level.electrictrap_name ); + self.electrictrap_health = undefined; +} + +cleanupoldtrap() +{ + if ( isDefined( self.buildableelectrictrap ) ) + { + if ( isDefined( self.buildableelectrictrap.stub ) ) + { + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildableelectrictrap.stub ); + self.buildableelectrictrap.stub = undefined; + } + self.buildableelectrictrap delete(); + } + if ( isDefined( level.electrap_sound_ent ) ) + { + level.electrap_sound_ent delete(); + level.electrap_sound_ent = undefined; + } +} + +give_additional_perks() +{ + self endon( "death" ); + self endon( "disconnect" ); + + for ( ;; ) + { + self waittill_any("perk_acquired", "perk_lost"); + + if (self HasPerk("specialty_fastreload")) + { + self SetPerk("specialty_fastads"); + self SetPerk("specialty_fastweaponswitch"); + } + else + { + self UnsetPerk("specialty_fastads"); + self UnsetPerk("specialty_fastweaponswitch"); + } + + if (self HasPerk("specialty_deadshot")) + { + self SetPerk("specialty_stalker"); + } + else + { + self UnsetPerk("specialty_stalker"); + } + } +} + +zombie_health_fix() +{ + for ( ;; ) + { + level waittill( "start_of_round" ); + + wait 0.05; + + if(level.zombie_health > 1000000) + { + level.zombie_health = 1000000; + } + } +} + +show_powerswitch() +{ + getent( "powerswitch_p6_zm_buildable_pswitch_hand", "targetname" ) show(); + getent( "powerswitch_p6_zm_buildable_pswitch_body", "targetname" ) show(); + getent( "powerswitch_p6_zm_buildable_pswitch_lever", "targetname" ) show(); +} + +zone_changes() +{ + if(is_classic()) + { + if(level.scr_zm_map_start_location == "rooftop") + { + // AN94 to Debris + level.zones[ "zone_orange_level3a" ].adjacent_zones[ "zone_orange_level3b" ].is_connected = 0; + + // Trample Steam to Skyscraper + level.zones[ "zone_green_level3b" ].adjacent_zones[ "zone_blue_level1c" ] structdelete(); + level.zones[ "zone_green_level3b" ].adjacent_zones[ "zone_blue_level1c" ] = undefined; + } + } + else + { + if(level.scr_zm_map_start_location == "farm") + { + // Barn to Farm + flag_set("OnFarm_enter"); + } + } +} + +transit_power_pap_door_globally() +{ + if( !(is_classic() && level.scr_zm_map_start_location == "transit") ) + { + return; + } + + local_power = undefined; + + for ( ;; ) + { + flag_wait( "power_on" ); + + zombie_doors = getentarray( "zombie_door", "targetname" ); + for ( i = 0; i < zombie_doors.size; i++ ) + { + if ( isDefined( zombie_doors[i].script_noteworthy ) && zombie_doors[i].script_noteworthy == "local_electric_door" ) + { + if ( isDefined( zombie_doors[i].target ) && zombie_doors[i].target == "lab_secret_hatch" ) + { + local_power = maps/mp/zombies/_zm_power::add_local_power( zombie_doors[i].origin, 16 ); + break; + } + } + } + + flag_waitopen( "power_on" ); + + if ( isDefined( local_power ) ) + { + maps/mp/zombies/_zm_power::end_local_power( local_power ); + } + } +} + +town_move_staminup_machine() +{ + if (!(!is_classic() && level.scr_zm_map_start_location == "town")) + { + return; + } + + structs = getstructarray("zm_perk_machine", "targetname"); + structs_key = getFirstArrayKey(structs); + perk_struct = undefined; + while (IsDefined(structs_key)) + { + struct = structs[structs_key]; + + if (IsDefined(struct.script_noteworthy) && IsDefined(struct.script_string)) + { + if (struct.script_noteworthy == "specialty_longersprint" && IsSubStr(struct.script_string, "zclassic_perks_transit")) + { + perk_struct = struct; + break; + } + } + + structs_key = getNextArrayKey(structs, structs_key); + } + + if(!IsDefined(perk_struct)) + { + return; + } + + // delete old machine + vending_triggers = getentarray( "zombie_vending", "targetname" ); + for (i = 0; i < vending_trigger.size; i++) + { + trig = vending_triggers[i]; + if (IsDefined(trig.script_noteworthy) && trig.script_noteworthy == "specialty_longersprint") + { + trig.clip delete(); + trig.machine delete(); + trig.bump delete(); + trig delete(); + break; + } + } + + // spawn new machine + use_trigger = spawn( "trigger_radius_use", perk_struct.origin + vectorScale( ( 0, 0, 1 ), 30 ), 0, 40, 70 ); + use_trigger.targetname = "zombie_vending"; + use_trigger.script_noteworthy = perk_struct.script_noteworthy; + use_trigger triggerignoreteam(); + perk_machine = spawn( "script_model", perk_struct.origin ); + perk_machine.angles = perk_struct.angles; + perk_machine setmodel( perk_struct.model ); + bump_trigger = spawn( "trigger_radius", perk_struct.origin + AnglesToRight(perk_struct.angles) * 32, 0, 35, 32 ); + bump_trigger.script_activated = 1; + bump_trigger.script_sound = "zmb_perks_bump_bottle"; + bump_trigger.targetname = "audio_bump_trigger"; + bump_trigger thread maps/mp/zombies/_zm_perks::thread_bump_trigger(); + collision = spawn( "script_model", perk_struct.origin, 1 ); + collision.angles = perk_struct.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( perk_struct.blocker_model ) ) + { + use_trigger.blocker_model = perk_struct.blocker_model; + } + if ( isDefined( perk_struct.script_int ) ) + { + perk_machine.script_int = perk_struct.script_int; + } + if ( isDefined( perk_struct.turn_on_notify ) ) + { + perk_machine.turn_on_notify = perk_struct.turn_on_notify; + } + use_trigger.script_sound = "mus_perks_stamin_jingle"; + use_trigger.script_string = "marathon_perk"; + use_trigger.script_label = "mus_perks_stamin_sting"; + use_trigger.target = "vending_marathon"; + perk_machine.script_string = "marathon_perk"; + perk_machine.targetname = "vending_marathon"; + bump_trigger.script_string = "marathon_perk"; + + level thread maps/mp/zombies/_zm_perks::turn_marathon_on(); + use_trigger thread maps/mp/zombies/_zm_perks::vending_trigger_think(); + use_trigger thread maps/mp/zombies/_zm_perks::electric_perks_dialog(); +} + +prison_auto_refuel_plane() +{ + if(!(is_classic() && level.scr_zm_map_start_location == "prison")) + { + return; + } + + for ( ;; ) + { + flag_wait( "spawn_fuel_tanks" ); + + wait 0.05; + + buildcraftable( "refuelable_plane" ); + } +} + +buried_turn_power_on() +{ + +} + +buried_deleteslothbarricades() +{ + if(!(is_classic() && level.scr_zm_map_start_location == "processing")) + { + return; + } + + sloth_trigs = getentarray( "sloth_barricade", "targetname" ); + _a77 = sloth_trigs; + _k77 = getFirstArrayKey( _a77 ); + while ( isDefined( _k77 ) ) + { + trig = _a77[ _k77 ]; + if ( isDefined( trig.script_flag ) && level flag_exists( trig.script_flag ) ) + { + flag_set( trig.script_flag ); + } + parts = getentarray( trig.target, "targetname" ); + array_thread( parts, ::self_delete ); + _k77 = getNextArrayKey( _a77, _k77 ); + } + + array_thread( sloth_trigs, ::self_delete ); +} + +buried_enable_fountain_transport() +{ + if(!(is_classic() && level.scr_zm_map_start_location == "processing")) + { + return; + } + + flag_wait( "initial_blackscreen_passed" ); + + wait 1; + + level notify( "courtyard_fountain_open" ); +} + +tomb_remove_shovels_from_map() +{ + if(!(is_classic() && level.scr_zm_map_start_location == "tomb")) + { + return; + } + + flag_wait( "initial_blackscreen_passed" ); + + stubs = level._unitriggers.trigger_stubs; + for(i = 0; i < stubs.size; i++) + { + stub = stubs[i]; + if(IsDefined(stub.e_shovel)) + { + stub.e_shovel delete(); + maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( stub ); + } + } +} + +tomb_give_shovel() +{ + if(!(is_classic() && level.scr_zm_map_start_location == "tomb")) + { + return; + } + + self.dig_vars[ "has_shovel" ] = 1; + n_player = self getentitynumber() + 1; + level setclientfield( "shovel_player" + n_player, 1 ); +} + +test() +{ + while (!IsDefined(level.staminup_struct)) + { + wait 0.05; + } + + while(1) + { + iprintlnbold("distance: " + Distance(self.origin, level.staminup_struct.origin)); + + wait 1; + } +} \ No newline at end of file