burc_2004

_zombiemode_powerups.gsc

Jul 19th, 2015
436
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include maps\_utility;
  2. #include common_scripts\utility;
  3. #include maps\_zombiemode_utility;
  4.  
  5.  
  6. //
  7. init()
  8. {
  9.     PrecacheShader( "specialty_doublepoints_zombies" );
  10.     PrecacheShader( "specialty_instakill_zombies" );
  11.     PrecacheShader( "specialty_firesale_zombies");
  12.     PrecacheShader( "zom_icon_bonfire");
  13.     PrecacheShader( "zom_icon_minigun");
  14.  
  15.    
  16.     PrecacheShader( "black" );
  17.     // powerup Vars
  18.     set_zombie_var( "zombie_insta_kill",                0 );
  19.     set_zombie_var( "zombie_point_scalar",              1 );
  20.     set_zombie_var( "zombie_drop_item",                 0 );
  21.     set_zombie_var( "zombie_timer_offset",              350 );  // hud offsets
  22.     set_zombie_var( "zombie_timer_offset_interval",     30 );
  23.     set_zombie_var( "zombie_powerup_fire_sale_on",  false );
  24.     set_zombie_var( "zombie_powerup_fire_sale_time", 30 );
  25.     set_zombie_var( "zombie_powerup_bonfire_sale_on",   false );
  26.     set_zombie_var( "zombie_powerup_bonfire_sale_time", 30 );
  27.     set_zombie_var( "zombie_powerup_insta_kill_on",     false );
  28.     set_zombie_var( "zombie_powerup_insta_kill_time",   30 );   // length of insta kill
  29.     set_zombie_var( "zombie_powerup_point_doubler_on",  false );
  30.     set_zombie_var( "zombie_powerup_point_doubler_time", 30 );  // length of point doubler
  31. //  Modify by the percentage of points that the player gets
  32.     set_zombie_var( "zombie_powerup_drop_increment",    2000 ); // lower this to make drop happen more often
  33.     set_zombie_var( "zombie_powerup_drop_max_per_round", 4 );   // raise this to make drop happen more often
  34.  
  35.     // special vars for individual power ups
  36.     thread init_player_zombie_vars();
  37.  
  38.     // powerups
  39.     level._effect["powerup_on"]                     = loadfx( "misc/fx_zombie_powerup_on" );
  40.     level._effect["powerup_grabbed"]                = loadfx( "misc/fx_zombie_powerup_grab" );
  41.     level._effect["powerup_grabbed_wave"]           = loadfx( "misc/fx_zombie_powerup_wave" );
  42.     level._effect["powerup_on_red"]                 = loadfx( "misc/fx_zombie_powerup_on_red" );
  43.     level._effect["powerup_grabbed_red"]            = loadfx( "misc/fx_zombie_powerup_red_grab" );
  44.     level._effect["powerup_grabbed_wave_red"]       = loadfx( "misc/fx_zombie_powerup_red_wave" );
  45.     level._effect["powerup_on_solo"]                = LoadFX( "misc/fx_zombie_powerup_solo_on" );
  46.     level._effect["powerup_grabbed_solo"]           = LoadFX( "misc/fx_zombie_powerup_solo_grab" );
  47.     level._effect["powerup_grabbed_wave_solo"]      = loadfx( "misc/fx_zombie_powerup_solo_wave" );
  48.     level._effect["powerup_on_caution"]             = LoadFX( "misc/fx_zombie_powerup_caution_on" );
  49.     level._effect["powerup_grabbed_caution"]        = LoadFX( "misc/fx_zombie_powerup_caution_grab" );
  50.     level._effect["powerup_grabbed_wave_caution"]   = loadfx( "misc/fx_zombie_powerup_caution_wave" );
  51.  
  52.     if( level.mutators["mutator_noPowerups"] )
  53.     {
  54.         return;
  55.     }
  56.    
  57.     init_powerups();
  58.  
  59.     thread watch_for_drop();
  60.     thread setup_firesale_audio();
  61.     thread setup_bonfiresale_audio();
  62.    
  63.     level.use_new_carpenter_func = maps\_zombiemode_powerups::start_carpenter_new;
  64.     level.board_repair_distance_squared = 750*750;
  65. }
  66.  
  67.  
  68. //
  69. init_powerups()
  70. {
  71.     flag_init( "zombie_drop_powerups" );    // As long as it's set, powerups will be able to spawn
  72.     flag_set( "zombie_drop_powerups" );
  73.  
  74.     if( !IsDefined( level.zombie_powerup_array ) )
  75.     {
  76.         level.zombie_powerup_array = [];
  77.     }
  78.     if ( !IsDefined( level.zombie_special_drop_array ) )
  79.     {
  80.         level.zombie_special_drop_array = [];
  81.     }
  82.  
  83.     // Random Drops
  84.     add_zombie_powerup( "nuke",         "zombie_bomb",      &"ZOMBIE_POWERUP_NUKE", false, false, false,            "misc/fx_zombie_mini_nuke" );
  85. //  add_zombie_powerup( "nuke",         "zombie_bomb",      &"ZOMBIE_POWERUP_NUKE", false, false, false,            "misc/fx_zombie_mini_nuke_hotness" );
  86.     add_zombie_powerup( "insta_kill",   "zombie_skull",     &"ZOMBIE_POWERUP_INSTA_KILL", false, false, false );
  87.     add_zombie_powerup( "double_points","zombie_x2_icon",   &"ZOMBIE_POWERUP_DOUBLE_POINTS", false, false, false );
  88.     add_zombie_powerup( "full_ammo",    "zombie_ammocan",   &"ZOMBIE_POWERUP_MAX_AMMO", false, false, false );
  89.  
  90.     if( !level.mutators["mutator_noBoards"] )
  91.     {
  92.         add_zombie_powerup( "carpenter",    "zombie_carpenter", &"ZOMBIE_POWERUP_MAX_AMMO", false, false, false );
  93.     }
  94.    
  95.     //GZheng - Temp VO
  96.     //add the correct VO for firesale in the 3rd parameter of this function.
  97.     if( !level.mutators["mutator_noMagicBox"] )
  98.     {
  99.         add_zombie_powerup( "fire_sale",    "zombie_firesale",  &"ZOMBIE_POWERUP_MAX_AMMO", false, false, false );
  100.     }
  101.  
  102.     add_zombie_powerup( "bonfire_sale",     "zombie_pickup_bonfire",    &"ZOMBIE_POWERUP_MAX_AMMO", false, false, false );
  103.  
  104.     //PI ESM - Temp VO
  105.     //TODO add the correct VO for revive all in the 3rd parameter of this function.
  106.     add_zombie_powerup( "all_revive",   "zombie_revive",    &"ZOMBIE_POWERUP_MAX_AMMO", false, false, false );
  107.  
  108.     //  add_zombie_special_powerup( "monkey" );
  109.  
  110.     // additional special "drops"
  111. //  add_zombie_special_drop( "nothing" );
  112.     add_zombie_special_drop( "dog" );
  113.    
  114.     // minigun
  115.     add_zombie_powerup( "minigun",  "zombie_pickup_minigun", &"ZOMBIE_POWERUP_MINIGUN", true, false, false );
  116.  
  117.     // free perk
  118.     add_zombie_powerup( "free_perk", "zombie_pickup_perk_bottle", &"ZOMBIE_POWERUP_FREE_PERK", false, false, false );
  119.    
  120.     // tesla
  121.     add_zombie_powerup( "tesla", "zombie_pickup_minigun", &"ZOMBIE_POWERUP_MINIGUN", true, false, false );
  122.  
  123.     // random weapon
  124.     add_zombie_powerup( "random_weapon", "zombie_pickup_minigun", &"ZOMBIE_POWERUP_MAX_AMMO", true, false, false );
  125.  
  126.     // bonus points
  127.     add_zombie_powerup( "bonus_points_player", "zombie_z_money_icon", &"ZOMBIE_POWERUP_BONUS_POINTS", true, false, false );
  128.     add_zombie_powerup( "bonus_points_team", "zombie_z_money_icon", &"ZOMBIE_POWERUP_BONUS_POINTS", false, false, false );
  129.     add_zombie_powerup( "lose_points_team", "zombie_z_money_icon", &"ZOMBIE_POWERUP_LOSE_POINTS", false, false, true );
  130.  
  131.     // lose perk
  132.     add_zombie_powerup( "lose_perk", "zombie_pickup_perk_bottle", &"ZOMBIE_POWERUP_MAX_AMMO", false, false, true );
  133.  
  134.     // empty clip
  135.     add_zombie_powerup( "empty_clip", "zombie_ammocan", &"ZOMBIE_POWERUP_MAX_AMMO", false, false, true );
  136.  
  137.     // Randomize the order
  138.     randomize_powerups();
  139.     level.zombie_powerup_index = 0;
  140.     randomize_powerups();
  141.  
  142.     // Rare powerups
  143.     level.rare_powerups_active = 0;
  144.    
  145.     //AUDIO: Prevents the long firesale vox from playing more than once
  146.     level.firesale_vox_firstime = false;
  147.  
  148.     level thread powerup_hud_overlay();
  149.     level thread solo_powerup_hud_overlay();
  150.  
  151.     if ( isdefined( level.quantum_bomb_register_result_func ) )
  152.     {
  153.         [[level.quantum_bomb_register_result_func]]( "random_powerup", ::quantum_bomb_random_powerup_result, 5, level.quantum_bomb_in_playable_area_validation_func );
  154.         [[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 );
  155.         [[level.quantum_bomb_register_result_func]]( "random_weapon_powerup", ::quantum_bomb_random_weapon_powerup_result, 60, level.quantum_bomb_in_playable_area_validation_func );
  156.         [[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 );
  157.     }
  158. }  
  159.  
  160.  
  161. //  Creates zombie_vars that need to be tracked on an individual basis rather than as
  162. //  a group.
  163. init_player_zombie_vars()
  164. {
  165.     flag_wait( "all_players_connected" );
  166.  
  167.     players = get_players();
  168.     for( p = 0; p < players.size; p++ )
  169.     {
  170.         players[p].zombie_vars[ "zombie_powerup_minigun_on" ] = false; // minigun
  171.         players[p].zombie_vars[ "zombie_powerup_minigun_time" ] = 0;
  172.        
  173.         players[p].zombie_vars[ "zombie_powerup_tesla_on" ] = false; // tesla
  174.         players[p].zombie_vars[ "zombie_powerup_tesla_time" ] = 0;
  175.     }
  176. }
  177.  
  178.  
  179. //
  180. powerup_hud_overlay()
  181. {
  182.     level endon ("disconnect");
  183.  
  184.     level.powerup_hud_array = [];
  185.     level.powerup_hud_array[0] = true;
  186.     level.powerup_hud_array[1] = true;
  187.     level.powerup_hud_array[2] = true;
  188.     level.powerup_hud_array[3] = true;
  189.    
  190.  
  191.  
  192.     level.powerup_hud = [];
  193.     level.powerup_hud_cover = [];
  194.  
  195.  
  196.  
  197.     for(i = 0; i < 4; i++)
  198.     {
  199.         level.powerup_hud[i] = create_simple_hud();
  200.         level.powerup_hud[i].foreground = true;
  201.         level.powerup_hud[i].sort = 2;
  202.         level.powerup_hud[i].hidewheninmenu = false;
  203.         level.powerup_hud[i].alignX = "center";
  204.         level.powerup_hud[i].alignY = "bottom";
  205.         level.powerup_hud[i].horzAlign = "user_center";
  206.         level.powerup_hud[i].vertAlign = "user_bottom";
  207.         level.powerup_hud[i].x = -32 + (i * 15);
  208.         level.powerup_hud[i].y = level.powerup_hud[i].y - 5; // ww: used to offset by - 78
  209.         level.powerup_hud[i].alpha = 0.8;
  210.     }
  211.    
  212.     level thread Power_up_hud( "specialty_doublepoints_zombies", level.powerup_hud[0], -44, "zombie_powerup_point_doubler_time", "zombie_powerup_point_doubler_on" );
  213.     level thread Power_up_hud( "specialty_instakill_zombies", level.powerup_hud[1], -04, "zombie_powerup_insta_kill_time", "zombie_powerup_insta_kill_on" );
  214.     level thread Power_up_hud( "specialty_firesale_zombies", level.powerup_hud[2], 36, "zombie_powerup_fire_sale_time", "zombie_powerup_fire_sale_on" );   
  215.     level thread Power_up_hud( "zom_icon_bonfire", level.powerup_hud[3], 116, "zombie_powerup_bonfire_sale_time", "zombie_powerup_bonfire_sale_on" );  
  216.    
  217. }
  218.  
  219.  
  220. //
  221. Power_up_hud( Shader, PowerUp_Hud, X_Position, PowerUp_timer, PowerUp_Var )
  222. {
  223.  
  224.     while(true)
  225.     {
  226.         if(level.zombie_vars[PowerUp_timer] < 5)
  227.         {
  228.             wait(0.1);     
  229.             PowerUp_Hud.alpha = 0;
  230.             wait(0.1);
  231.         }
  232.         else if(level.zombie_vars[PowerUp_timer] < 10)
  233.         {
  234.             wait(0.2);
  235.             PowerUp_Hud.alpha = 0;
  236.             wait(0.18);
  237.  
  238.         }
  239.  
  240.         if( level.zombie_vars[PowerUp_Var] == true )
  241.         {
  242.             PowerUp_Hud.x = X_Position;
  243.             PowerUp_Hud.alpha = 1;
  244.             PowerUp_Hud setshader(Shader, 32, 32);
  245.         }
  246.         else
  247.         {
  248.             PowerUp_Hud.alpha = 0;
  249.         }
  250.  
  251.         wait( 0.05 );
  252.     }
  253. }
  254.  
  255.  
  256. //** solo hud
  257. solo_powerup_hud_overlay()
  258. {
  259.     level endon ("disconnect");
  260.    
  261.     flag_wait( "all_players_connected" );
  262.     wait( 0.1 );  // wait for solo zombie_vars to be initialized in init_player_zombie_vars
  263.  
  264.     players = get_players();
  265.     for( p = 0; p < players.size; p++ )
  266.     {
  267.         players[p].solo_powerup_hud_array = [];
  268.         players[p].solo_powerup_hud_array[ players[p].solo_powerup_hud_array.size ] = true; // minigun
  269.         players[p].solo_powerup_hud_array[ players[p].solo_powerup_hud_array.size ] = true; // tesla
  270.    
  271.         players[p].solo_powerup_hud = [];
  272.         players[p].solo_powerup_hud_cover = [];
  273.    
  274.         for(i = 0; i < players[p].solo_powerup_hud_array.size; i++)
  275.         {
  276.             players[p].solo_powerup_hud[i] = create_simple_hud( players[p] );
  277.             players[p].solo_powerup_hud[i].foreground = true;
  278.             players[p].solo_powerup_hud[i].sort = 2;
  279.             players[p].solo_powerup_hud[i].hidewheninmenu = false;
  280.             players[p].solo_powerup_hud[i].alignX = "center";
  281.             players[p].solo_powerup_hud[i].alignY = "bottom";
  282.             players[p].solo_powerup_hud[i].horzAlign = "user_center";
  283.             players[p].solo_powerup_hud[i].vertAlign = "user_bottom";
  284.             players[p].solo_powerup_hud[i].x = -32 + (i * 15);
  285.             players[p].solo_powerup_hud[i].y = players[p].solo_powerup_hud[i].y - 5; // ww: used to offset by - 78
  286.             players[p].solo_powerup_hud[i].alpha = 0.8;
  287.         }
  288.  
  289.         players[p] thread solo_power_up_hud( "zom_icon_minigun", players[p].solo_powerup_hud[0], 76, "zombie_powerup_minigun_time", "zombie_powerup_minigun_on" );
  290.         // the weapon powerups are mutually exclusive, so we use the same screen position
  291.         players[p] thread solo_power_up_hud( "zom_icon_minigun", players[p].solo_powerup_hud[1], 76, "zombie_powerup_tesla_time", "zombie_powerup_tesla_on" );
  292.     }
  293. }
  294.  
  295.  
  296. //
  297. solo_power_up_hud( Shader, PowerUp_Hud, X_Position, PowerUp_timer, PowerUp_Var )
  298. {
  299.     self endon( "disconnect" );
  300.    
  301.     while(true)
  302.     {
  303.         if(self.zombie_vars[PowerUp_timer] < 5 &&
  304.                 ( IsDefined( self._show_solo_hud ) && self._show_solo_hud == true ) )
  305.         {
  306.             wait(0.1);     
  307.             PowerUp_Hud.alpha = 0;
  308.             wait(0.1);
  309.         }
  310.         else if(self.zombie_vars[PowerUp_timer] < 10 &&
  311.                         ( IsDefined( self._show_solo_hud ) && self._show_solo_hud == true ) )
  312.         {
  313.             wait(0.2);
  314.             PowerUp_Hud.alpha = 0;
  315.             wait(0.18);
  316.  
  317.         }
  318.  
  319.         if( self.zombie_vars[PowerUp_Var] == true &&
  320.                 ( IsDefined( self._show_solo_hud ) && self._show_solo_hud == true ) )
  321.         {
  322.             PowerUp_Hud.x = X_Position;
  323.             PowerUp_Hud.alpha = 1;
  324.             PowerUp_Hud setshader(Shader, 32, 32);
  325.         }
  326.         else
  327.         {
  328.             PowerUp_Hud.alpha = 0;
  329.         }
  330.  
  331.         wait( 0.05 );
  332.     }
  333. }
  334. //** solo hud
  335.  
  336.  
  337. randomize_powerups()
  338. {
  339.     level.zombie_powerup_array = array_randomize( level.zombie_powerup_array );
  340. }
  341.  
  342. //
  343. // Get the next powerup in the list
  344. //
  345. get_next_powerup()
  346. {
  347.     powerup = level.zombie_powerup_array[ level.zombie_powerup_index ];
  348.  
  349.     level.zombie_powerup_index++;
  350.     if( level.zombie_powerup_index >= level.zombie_powerup_array.size )
  351.     {
  352.         level.zombie_powerup_index = 0;
  353.         randomize_powerups();
  354.     }
  355.  
  356.     return powerup;
  357. }
  358.  
  359.  
  360. //
  361. // Figure out what the next powerup drop is
  362. //
  363. // Powerup Rules:
  364. //   "carpenter": Needs at least 5 windows destroyed
  365. //   "fire_sale": Needs the box to have moved
  366. //
  367. //
  368. get_valid_powerup()
  369. {
  370. /#
  371.     if( isdefined( level.zombie_devgui_power ) && level.zombie_devgui_power == 1 )
  372.         return level.zombie_powerup_array[ level.zombie_powerup_index ];
  373. #/
  374.  
  375.     if ( isdefined( level.zombie_powerup_boss ) )
  376.     {
  377.         i = level.zombie_powerup_boss;
  378.         level.zombie_powerup_boss = undefined;
  379.         return level.zombie_powerup_array[ i ];
  380.     }
  381.  
  382.     if ( isdefined( level.zombie_powerup_ape ) )
  383.     {
  384.         powerup = level.zombie_powerup_ape;
  385.         level.zombie_powerup_ape = undefined;
  386.         return powerup;
  387.     }
  388.  
  389.  
  390.     powerup = get_next_powerup();
  391.     while( 1 )
  392.     {
  393.         // Carpenter needs 5 destroyed windows
  394.         if( powerup == "carpenter" && get_num_window_destroyed() < 5 )
  395.         {  
  396.             powerup = get_next_powerup();
  397.         }
  398.        
  399.         // Don't bring up fire_sale if the box hasn't moved or it it's already on
  400.         else if( powerup == "fire_sale" &&
  401.                  ( level.zombie_vars["zombie_powerup_fire_sale_on"] == true ||
  402.                    level.chest_moves < 1 ) )
  403.         {
  404.             powerup = get_next_powerup();
  405.         }
  406.         else if( powerup == "all_revive" )
  407.         {
  408.             if ( !maps\_laststand::player_num_in_laststand() ) //PI ESM - at least one player have to be down for this power-up to appear
  409.             {
  410.                 powerup = get_next_powerup();
  411.             }
  412.         }
  413.         else if ( powerup == "bonfire_sale" )   // never drops with regular powerups
  414.         {
  415.             powerup = get_next_powerup();
  416.         }
  417.         else if( powerup == "minigun" && minigun_no_drop() ) // don't drop unless life bought in solo, or power has been turned on
  418.         {          
  419.             powerup = get_next_powerup();
  420.         }
  421.         else if ( powerup == "free_perk" )      // never drops with regular powerups
  422.         {
  423.             powerup = get_next_powerup();
  424.         }
  425.         else if( powerup == "tesla" )                   // never drops with regular powerups
  426.         {
  427.             powerup = get_next_powerup();
  428.         }
  429.         else if( powerup == "random_weapon" )                   // never drops with regular powerups
  430.         {
  431.             powerup = get_next_powerup();
  432.         }
  433.         else if( powerup == "bonus_points_player" )                 // never drops with regular powerups
  434.         {
  435.             powerup = get_next_powerup();
  436.         }
  437.         else if( powerup == "bonus_points_team" )                   // never drops with regular powerups
  438.         {
  439.             powerup = get_next_powerup();
  440.         }
  441.         else if( powerup == "lose_points_team" )                    // never drops with regular powerups
  442.         {
  443.             powerup = get_next_powerup();
  444.         }
  445.         else if( powerup == "lose_perk" )                   // never drops with regular powerups
  446.         {
  447.             powerup = get_next_powerup();
  448.         }
  449.         else if( powerup == "empty_clip" )                  // never drops with regular powerups
  450.         {
  451.             powerup = get_next_powerup();
  452.         }
  453.         else
  454.         {
  455.             return( powerup );
  456.         }
  457.     }
  458. }
  459.  
  460. minigun_no_drop()
  461. {
  462.     players = GetPlayers();
  463.     for ( i=0; i<players.size; i++ )
  464.     {
  465.         if( players[i].zombie_vars[ "zombie_powerup_minigun_on" ] == true )
  466.         {
  467.             return true;
  468.         }
  469.     }
  470.  
  471.     if( !flag( "power_on" ) ) // if power is not on check for solo
  472.     {
  473.         if( flag( "solo_game" ) ) // if it is a solo game then perform another check
  474.         {
  475.             if( level.solo_lives_given == 0 ) // the power isn't on, it is a solo game, has the player purchased a life/revive?
  476.             {
  477.                 return true; // no drop because the player has no bought a life/revive
  478.             }
  479.         }
  480.         else
  481.         {
  482.             return true; // not a solo game, powerup is invalid
  483.         }
  484.     }
  485.    
  486.     return false;
  487. }
  488.        
  489.  
  490.  
  491. get_num_window_destroyed()
  492. {
  493.     num = 0;
  494.     for( i = 0; i < level.exterior_goals.size; i++ )
  495.     {
  496.         /*targets = getentarray(level.exterior_goals[i].target, "targetname");
  497.  
  498.         barrier_chunks = [];
  499.         for( j = 0; j < targets.size; j++ )
  500.         {
  501.             if( IsDefined( targets[j].script_noteworthy ) )
  502.             {
  503.                 if( targets[j].script_noteworthy == "clip" )
  504.                 {
  505.                     continue;
  506.                 }
  507.             }
  508.  
  509.             barrier_chunks[barrier_chunks.size] = targets[j];
  510.         }*/
  511.  
  512.  
  513.         if( all_chunks_destroyed( level.exterior_goals[i].barrier_chunks ) )
  514.         {
  515.             num += 1;
  516.         }
  517.  
  518.     }
  519.  
  520.     return num;
  521. }
  522.  
  523. watch_for_drop()
  524. {
  525.     flag_wait( "begin_spawning" );
  526.  
  527.     players = get_players();
  528.     score_to_drop = ( players.size * level.zombie_vars["zombie_score_start_"+players.size+"p"] ) + level.zombie_vars["zombie_powerup_drop_increment"];
  529.  
  530.     while (1)
  531.     {
  532.         flag_wait( "zombie_drop_powerups" );
  533.  
  534.         players = get_players();
  535.  
  536.         curr_total_score = 0;
  537.  
  538.         for (i = 0; i < players.size; i++)
  539.         {
  540.             curr_total_score += players[i].score_total;
  541.         }
  542.  
  543.         if (curr_total_score > score_to_drop )
  544.         {
  545.             level.zombie_vars["zombie_powerup_drop_increment"] *= 1.14;
  546.             score_to_drop = curr_total_score + level.zombie_vars["zombie_powerup_drop_increment"];
  547.             level.zombie_vars["zombie_drop_item"] = 1;
  548.         }
  549.  
  550.         wait( 0.5 );
  551.     }
  552. }
  553.  
  554. add_zombie_powerup( powerup_name, model_name, hint, solo, caution, zombie_grabbable, fx )
  555. {
  556.     if( IsDefined( level.zombie_include_powerups ) && !IsDefined( level.zombie_include_powerups[powerup_name] ) )
  557.     {
  558.         return;
  559.     }
  560.  
  561.     PrecacheModel( model_name );
  562.     PrecacheString( hint );
  563.  
  564.     struct = SpawnStruct();
  565.  
  566.     if( !IsDefined( level.zombie_powerups ) )
  567.     {
  568.         level.zombie_powerups = [];
  569.     }
  570.  
  571.     struct.powerup_name = powerup_name;
  572.     struct.model_name = model_name;
  573.     struct.weapon_classname = "script_model";
  574.     struct.hint = hint;
  575.     struct.solo = solo;
  576.     struct.caution = caution;
  577.     struct.zombie_grabbable = zombie_grabbable;
  578.  
  579.     if( IsDefined( fx ) )
  580.     {
  581.         struct.fx = LoadFx( fx );
  582.     }
  583.  
  584.     level.zombie_powerups[powerup_name] = struct;
  585.     level.zombie_powerup_array[level.zombie_powerup_array.size] = powerup_name;
  586.     add_zombie_special_drop( powerup_name );
  587. }
  588.  
  589.  
  590. // special powerup list for the teleporter drop
  591. add_zombie_special_drop( powerup_name )
  592. {
  593.     level.zombie_special_drop_array[ level.zombie_special_drop_array.size ] = powerup_name;
  594. }
  595.  
  596. include_zombie_powerup( powerup_name )
  597. {
  598.     if( "1" == GetDvar( #"mutator_noPowerups") )
  599.     {
  600.         return;
  601.     }
  602.     if( !IsDefined( level.zombie_include_powerups ) )
  603.     {
  604.         level.zombie_include_powerups = [];
  605.     }
  606.  
  607.     level.zombie_include_powerups[powerup_name] = true;
  608. }
  609.  
  610. powerup_round_start()
  611. {
  612.     level.powerup_drop_count = 0;
  613. }
  614.  
  615. powerup_drop(drop_point)
  616. {
  617.     if( level.mutators["mutator_noPowerups"] )
  618.     {
  619.         return;
  620.     }
  621.        
  622.     if( level.powerup_drop_count >= level.zombie_vars["zombie_powerup_drop_max_per_round"] )
  623.     {
  624. /#
  625.         println( "^3POWERUP DROP EXCEEDED THE MAX PER ROUND!" );
  626. #/
  627.         return;
  628.     }
  629.    
  630.     if( !isDefined(level.zombie_include_powerups) || level.zombie_include_powerups.size == 0 )
  631.     {
  632.         return;
  633.     }
  634.  
  635.     // some guys randomly drop, but most of the time they check for the drop flag
  636.     rand_drop = randomint(100);
  637.    
  638.     if (rand_drop > 2)
  639.     {
  640.         if (!level.zombie_vars["zombie_drop_item"])
  641.         {
  642.             return;
  643.         }
  644.  
  645.         debug = "score";
  646.     }
  647.     else
  648.     {
  649.         debug = "random";
  650.     }  
  651.  
  652.     // Never drop unless in the playable area
  653.     playable_area = getentarray("player_volume","script_noteworthy");
  654.  
  655.     // This needs to go above the network_safe_spawn because that has a wait.
  656.     //  Otherwise, multiple threads could attempt to drop powerups.
  657.     level.powerup_drop_count++;
  658.  
  659.     powerup = maps\_zombiemode_net::network_safe_spawn( "powerup", 1, "script_model", drop_point + (0,0,40));
  660.    
  661.     //chris_p - fixed bug where you could not have more than 1 playable area trigger for the whole map
  662.     valid_drop = false;
  663.     for (i = 0; i < playable_area.size; i++)
  664.     {
  665.         if (powerup istouching(playable_area[i]))
  666.         {
  667.             valid_drop = true;
  668.         }
  669.     }
  670.    
  671.     // If a valid drop
  672.     // We will rarely override the drop with a "rare drop"  (MikeA 3/23/10)
  673.     if( valid_drop && level.rare_powerups_active )
  674.     {
  675.         pos = ( drop_point[0], drop_point[1], drop_point[2] + 42 );
  676.         if( check_for_rare_drop_override( pos ) )
  677.         {
  678.             level.zombie_vars["zombie_drop_item"] = 0;
  679.             valid_drop = 0;
  680.         }
  681.     }
  682.    
  683.     // If not a valid drop, allow another spawn to be attempted
  684.     if(! valid_drop )
  685.     {
  686.         level.powerup_drop_count--;
  687.         powerup delete();
  688.         return;
  689.     }
  690.  
  691.     powerup powerup_setup();
  692.  
  693.     print_powerup_drop( powerup.powerup_name, debug );
  694.  
  695.     powerup thread powerup_timeout();
  696.     powerup thread powerup_wobble();
  697.     powerup thread powerup_grab();
  698.  
  699.     level.zombie_vars["zombie_drop_item"] = 0;
  700.  
  701.     // RAVEN BEGIN bhackbarth: let the level know that a powerup has been dropped
  702.     level notify("powerup_dropped", powerup);
  703.     // RAVEN END
  704. }
  705.  
  706.  
  707. //
  708. //  Drop the specified powerup
  709. specific_powerup_drop( powerup_name, drop_spot )
  710. {
  711.     powerup = maps\_zombiemode_net::network_safe_spawn( "powerup", 1, "script_model", drop_spot + (0,0,40));
  712.  
  713.     level notify("powerup_dropped", powerup);
  714.  
  715.     if ( IsDefined(powerup) )
  716.     {
  717.         powerup powerup_setup( powerup_name );
  718.  
  719.         powerup thread powerup_timeout();
  720.         powerup thread powerup_wobble();
  721.         powerup thread powerup_grab();
  722.     }
  723. }
  724.  
  725.  
  726. quantum_bomb_random_powerup_result( position )
  727. {
  728.     if( !isDefined( level.zombie_include_powerups ) || !level.zombie_include_powerups.size )
  729.     {
  730.         return;
  731.     }
  732.  
  733.     keys = GetArrayKeys( level.zombie_include_powerups );
  734.     while ( keys.size )
  735.     {
  736.         index = RandomInt( keys.size );
  737.         if ( !level.zombie_powerups[keys[index]].zombie_grabbable )
  738.         {
  739.             skip = false;
  740.             switch ( keys[index] )
  741.             {
  742.             case "random_weapon":
  743.             case "bonus_points_player":
  744.             case "bonus_points_team":
  745.                 // skip these period
  746.                 skip = true;
  747.                 break;
  748.  
  749.             case "full_ammo":
  750.             case "insta_kill":
  751.             case "fire_sale":
  752.             case "minigun":
  753.                 if ( RandomInt( 4 ) ) // only 25% chance of getting one of these
  754.                 {
  755.                     skip = true;
  756.                 }
  757.                 break;
  758.  
  759.             case "bonfire_sale":
  760.             case "free_perk":
  761.             case "tesla":
  762.                 if ( RandomInt( 20 ) ) // only 5% chance of getting one of these
  763.                 {
  764.                     skip = true;
  765.                 }
  766.                 break;
  767.  
  768.             default: // go ahead and use this one
  769.             }
  770.  
  771.             if ( skip )
  772.             {
  773.                 keys = array_remove_nokeys( keys, keys[index] );
  774.                 continue;
  775.             }
  776.            
  777.             self thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "quant_good" );
  778.             [[level.quantum_bomb_play_player_effect_at_position_func]]( position );
  779.             level specific_powerup_drop( keys[index], position );
  780.             return;
  781.         }
  782.         else
  783.         {
  784.             keys = array_remove_nokeys( keys, keys[index] );
  785.         }
  786.     }
  787. }
  788.  
  789.  
  790. quantum_bomb_random_zombie_grab_powerup_result( position )
  791. {
  792.     if( !isDefined( level.zombie_include_powerups ) || !level.zombie_include_powerups.size )
  793.     {
  794.         return;
  795.     }
  796.  
  797.     keys = GetArrayKeys( level.zombie_include_powerups );
  798.     while ( keys.size )
  799.     {
  800.         index = RandomInt( keys.size );
  801.         if ( level.zombie_powerups[keys[index]].zombie_grabbable )
  802.         {
  803.             self thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "quant_bad" );
  804.             [[level.quantum_bomb_play_player_effect_at_position_func]]( position );
  805.             level specific_powerup_drop( keys[index], position );
  806.             return;
  807.         }
  808.         else
  809.         {
  810.             keys = array_remove_nokeys( keys, keys[index] );
  811.         }
  812.     }
  813. }
  814.  
  815.  
  816. quantum_bomb_random_weapon_powerup_result( position )
  817. {
  818.     self thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "quant_good" );
  819.    
  820.     [[level.quantum_bomb_play_player_effect_at_position_func]]( position );
  821.     level specific_powerup_drop( "random_weapon", position );
  822. }
  823.  
  824.  
  825. quantum_bomb_random_bonus_or_lose_points_powerup_result( position )
  826. {
  827.     rand = RandomInt( 10 );
  828.     powerup = "bonus_points_team";
  829.     switch ( rand )
  830.     {
  831.     case 0:
  832.     case 1:
  833.         powerup = "lose_points_team";
  834.         if ( IsDefined( level.zombie_include_powerups[powerup] ) )
  835.         {
  836.             self thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "quant_bad" );
  837.             break;
  838.         }
  839.     case 2:
  840.     case 3:
  841.     case 4:
  842.         powerup = "bonus_points_player";
  843.         if ( IsDefined( level.zombie_include_powerups[powerup] ) )
  844.         {
  845.             break;
  846.         }
  847.     default:
  848.         powerup = "bonus_points_team";
  849.         break;
  850.     }
  851.  
  852.     [[level.quantum_bomb_play_player_effect_at_position_func]]( position );
  853.     level specific_powerup_drop( powerup, position );
  854. }
  855.  
  856.  
  857. //
  858. //  Special power up drop - done outside of the powerup system.
  859. special_powerup_drop(drop_point)
  860. {
  861. //  if( level.powerup_drop_count == level.zombie_vars["zombie_powerup_drop_max_per_round"] )
  862. //  {
  863. //      println( "^3POWERUP DROP EXCEEDED THE MAX PER ROUND!" );
  864. //      return;
  865. //  }
  866.  
  867.     if( !isDefined(level.zombie_include_powerups) || level.zombie_include_powerups.size == 0 )
  868.     {
  869.         return;
  870.     }
  871.  
  872.     powerup = spawn ("script_model", drop_point + (0,0,40));
  873.  
  874.     // never drop unless in the playable area
  875.     playable_area = getentarray("player_volume","script_noteworthy");
  876.     //chris_p - fixed bug where you could not have more than 1 playable area trigger for the whole map
  877.     valid_drop = false;
  878.     for (i = 0; i < playable_area.size; i++)
  879.     {
  880.         if (powerup istouching(playable_area[i]))
  881.         {
  882.             valid_drop = true;
  883.             break;
  884.         }
  885.     }
  886.  
  887.     if(!valid_drop)
  888.     {
  889.         powerup Delete();
  890.         return;
  891.     }
  892.  
  893.     powerup special_drop_setup();
  894. }
  895.  
  896.  
  897. cleanup_random_weapon_list()
  898. {
  899.     self waittill( "death" );
  900.  
  901.     level.random_weapon_powerups = array_remove_nokeys( level.random_weapon_powerups, self );
  902. }
  903.  
  904.  
  905. //
  906. //  Pick the next powerup in the list
  907. powerup_setup( powerup_override )
  908. {
  909.     powerup = undefined;
  910.    
  911.     if ( !IsDefined( powerup_override ) )
  912.     {
  913.         powerup = get_valid_powerup();
  914.     }
  915.     else
  916.     {
  917.         powerup = powerup_override;
  918.  
  919.         if ( "tesla" == powerup && tesla_powerup_active() )
  920.         {
  921.             // only one tesla at a time, give a minigun instead
  922.             powerup = "minigun";
  923.         }
  924.     }  
  925.  
  926.     struct = level.zombie_powerups[powerup];
  927.  
  928.     if ( powerup == "random_weapon" )
  929.     {
  930.         // select the weapon for this instance of random_weapon
  931.         self.weapon = maps\_zombiemode_weapons::treasure_chest_ChooseWeightedRandomWeapon();
  932.  
  933. /#
  934.         weapon = GetDvar( #"scr_force_weapon" );
  935.         if ( weapon != "" && IsDefined( level.zombie_weapons[ weapon ] ) )
  936.         {
  937.             self.weapon = weapon;
  938.             SetDvar( "scr_force_weapon", "" );
  939.         }
  940. #/
  941.  
  942.         self.base_weapon = self.weapon;
  943.         if ( !isdefined( level.random_weapon_powerups ) )
  944.         {
  945.             level.random_weapon_powerups = [];
  946.         }
  947.         level.random_weapon_powerups[level.random_weapon_powerups.size] = self;
  948.         self thread cleanup_random_weapon_list();
  949.  
  950.         if ( IsDefined( level.zombie_weapons[self.weapon].upgrade_name ) && !RandomInt( 4 ) ) // 25% chance
  951.         {
  952.             self.weapon = level.zombie_weapons[self.weapon].upgrade_name;
  953.         }
  954.  
  955.         self SetModel( GetWeaponModel( self.weapon ) );
  956.         self useweaponhidetags( self.weapon );
  957.  
  958.         offsetdw = ( 3, 3, 3 );
  959.         self.worldgundw = undefined;
  960.         if ( maps\_zombiemode_weapons::weapon_is_dual_wield( self.weapon ) )
  961.         {
  962.             self.worldgundw = spawn( "script_model", self.origin + offsetdw );
  963.             self.worldgundw.angles  = self.angles;
  964.             self.worldgundw setModel( maps\_zombiemode_weapons::get_left_hand_weapon_model_name( self.weapon ) );
  965.             self.worldgundw useweaponhidetags( self.weapon );
  966.             self.worldgundw LinkTo( self, "tag_weapon", offsetdw, (0, 0, 0) );
  967.         }
  968.     }
  969.     else
  970.     {
  971.         self SetModel( struct.model_name );
  972.     }
  973.  
  974.     //TUEY Spawn Powerup
  975.     playsoundatposition("zmb_spawn_powerup", self.origin);
  976.  
  977.     self.powerup_name       = struct.powerup_name;
  978.     self.hint               = struct.hint;
  979.     self.solo               = struct.solo;
  980.     self.caution            = struct.caution;
  981.     self.zombie_grabbable   = struct.zombie_grabbable;
  982.  
  983.     if( IsDefined( struct.fx ) )
  984.     {
  985.         self.fx = struct.fx;
  986.     }
  987.  
  988.     self PlayLoopSound("zmb_spawn_powerup_loop");
  989. }
  990.  
  991.  
  992. //
  993. //  Get the special teleporter drop
  994. special_drop_setup()
  995. {
  996.     powerup = undefined;
  997.     is_powerup = true;
  998.     // Always give something at lower rounds or if a player is in last stand mode.
  999.     if ( level.round_number <= 10 )
  1000.     {
  1001.         powerup = get_valid_powerup();
  1002.     }
  1003.     // Gets harder now
  1004.     else
  1005.     {
  1006.         powerup = level.zombie_special_drop_array[ RandomInt(level.zombie_special_drop_array.size) ];
  1007.         if ( level.round_number > 15 &&
  1008.              ( RandomInt(100) < (level.round_number - 15)*5 ) )
  1009.         {
  1010.             powerup = "nothing";
  1011.         }
  1012.     }
  1013.     //MM test  Change this if you want the same thing to keep spawning
  1014. //  powerup = "dog";
  1015.     switch ( powerup )
  1016.     {
  1017.     // Don't need to do anything special
  1018.     case "nuke":
  1019.     case "insta_kill":
  1020.     case "double_points":
  1021.     case "carpenter":
  1022.     case "fire_sale":
  1023.     case "bonfire_sale":
  1024.     case "all_revive":
  1025.     case "minigun":
  1026.     case "free_perk":
  1027.     case "tesla":
  1028.     case "random_weapon":
  1029.     case "bonus_points_player":
  1030.     case "bonus_points_team":
  1031.     case "lose_points_team":
  1032.     case "lose_perk":
  1033.     case "empty_clip":
  1034.         break;
  1035.  
  1036.     // Limit max ammo drops because it's too powerful
  1037.     case "full_ammo":
  1038.         if ( level.round_number > 10 &&
  1039.              ( RandomInt(100) < (level.round_number - 10)*5 ) )
  1040.         {
  1041.             // Randomly pick another one
  1042.             powerup = level.zombie_powerup_array[ RandomInt(level.zombie_powerup_array.size) ];
  1043.         }
  1044.         break;
  1045.  
  1046.     case "dog":
  1047.         if ( level.round_number >= 15 )
  1048.         {
  1049.             is_powerup = false;
  1050.             dog_spawners = GetEntArray( "special_dog_spawner", "targetname" );
  1051. //Z2    comment out for now so we don't need to include _zombiemode_dogs
  1052. //          maps\_zombiemode_dogs::special_dog_spawn( dog_spawners, 1 );
  1053.             //iprintlnbold( "Samantha Sez: No Powerup For You!" );
  1054.             thread play_sound_2d( "sam_nospawn" );
  1055.         }
  1056.         else
  1057.         {
  1058.             powerup = get_valid_powerup();
  1059.         }
  1060.         break;
  1061.  
  1062.     // Nothing drops!!
  1063.     default:    // "nothing"
  1064.  
  1065.         // RAVEN BEGIN bhackbarth: callback for level specific powerups
  1066.         if ( IsDefined( level._zombiemode_special_drop_setup ) )
  1067.         {
  1068.             is_powerup = [[ level._zombiemode_special_drop_setup ]]( powerup );
  1069.         }
  1070.         // RAVEN END
  1071.         else
  1072.         {
  1073.             is_powerup = false;
  1074.             Playfx( level._effect["lightning_dog_spawn"], self.origin );
  1075.             playsoundatposition( "pre_spawn", self.origin );
  1076.             wait( 1.5 );
  1077.             playsoundatposition( "zmb_bolt", self.origin );
  1078.  
  1079.             Earthquake( 0.5, 0.75, self.origin, 1000);
  1080.             PlayRumbleOnPosition("explosion_generic", self.origin);
  1081.             playsoundatposition( "spawn", self.origin );
  1082.  
  1083.             wait( 1.0 );
  1084.             //iprintlnbold( "Samantha Sez: No Powerup For You!" );
  1085.             thread play_sound_2d( "sam_nospawn" );
  1086.             self Delete();
  1087.         }
  1088.     }
  1089.  
  1090.     if ( is_powerup )
  1091.     {
  1092.         Playfx( level._effect["lightning_dog_spawn"], self.origin );
  1093.         playsoundatposition( "pre_spawn", self.origin );
  1094.         wait( 1.5 );
  1095.         playsoundatposition( "zmb_bolt", self.origin );
  1096.  
  1097.         Earthquake( 0.5, 0.75, self.origin, 1000);
  1098.         PlayRumbleOnPosition("explosion_generic", self.origin);
  1099.         playsoundatposition( "spawn", self.origin );
  1100.  
  1101. //      wait( 0.5 );
  1102.  
  1103.         self powerup_setup( powerup );
  1104.  
  1105.         self thread powerup_timeout();
  1106.         self thread powerup_wobble();
  1107.         self thread powerup_grab();
  1108.     }
  1109. }
  1110.  
  1111. powerup_zombie_grab_trigger_cleanup( trigger )
  1112. {
  1113.     self waittill_any( "powerup_timedout", "powerup_grabbed", "hacked" );
  1114.  
  1115.     trigger delete();
  1116. }
  1117.  
  1118. powerup_zombie_grab()
  1119. {
  1120.     self endon( "powerup_timedout" );
  1121.     self endon( "powerup_grabbed" );
  1122.     self endon( "hacked" );
  1123.    
  1124.     spawnflags = 1; // SF_TOUCH_AI_AXIS
  1125.     zombie_grab_trigger = spawn( "trigger_radius", self.origin - (0,0,40), spawnflags, 32, 72 );
  1126.     zombie_grab_trigger enablelinkto();
  1127.     zombie_grab_trigger linkto( self );
  1128.  
  1129.     self thread powerup_zombie_grab_trigger_cleanup( zombie_grab_trigger );
  1130.     zombie_grab_trigger create_zombie_point_of_interest( 300, 2, 0, true );
  1131.  
  1132.  
  1133.     while ( isdefined( self ) )
  1134.     {
  1135.         zombie_grab_trigger waittill( "trigger", who );
  1136.         if ( !isdefined( who ) || !IsAI( who ) )
  1137.         {
  1138.             continue;
  1139.         }
  1140.  
  1141.         playfx( level._effect["powerup_grabbed_red"], self.origin );   
  1142.         playfx( level._effect["powerup_grabbed_wave_red"], self.origin );  
  1143.  
  1144.         switch ( self.powerup_name )
  1145.         {
  1146.         case "lose_points_team":
  1147.             level thread lose_points_team_powerup( self );
  1148.            
  1149.             players = get_players();
  1150.             players[randomintrange(0,players.size)] thread powerup_vo( "lose_points" ); // TODO: Audio should uncomment this once the sounds have been set up
  1151.             break;
  1152.  
  1153.         case "lose_perk":
  1154.             level thread lose_perk_powerup( self );
  1155.            
  1156. //          players = get_players();
  1157. //          players[randomintrange(0,players.size)] thread powerup_vo( "lose_perk" ); // TODO: Audio should uncomment this once the sounds have been set up
  1158.             break;
  1159.  
  1160.         case "empty_clip":
  1161.             level thread empty_clip_powerup( self );
  1162.            
  1163. //          players = get_players();
  1164. //          players[randomintrange(0,players.size)] thread powerup_vo( "empty_clip" ); // TODO: Audio should uncomment this once the sounds have been set up
  1165.             break;
  1166.  
  1167.         default:
  1168.             if ( IsDefined( level._zombiemode_powerup_zombie_grab ) )
  1169.             {
  1170.                 level thread [[ level._zombiemode_powerup_zombie_grab ]]( self );
  1171.             }
  1172.             // RAVEN END
  1173.             else
  1174.             {
  1175.                 println("Unrecognized poweup.");
  1176.             }
  1177.  
  1178.             break;
  1179.         }
  1180.  
  1181.         level thread maps\_zombiemode_audio::do_announcer_playvox( level.devil_vox["powerup"][self.powerup_name] );
  1182.  
  1183.         wait( 0.1 );
  1184.  
  1185.         playsoundatposition( "zmb_powerup_grabbed", self.origin );
  1186.         self stoploopsound();
  1187.  
  1188.         if ( isdefined( self.worldgundw ) )
  1189.         {
  1190.             self.worldgundw delete();
  1191.         }
  1192.         self delete();
  1193.         self notify( "powerup_grabbed" );
  1194.     }
  1195. }
  1196.  
  1197. powerup_grab()
  1198. {
  1199.     if ( isdefined( self ) && self.zombie_grabbable )
  1200.     {
  1201.         self thread powerup_zombie_grab();
  1202.         return;
  1203.     }
  1204.  
  1205.     self endon ("powerup_timedout");
  1206.     self endon ("powerup_grabbed");
  1207.  
  1208.     range_squared = 64 * 64;
  1209.     while (isdefined(self))
  1210.     {
  1211.         players = get_players();
  1212.  
  1213.         for (i = 0; i < players.size; i++)
  1214.         {
  1215.             // Don't let them grab the minigun, tesla, or random weapon if they're downed or reviving
  1216.             //  due to weapon switching issues.
  1217.             if ( (self.powerup_name == "minigun" || self.powerup_name == "tesla" || self.powerup_name == "random_weapon") &&
  1218.                 ( players[i] maps\_laststand::player_is_in_laststand() ||
  1219.                   ( players[i] UseButtonPressed() && players[i] in_revive_trigger() ) ) )
  1220.             {
  1221.                 continue;
  1222.             }
  1223.            
  1224.             if ( DistanceSquared( players[i].origin, self.origin ) < range_squared )
  1225.             {
  1226.                 if( IsDefined( level.zombie_powerup_grab_func ) )
  1227.                 {
  1228.                     level thread [[level.zombie_powerup_grab_func]]();
  1229.                 }
  1230.                 else
  1231.                 {
  1232.                     switch (self.powerup_name)
  1233.                     {
  1234.                     case "nuke":
  1235.                         level thread nuke_powerup( self );
  1236.                        
  1237.                         //chrisp - adding powerup VO sounds
  1238.                         players[i] thread powerup_vo("nuke");
  1239.                         zombies = getaiarray("axis");
  1240.                         players[i].zombie_nuked = get_array_of_closest( self.origin, zombies );
  1241.                         players[i] notify("nuke_triggered");
  1242.                        
  1243.                         break;
  1244.                     case "full_ammo":
  1245.                         level thread full_ammo_powerup( self );
  1246.                         players[i] thread powerup_vo("full_ammo");
  1247.                         break;
  1248.                     case "double_points":
  1249.                         level thread double_points_powerup( self );
  1250.                         players[i] thread powerup_vo("double_points");
  1251.                         break;
  1252.                     case "insta_kill":
  1253.                         level thread insta_kill_powerup( self );
  1254.                         players[i] thread powerup_vo("insta_kill");
  1255.                         break;
  1256.                     case "carpenter":
  1257.                         if(isDefined(level.use_new_carpenter_func))
  1258.                         {
  1259.                             level thread [[level.use_new_carpenter_func]](self.origin);
  1260.                         }
  1261.                         else
  1262.                         {
  1263.                             level thread start_carpenter( self.origin );
  1264.                         }
  1265.                         players[i] thread powerup_vo("carpenter");
  1266.                         break;
  1267.  
  1268.                     case "fire_sale":
  1269.                         level thread start_fire_sale( self );
  1270.                         players[i] thread powerup_vo("firesale");
  1271.                         break;
  1272.                        
  1273.                     case "bonfire_sale":
  1274.                         level thread start_bonfire_sale( self );
  1275.                         players[i] thread powerup_vo("firesale");
  1276.                         break;
  1277.                        
  1278.                     case "minigun":
  1279.                         level thread minigun_weapon_powerup( players[i] );
  1280.                         players[i] thread powerup_vo( "minigun" );
  1281.                         break;
  1282.  
  1283.                     case "free_perk":
  1284.                         level thread free_perk_powerup( self );
  1285.                         //players[i] thread powerup_vo( "insta_kill" );
  1286.                         break;
  1287.                        
  1288.                     case "all_revive":
  1289.                         level thread start_revive_all( self );
  1290.                         players[i] thread powerup_vo("revive");
  1291.                         break;
  1292.                        
  1293.                     case "tesla":
  1294.                         level thread tesla_weapon_powerup( players[i] );
  1295.                         players[i] thread powerup_vo( "tesla" ); // TODO: Audio should uncomment this once the sounds have been set up
  1296.                         break;
  1297.  
  1298.                     case "random_weapon":
  1299.                         if ( !level random_weapon_powerup( self, players[i] ) )
  1300.                         {
  1301.                             continue;
  1302.                         }
  1303.                         // players[i] thread powerup_vo( "random_weapon" ); // TODO: Audio should uncomment this once the sounds have been set up
  1304.                         break;
  1305.  
  1306.                     case "bonus_points_player":
  1307.                         level thread bonus_points_player_powerup( self, players[i] );
  1308.                         players[i] thread powerup_vo( "bonus_points_solo" ); // TODO: Audio should uncomment this once the sounds have been set up
  1309.                         break;
  1310.  
  1311.                     case "bonus_points_team":
  1312.                         level thread bonus_points_team_powerup( self );
  1313.                         players[i] thread powerup_vo( "bonus_points_team" ); // TODO: Audio should uncomment this once the sounds have been set up
  1314.                         break;
  1315.  
  1316.                     default:
  1317.                         // RAVEN BEGIN bhackbarth: callback for level specific powerups
  1318.                         if ( IsDefined( level._zombiemode_powerup_grab ) )
  1319.                         {
  1320.                             level thread [[ level._zombiemode_powerup_grab ]]( self );
  1321.                         }
  1322.                         // RAVEN END
  1323.                         else
  1324.                         {
  1325.                             println ("Unrecognized poweup.");
  1326.                         }
  1327.  
  1328.                         break;
  1329.  
  1330.                     }
  1331.                 }
  1332.                
  1333.                 if ( self.solo )
  1334.                 {
  1335.                     playfx( level._effect["powerup_grabbed_solo"], self.origin );
  1336.                     playfx( level._effect["powerup_grabbed_wave_solo"], self.origin );
  1337.                 }
  1338.                 else if ( self.caution )
  1339.                 {
  1340.                     playfx( level._effect["powerup_grabbed_caution"], self.origin );
  1341.                     playfx( level._effect["powerup_grabbed_wave_caution"], self.origin );
  1342.                 }
  1343.                 else
  1344.                 {
  1345.                     playfx( level._effect["powerup_grabbed"], self.origin );
  1346.                     playfx( level._effect["powerup_grabbed_wave"], self.origin );
  1347.                 }
  1348.  
  1349.                 if ( is_true( self.stolen ) )
  1350.                 {
  1351.                     level notify( "monkey_see_monkey_dont_achieved" );
  1352.                 }
  1353.  
  1354.                 // RAVEN BEGIN bhackbarth: since there is a wait here, flag the powerup as being taken
  1355.                 self.claimed = true;
  1356.                 self.power_up_grab_player = players[i]; //Player who grabbed the power up
  1357.                 // RAVEN END
  1358.  
  1359.                 wait( 0.1 );
  1360.                
  1361.                 playsoundatposition("zmb_powerup_grabbed", self.origin);
  1362.                 self stoploopsound();
  1363.                
  1364.                 //Preventing the line from playing AGAIN if fire sale becomes active before it runs out
  1365.                 if( self.powerup_name != "fire_sale" )
  1366.                 {
  1367.                     level thread maps\_zombiemode_audio::do_announcer_playvox( level.devil_vox["powerup"][self.powerup_name] );
  1368.                 }
  1369.  
  1370.                 if ( isdefined( self.worldgundw ) )
  1371.                 {
  1372.                     self.worldgundw delete();
  1373.                 }
  1374.                 self delete();
  1375.                 self notify ("powerup_grabbed");
  1376.             }
  1377.         }
  1378.         wait 0.1;
  1379.     }  
  1380. }
  1381.  
  1382. //PI ESM - revive all players in last stand on the map
  1383. start_revive_all( item )
  1384. {
  1385.     players = get_players();
  1386.     reviver = players[0];
  1387.  
  1388.     for ( i = 0; i < players.size; i++ )
  1389.     {
  1390.         if ( !players[i] maps\_laststand::player_is_in_laststand() )
  1391.         {
  1392.             reviver = players[i];
  1393.             break;
  1394.         }
  1395.     }
  1396.  
  1397.     for ( i = 0; i < players.size; i++ )
  1398.     {
  1399.         if ( players[i] maps\_laststand::player_is_in_laststand() )
  1400.         {
  1401.             players[i] maps\_laststand::revive_force_revive( reviver );
  1402.             players[i] notify ( "zombified" );
  1403.         }
  1404.     }
  1405. }
  1406.  
  1407. start_fire_sale( item )
  1408. {
  1409.  
  1410.     level notify ("powerup fire sale");
  1411.     level endon ("powerup fire sale");
  1412.    
  1413.     level thread maps\_zombiemode_audio::do_announcer_playvox( level.devil_vox["powerup"]["fire_sale_short"] );
  1414.    
  1415.     level.zombie_vars["zombie_powerup_fire_sale_on"] = true;
  1416.     level thread toggle_fire_sale_on();
  1417.     level.zombie_vars["zombie_powerup_fire_sale_time"] = 30;
  1418.  
  1419.     while ( level.zombie_vars["zombie_powerup_fire_sale_time"] > 0)
  1420.     {
  1421.         wait(0.1);
  1422.         level.zombie_vars["zombie_powerup_fire_sale_time"] = level.zombie_vars["zombie_powerup_fire_sale_time"] - 0.1;
  1423.     }
  1424.  
  1425.     level.zombie_vars["zombie_powerup_fire_sale_on"] = false;
  1426.     level notify ( "fire_sale_off" );
  1427.    
  1428. }
  1429.  
  1430.  
  1431. start_bonfire_sale( item )
  1432. {
  1433.  
  1434.     level notify ("powerup bonfire sale");
  1435.     level endon ("powerup bonfire sale");
  1436.    
  1437.     temp_ent = spawn("script_origin", (0,0,0));
  1438.     temp_ent playloopsound ("zmb_double_point_loop");
  1439.  
  1440.     level.zombie_vars["zombie_powerup_bonfire_sale_on"] = true;
  1441.     level thread toggle_bonfire_sale_on();
  1442.     level.zombie_vars["zombie_powerup_bonfire_sale_time"] = 30;
  1443.  
  1444.     while ( level.zombie_vars["zombie_powerup_bonfire_sale_time"] > 0)
  1445.     {
  1446.         wait(0.1);
  1447.         level.zombie_vars["zombie_powerup_bonfire_sale_time"] = level.zombie_vars["zombie_powerup_bonfire_sale_time"] - 0.1;
  1448.     }
  1449.  
  1450.     level.zombie_vars["zombie_powerup_bonfire_sale_on"] = false;
  1451.     level notify ( "bonfire_sale_off" );
  1452.    
  1453.     players = get_players();
  1454.     for (i = 0; i < players.size; i++)
  1455.     {
  1456.         players[i] playsound("zmb_points_loop_off");
  1457.     }
  1458.    
  1459.     temp_ent Delete();
  1460. }
  1461.  
  1462.  
  1463. start_carpenter( origin )
  1464. {
  1465.  
  1466.     //level thread maps\_zombiemode_audio::do_announcer_playvox( level.devil_vox["powerup"]["carpenter"] );
  1467.     window_boards = getstructarray( "exterior_goal", "targetname" );
  1468.     total = level.exterior_goals.size;
  1469.    
  1470.     //COLLIN
  1471.     carp_ent = spawn("script_origin", (0,0,0));
  1472.     carp_ent playloopsound( "evt_carpenter" );
  1473.    
  1474.     while(true)
  1475.     {
  1476.         windows = get_closest_window_repair(window_boards, origin);
  1477.         if( !IsDefined( windows ) )
  1478.         {
  1479.             carp_ent stoploopsound( 1 );
  1480.             carp_ent playsound( "evt_carpenter_end", "sound_done" );
  1481.             carp_ent waittill( "sound_done" );
  1482.             break;
  1483.         }
  1484.        
  1485.         else
  1486.             window_boards = array_remove(window_boards, windows);
  1487.  
  1488.  
  1489.         while(1)
  1490.         {
  1491.             if( all_chunks_intact( windows.barrier_chunks ) )
  1492.             {
  1493.                 break;
  1494.             }
  1495.  
  1496.             chunk = get_random_destroyed_chunk( windows.barrier_chunks );
  1497.  
  1498.             if( !IsDefined( chunk ) )
  1499.                 break;
  1500.  
  1501.             windows thread maps\_zombiemode_blockers::replace_chunk( chunk, undefined, true );
  1502.             windows.clip enable_trigger();
  1503.             windows.clip DisconnectPaths();
  1504.             wait_network_frame();
  1505.             wait(0.05);
  1506.         }
  1507.          
  1508.         wait_network_frame();
  1509.     }
  1510.    
  1511.     players = get_players();
  1512.     for(i = 0; i < players.size; i++)
  1513.     {
  1514.         players[i] maps\_zombiemode_score::player_add_points( "carpenter_powerup", 200 );
  1515.     }
  1516.    
  1517.     carp_ent delete();
  1518.    
  1519. }
  1520.  
  1521.  
  1522.  
  1523. get_closest_window_repair( windows, origin )
  1524. {
  1525.     current_window = undefined;
  1526.     shortest_distance = undefined;
  1527.     for( i = 0; i < windows.size; i++ )
  1528.     {
  1529.         if( all_chunks_intact(windows[i].barrier_chunks ) )
  1530.             continue;
  1531.  
  1532.         if( !IsDefined( current_window ) ) 
  1533.         {
  1534.             current_window = windows[i];
  1535.             shortest_distance = DistanceSquared( current_window.origin, origin );
  1536.            
  1537.         }
  1538.         else
  1539.         {
  1540.             if( DistanceSquared(windows[i].origin, origin) < shortest_distance )
  1541.             {
  1542.  
  1543.                 current_window = windows[i];
  1544.                 shortest_distance =  DistanceSquared( windows[i].origin, origin );
  1545.             }
  1546.  
  1547.         }
  1548.  
  1549.     }
  1550.  
  1551.     return current_window;
  1552.  
  1553.  
  1554. }
  1555.  
  1556. //SELF = Player
  1557. powerup_vo( type )
  1558. {
  1559.     self endon("death");
  1560.     self endon("disconnect");
  1561.    
  1562.     wait(randomfloatrange(4.5,5.5));
  1563.    
  1564.     if( type == "tesla" )
  1565.     {
  1566.         self maps\_zombiemode_audio::create_and_play_dialog( "weapon_pickup", type );
  1567.     }
  1568.     else
  1569.     {
  1570.         self maps\_zombiemode_audio::create_and_play_dialog( "powerup", type );
  1571.     }
  1572. }
  1573.  
  1574. powerup_wobble()
  1575. {
  1576.     self endon( "powerup_grabbed" );
  1577.     self endon( "powerup_timedout" );
  1578.  
  1579.     if ( isdefined( self ) )
  1580.     {
  1581.         if( isDefined(level.powerup_fx_func) )
  1582.         {
  1583.             self thread [[level.powerup_fx_func]]();
  1584.         }
  1585.         else if( self.solo )
  1586.         {
  1587.             playfxontag( level._effect["powerup_on_solo"], self, "tag_origin" );
  1588.         }
  1589.         else if( self.caution )
  1590.         {
  1591.             playfxontag( level._effect["powerup_on_caution"], self, "tag_origin" );
  1592.         }
  1593.         else if( self.zombie_grabbable )
  1594.         {
  1595.             PlayFXOnTag( level._effect[ "powerup_on_red" ], self, "tag_origin" );
  1596.         }
  1597.         else
  1598.         {
  1599.             playfxontag( level._effect["powerup_on"], self, "tag_origin" );
  1600.         }
  1601.     }
  1602.  
  1603.     while ( isdefined( self ) )
  1604.     {
  1605.         waittime = randomfloatrange( 2.5, 5 );
  1606.         yaw = RandomInt( 360 );
  1607.         if( yaw > 300 )
  1608.         {
  1609.             yaw = 300;
  1610.         }
  1611.         else if( yaw < 60 )
  1612.         {
  1613.             yaw = 60;
  1614.         }
  1615.         yaw = self.angles[1] + yaw;
  1616.         new_angles = (-60 + randomint( 120 ), yaw, -45 + randomint( 90 ));
  1617.         self rotateto( new_angles, waittime, waittime * 0.5, waittime * 0.5 );
  1618.         if ( isdefined( self.worldgundw ) )
  1619.         {
  1620.             self.worldgundw rotateto( new_angles, waittime, waittime * 0.5, waittime * 0.5 );
  1621.         }
  1622.         wait randomfloat( waittime - 0.1 );
  1623.     }
  1624. }
  1625.  
  1626. powerup_timeout()
  1627. {
  1628.     self endon( "powerup_grabbed" );
  1629.     self endon( "death" );
  1630.  
  1631.     wait 15;
  1632.  
  1633.     for ( i = 0; i < 40; i++ )
  1634.     {
  1635.         // hide and show
  1636.         if ( i % 2 )
  1637.         {
  1638.             self hide();
  1639.             if ( isdefined( self.worldgundw ) )
  1640.             {
  1641.                 self.worldgundw hide();
  1642.             }
  1643.         }
  1644.         else
  1645.         {
  1646.             self show();
  1647.             if ( isdefined( self.worldgundw ) )
  1648.             {
  1649.                 self.worldgundw show();
  1650.             }
  1651.         }
  1652.  
  1653.         if ( i < 15 )
  1654.         {
  1655.             wait( 0.5 );
  1656.         }
  1657.         else if ( i < 25 )
  1658.         {
  1659.             wait( 0.25 );
  1660.         }
  1661.         else
  1662.         {
  1663.             wait( 0.1 );
  1664.         }
  1665.     }
  1666.  
  1667.     self notify( "powerup_timedout" );
  1668.  
  1669.     if ( isdefined( self.worldgundw ) )
  1670.     {
  1671.         self.worldgundw delete();
  1672.     }
  1673.     self delete();
  1674. }
  1675.  
  1676. // kill them all!
  1677. nuke_powerup( drop_item )
  1678. {
  1679.     zombies = getaispeciesarray("axis");
  1680.     location = drop_item.origin;
  1681.  
  1682.     PlayFx( drop_item.fx, location );
  1683.     level thread nuke_flash();
  1684.  
  1685.     wait( 0.5 );
  1686.  
  1687.    
  1688.     zombies = get_array_of_closest( location, zombies );
  1689.     zombies_nuked = [];
  1690.  
  1691.     // Mark them for death
  1692.     for (i = 0; i < zombies.size; i++)
  1693.     {
  1694.         // already going to die
  1695.         if ( IsDefined(zombies[i].marked_for_death) && zombies[i].marked_for_death )
  1696.         {
  1697.             continue;
  1698.         }
  1699.  
  1700.         // check for custom damage func
  1701.         if ( IsDefined(zombies[i].nuke_damage_func) )
  1702.         {
  1703.             zombies[i] thread [[ zombies[i].nuke_damage_func ]]();
  1704.             continue;
  1705.         }
  1706.        
  1707.         if( is_magic_bullet_shield_enabled( zombies[i] ) )
  1708.         {
  1709.             continue;
  1710.         }
  1711.  
  1712.         zombies[i].marked_for_death = true;
  1713.         zombies[i].nuked = true;
  1714.         zombies_nuked[ zombies_nuked.size ] = zombies[i];
  1715.     }
  1716.  
  1717.     for (i = 0; i < zombies_nuked.size; i++)
  1718.     {
  1719.         wait (randomfloatrange(0.1, 0.7));
  1720.         if( !IsDefined( zombies_nuked[i] ) )
  1721.         {
  1722.             continue;
  1723.         }
  1724.  
  1725.         if( is_magic_bullet_shield_enabled( zombies_nuked[i] ) )
  1726.         {
  1727.             continue;
  1728.         }
  1729.  
  1730.         if( i < 5 && !( zombies_nuked[i].isdog ) )
  1731.         {
  1732.             zombies_nuked[i] thread animscripts\zombie_death::flame_death_fx();
  1733.             zombies_nuked[i] playsound ("evt_nuked");
  1734.  
  1735.         }
  1736.  
  1737.         if( !( zombies_nuked[i].isdog ) )
  1738.         {
  1739.             if ( !is_true( zombies_nuked[i].no_gib ) )
  1740.             {
  1741.                 zombies_nuked[i] maps\_zombiemode_spawner::zombie_head_gib();
  1742.             }
  1743.             zombies_nuked[i] playsound ("evt_nuked");
  1744.         }
  1745.        
  1746.  
  1747.         zombies_nuked[i] dodamage( zombies_nuked[i].health + 666, zombies_nuked[i].origin );
  1748.     }
  1749.  
  1750.     players = get_players();
  1751.     for(i = 0; i < players.size; i++)
  1752.     {
  1753.         players[i] maps\_zombiemode_score::player_add_points( "nuke_powerup", 400 );
  1754.     }
  1755. }
  1756.  
  1757. nuke_flash()
  1758. {
  1759.     players = getplayers();
  1760.     for(i=0; i<players.size; i ++)
  1761.     {
  1762.         players[i] play_sound_2d("evt_nuke_flash");
  1763.     }
  1764.     level thread devil_dialog_delay();
  1765.    
  1766.    
  1767.     fadetowhite = newhudelem();
  1768.  
  1769.     fadetowhite.x = 0;
  1770.     fadetowhite.y = 0;
  1771.     fadetowhite.alpha = 0;
  1772.  
  1773.     fadetowhite.horzAlign = "fullscreen";
  1774.     fadetowhite.vertAlign = "fullscreen";
  1775.     fadetowhite.foreground = true;
  1776.     fadetowhite SetShader( "white", 640, 480 );
  1777.  
  1778.     // Fade into white
  1779.     fadetowhite FadeOverTime( 0.2 );
  1780.     fadetowhite.alpha = 0.8;
  1781.  
  1782.     wait 0.5;
  1783.     fadetowhite FadeOverTime( 1.0 );
  1784.     fadetowhite.alpha = 0;
  1785.  
  1786.     wait 1.1;
  1787.     fadetowhite destroy();
  1788. }
  1789.  
  1790.  
  1791. // double the points
  1792. double_points_powerup( drop_item )
  1793. {
  1794.     level notify ("powerup points scaled");
  1795.     level endon ("powerup points scaled");
  1796.  
  1797.     //  players = get_players();   
  1798.     //  array_thread(level,::point_doubler_on_hud, drop_item);
  1799.     level thread point_doubler_on_hud( drop_item );
  1800.  
  1801.     level.zombie_vars["zombie_point_scalar"] = 2;
  1802.     wait 30;
  1803.  
  1804.     level.zombie_vars["zombie_point_scalar"] = 1;
  1805. }
  1806.  
  1807. full_ammo_powerup( drop_item )
  1808. {
  1809.     players = get_players();
  1810.     for (i = 0; i < players.size; i++)
  1811.     {
  1812.         // skip players in last stand
  1813.         if ( players[i] maps\_laststand::player_is_in_laststand() )
  1814.         {
  1815.             continue;
  1816.         }
  1817.  
  1818.         primary_weapons = players[i] GetWeaponsList();
  1819.  
  1820.         players[i] notify( "zmb_max_ammo" );
  1821.         players[i] notify( "zmb_lost_knife" );
  1822.         players[i] notify( "zmb_disable_claymore_prompt" );
  1823.         players[i] notify( "zmb_disable_spikemore_prompt" );
  1824.         for( x = 0; x < primary_weapons.size; x++ )
  1825.         {
  1826.             // Fill the clip
  1827.             //players[i] SetWeaponAmmoClip( primary_weapons[x], WeaponClipSize( primary_weapons[x] ) );
  1828.  
  1829.             players[i] GiveMaxAmmo( primary_weapons[x] );
  1830.         }
  1831.     }
  1832.     //  array_thread (players, ::full_ammo_on_hud, drop_item);
  1833.     level thread full_ammo_on_hud( drop_item );
  1834. }
  1835.  
  1836. insta_kill_powerup( drop_item )
  1837. {
  1838.     level notify( "powerup instakill" );
  1839.     level endon( "powerup instakill" );
  1840.  
  1841.        
  1842.     //  array_thread (players, ::insta_kill_on_hud, drop_item);
  1843.     level thread insta_kill_on_hud( drop_item );
  1844.  
  1845.     level.zombie_vars["zombie_insta_kill"] = 1;
  1846.     wait( 30 );
  1847.     level.zombie_vars["zombie_insta_kill"] = 0;
  1848.     players = get_players();
  1849.     for(i = 0; i < players.size; i++)
  1850.     {
  1851.         players[i] notify("insta_kill_over");
  1852.  
  1853.     }
  1854.  
  1855. }
  1856.  
  1857. check_for_instakill( player, mod, hit_location )
  1858. {
  1859.     if( level.mutators["mutator_noPowerups"] )
  1860.     {
  1861.         return;
  1862.     }
  1863.     if( IsDefined( player ) && IsAlive( player ) && (level.zombie_vars["zombie_insta_kill"] || is_true( player.personal_instakill )) )
  1864.     {
  1865.         if( is_magic_bullet_shield_enabled( self ) )
  1866.         {
  1867.             return;
  1868.         }
  1869.  
  1870.         if ( IsDefined( self.instakill_func ) )
  1871.         {
  1872.             self thread [[ self.instakill_func ]]();
  1873.             return;
  1874.         }
  1875.  
  1876.         if(player.use_weapon_type == "MOD_MELEE")
  1877.         {
  1878.             player.last_kill_method = "MOD_MELEE";
  1879.         }
  1880.         else
  1881.         {
  1882.             player.last_kill_method = "MOD_UNKNOWN";
  1883.  
  1884.         }
  1885.  
  1886.         modName = remove_mod_from_methodofdeath( mod );
  1887.         if( flag( "dog_round" ) )
  1888.         {
  1889.             self DoDamage( self.health * 10, self.origin, player, undefined, modName, hit_location );
  1890.             player notify("zombie_killed");
  1891.         }
  1892.         else
  1893.         {
  1894.             if ( !is_true( self.no_gib ) )
  1895.             {
  1896.                 self maps\_zombiemode_spawner::zombie_head_gib();
  1897.             }
  1898.             self DoDamage( self.health * 10, self.origin, player, undefined, modName, hit_location );
  1899.             player notify("zombie_killed");
  1900.            
  1901.         }
  1902.     }
  1903. }
  1904.  
  1905. insta_kill_on_hud( drop_item )
  1906. {
  1907.     self endon ("disconnect");
  1908.  
  1909.     // check to see if this is on or not
  1910.     if ( level.zombie_vars["zombie_powerup_insta_kill_on"] )
  1911.     {
  1912.         // reset the time and keep going
  1913.         level.zombie_vars["zombie_powerup_insta_kill_time"] = 30;
  1914.         return;
  1915.     }
  1916.  
  1917.     level.zombie_vars["zombie_powerup_insta_kill_on"] = true;
  1918.  
  1919.     // set up the hudelem
  1920.     //hudelem = maps\_hud_util::createFontString( "objective", 2 );
  1921.     //hudelem maps\_hud_util::setPoint( "TOP", undefined, 0, level.zombie_vars["zombie_timer_offset"] + level.zombie_vars["zombie_timer_offset_interval"]);
  1922.     //hudelem.sort = 0.5;
  1923.     //hudelem.alpha = 0;
  1924.     //hudelem fadeovertime(0.5);
  1925.     //hudelem.alpha = 1;
  1926.     //hudelem.label = drop_item.hint;
  1927.  
  1928.     // set time remaining for insta kill
  1929.     level thread time_remaning_on_insta_kill_powerup();    
  1930.  
  1931.     // offset in case we get another powerup
  1932.     //level.zombie_timer_offset -= level.zombie_timer_offset_interval;
  1933. }
  1934.  
  1935. time_remaning_on_insta_kill_powerup()
  1936. {
  1937.     //self setvalue( level.zombie_vars["zombie_powerup_insta_kill_time"] );
  1938.     //level thread maps\_zombiemode_audio::do_announcer_playvox( level.devil_vox["powerup"]["instakill"] );
  1939.     temp_enta = spawn("script_origin", (0,0,0));
  1940.     temp_enta playloopsound("zmb_insta_kill_loop");
  1941.  
  1942.     /*
  1943.     players = get_players();
  1944.     for (i = 0; i < players.size; i++)
  1945.     {
  1946.     players[i] playloopsound ("zmb_insta_kill_loop");
  1947.     }
  1948.     */
  1949.  
  1950.  
  1951.     // time it down!
  1952.     while ( level.zombie_vars["zombie_powerup_insta_kill_time"] >= 0)
  1953.     {
  1954.         wait 0.1;
  1955.         level.zombie_vars["zombie_powerup_insta_kill_time"] = level.zombie_vars["zombie_powerup_insta_kill_time"] - 0.1;
  1956.     //  self setvalue( level.zombie_vars["zombie_powerup_insta_kill_time"] );  
  1957.     }
  1958.  
  1959.     players = get_players();
  1960.     for (i = 0; i < players.size; i++)
  1961.     {
  1962.         //players[i] stoploopsound (2);
  1963.  
  1964.         players[i] playsound("zmb_insta_kill");
  1965.  
  1966.     }
  1967.  
  1968.     temp_enta stoploopsound(2);
  1969.     // turn off the timer
  1970.     level.zombie_vars["zombie_powerup_insta_kill_on"] = false;
  1971.  
  1972.     // remove the offset to make room for new powerups, reset timer for next time
  1973.     level.zombie_vars["zombie_powerup_insta_kill_time"] = 30;
  1974.     //level.zombie_timer_offset += level.zombie_timer_offset_interval;
  1975.     //self destroy();
  1976.     temp_enta delete();
  1977. }
  1978.  
  1979. point_doubler_on_hud( drop_item )
  1980. {
  1981.     self endon ("disconnect");
  1982.  
  1983.     // check to see if this is on or not
  1984.     if ( level.zombie_vars["zombie_powerup_point_doubler_on"] )
  1985.     {
  1986.         // reset the time and keep going
  1987.         level.zombie_vars["zombie_powerup_point_doubler_time"] = 30;
  1988.         return;
  1989.     }
  1990.  
  1991.     level.zombie_vars["zombie_powerup_point_doubler_on"] = true;
  1992.     //level.powerup_hud_array[0] = true;
  1993.     // set up the hudelem
  1994.     //hudelem = maps\_hud_util::createFontString( "objective", 2 );
  1995.     //hudelem maps\_hud_util::setPoint( "TOP", undefined, 0, level.zombie_vars["zombie_timer_offset"] );
  1996.     //hudelem.sort = 0.5;
  1997.     //hudelem.alpha = 0;
  1998.     //hudelem fadeovertime( 0.5 );
  1999.     //hudelem.alpha = 1;
  2000.     //hudelem.label = drop_item.hint;
  2001.  
  2002.     // set time remaining for point doubler
  2003.     level thread time_remaining_on_point_doubler_powerup();    
  2004.  
  2005.     // offset in case we get another powerup
  2006.     //level.zombie_timer_offset -= level.zombie_timer_offset_interval;
  2007. }
  2008.  
  2009. time_remaining_on_point_doubler_powerup()
  2010. {
  2011.     //self setvalue( level.zombie_vars["zombie_powerup_point_doubler_time"] );
  2012.    
  2013.     temp_ent = spawn("script_origin", (0,0,0));
  2014.     temp_ent playloopsound ("zmb_double_point_loop");
  2015.    
  2016.     //level thread maps\_zombiemode_audio::do_announcer_playvox( level.devil_vox["powerup"]["doublepoints"] );
  2017.    
  2018.    
  2019.     // time it down!
  2020.     while ( level.zombie_vars["zombie_powerup_point_doubler_time"] >= 0)
  2021.     {
  2022.         wait 0.1;
  2023.         level.zombie_vars["zombie_powerup_point_doubler_time"] = level.zombie_vars["zombie_powerup_point_doubler_time"] - 0.1;
  2024.         //self setvalue( level.zombie_vars["zombie_powerup_point_doubler_time"] ); 
  2025.     }
  2026.  
  2027.     // turn off the timer
  2028.     level.zombie_vars["zombie_powerup_point_doubler_on"] = false;
  2029.     players = get_players();
  2030.     for (i = 0; i < players.size; i++)
  2031.     {
  2032.         //players[i] stoploopsound("zmb_double_point_loop", 2);
  2033.         players[i] playsound("zmb_points_loop_off");
  2034.     }
  2035.     temp_ent stoploopsound(2);
  2036.  
  2037.  
  2038.     // remove the offset to make room for new powerups, reset timer for next time
  2039.     level.zombie_vars["zombie_powerup_point_doubler_time"] = 30;
  2040.     //level.zombie_timer_offset += level.zombie_timer_offset_interval;
  2041.     //self destroy();
  2042.     temp_ent delete();
  2043. }
  2044. toggle_bonfire_sale_on()
  2045. {
  2046.     level endon ("powerup bonfire sale");
  2047.  
  2048.     if( !isdefined ( level.zombie_vars["zombie_powerup_bonfire_sale_on"] ) )
  2049.     {
  2050.         return;
  2051.     }
  2052.  
  2053.     if( level.zombie_vars["zombie_powerup_bonfire_sale_on"] )
  2054.     {
  2055.         if ( isdefined( level.bonfire_init_func ) )
  2056.         {
  2057.             level thread [[ level.bonfire_init_func ]]();
  2058.         }
  2059.         level waittill( "bonfire_sale_off" );
  2060.     }
  2061. }
  2062. toggle_fire_sale_on()
  2063. {
  2064.     level endon ("powerup fire sale");
  2065.  
  2066.     if( !isdefined ( level.zombie_vars["zombie_powerup_fire_sale_on"] ) )
  2067.     {
  2068.         return;
  2069.     }
  2070.  
  2071.     if( level.zombie_vars["zombie_powerup_fire_sale_on"] )
  2072.     {
  2073.         for( i = 0; i < level.chests.size; i++ )
  2074.         {
  2075.             show_firesale_box = level.chests[i] [[level._zombiemode_check_firesale_loc_valid_func]]();
  2076.            
  2077.             if(show_firesale_box)
  2078.             {
  2079.                 level.chests[i].zombie_cost = 10;
  2080.                 level.chests[i] set_hint_string( level.chests[i] , "powerup_fire_sale_cost" );
  2081.  
  2082.                 if( level.chest_index != i )
  2083.                 {
  2084.                     level.chests[i].was_temp = true;
  2085.                     level.chests[i] thread maps\_zombiemode_weapons::show_chest();
  2086.                     level.chests[i] thread maps\_zombiemode_weapons::hide_rubble();
  2087.                     wait_network_frame();
  2088.                 }
  2089.             }
  2090.         }
  2091.         level waittill( "fire_sale_off" );
  2092.  
  2093.         for( i = 0; i < level.chests.size; i++ )
  2094.         {
  2095.             show_firesale_box = level.chests[i] [[level._zombiemode_check_firesale_loc_valid_func]]();
  2096.  
  2097.             if(show_firesale_box)
  2098.             {
  2099.                 if( level.chest_index != i && IsDefined(level.chests[i].was_temp))
  2100.                 {
  2101.                     level.chests[i].was_temp = undefined;
  2102.                     level thread remove_temp_chest( i );
  2103.                 }
  2104.                
  2105.                 if(IsDefined(level.chests[i].grab_weapon_hint) && (level.chests[i].grab_weapon_hint == true))
  2106.                 {
  2107.                     level.chests[i] thread fire_sale_weapon_wait();
  2108.                 }
  2109.                 else
  2110.                 {          
  2111.                     level.chests[i].zombie_cost = level.chests[i].old_cost;
  2112.                     level.chests[i] set_hint_string( level.chests[i] , "default_treasure_chest_" + level.chests[i].zombie_cost );
  2113.                 }  
  2114.             }
  2115.         }
  2116.  
  2117.     }
  2118.  
  2119. }
  2120. //-------------------------------------------------------------------------------
  2121. //  DCS: Adding check if box is open to grab weapon when fire sale ends.
  2122. //-------------------------------------------------------------------------------
  2123. fire_sale_weapon_wait()
  2124. {
  2125.     self.zombie_cost = self.old_cost;
  2126.     while( isdefined( self.chest_user ) )
  2127.     {
  2128.         wait_network_frame();
  2129.     }
  2130.     self set_hint_string( self , "default_treasure_chest_" + self.zombie_cost );   
  2131. }  
  2132.  
  2133. //
  2134. //  Bring the chests back to normal.
  2135. remove_temp_chest( chest_index )
  2136. {
  2137.     while( isdefined( level.chests[chest_index].chest_user ) || (IsDefined(level.chests[chest_index]._box_open) && level.chests[chest_index]._box_open == true))
  2138.     {
  2139.         wait_network_frame();
  2140.     }
  2141.     playfx(level._effect["poltergeist"], level.chests[chest_index].orig_origin);
  2142.     level.chests[chest_index] playsound ( "zmb_box_poof_land" );
  2143.     level.chests[chest_index] playsound( "zmb_couch_slam" );
  2144.     level.chests[chest_index] maps\_zombiemode_weapons::hide_chest();
  2145.     level.chests[chest_index] maps\_zombiemode_weapons::show_rubble();
  2146. }
  2147.  
  2148.  
  2149. devil_dialog_delay()
  2150. {
  2151.     wait(1.0);
  2152.     //level thread maps\_zombiemode_audio::do_announcer_playvox( level.devil_vox["powerup"]["nuke"] );
  2153. }
  2154.  
  2155. full_ammo_on_hud( drop_item )
  2156. {
  2157.     self endon ("disconnect");
  2158.  
  2159.     // set up the hudelem
  2160.     hudelem = maps\_hud_util::createFontString( "objective", 2 );
  2161.     hudelem maps\_hud_util::setPoint( "TOP", undefined, 0, level.zombie_vars["zombie_timer_offset"] - (level.zombie_vars["zombie_timer_offset_interval"] * 2));
  2162.     hudelem.sort = 0.5;
  2163.     hudelem.alpha = 0;
  2164.     hudelem fadeovertime(0.5);
  2165.     hudelem.alpha = 1;
  2166.     hudelem.label = drop_item.hint;
  2167.  
  2168.     // set time remaining for insta kill
  2169.     hudelem thread full_ammo_move_hud();       
  2170.  
  2171.     // offset in case we get another powerup
  2172.     //level.zombie_timer_offset -= level.zombie_timer_offset_interval;
  2173. }
  2174.  
  2175. full_ammo_move_hud()
  2176. {
  2177.  
  2178.     players = get_players();
  2179.     //level thread maps\_zombiemode_audio::do_announcer_playvox( level.devil_vox["powerup"]["maxammo"] );
  2180.     for (i = 0; i < players.size; i++)
  2181.     {
  2182.         players[i] playsound ("zmb_full_ammo");
  2183.        
  2184.     }
  2185.     wait 0.5;
  2186.     move_fade_time = 1.5;
  2187.  
  2188.     self FadeOverTime( move_fade_time );
  2189.     self MoveOverTime( move_fade_time );
  2190.     self.y = 270;
  2191.     self.alpha = 0;
  2192.  
  2193.     wait move_fade_time;
  2194.  
  2195.     self destroy();
  2196. }
  2197.  
  2198.  
  2199. //*****************************************************************************
  2200. // Here we have a selection of special case rare powerups that may get dropped
  2201. // by the random powerup generator
  2202. //*****************************************************************************
  2203. check_for_rare_drop_override( pos )
  2204. {
  2205.     if( IsDefined(flag("ape_round")) && flag("ape_round") )
  2206.     {
  2207.         return( 0 );
  2208.     }
  2209.  
  2210.     return( 0 );
  2211. }
  2212. setup_firesale_audio()
  2213. {
  2214.     wait(2);
  2215.    
  2216.     intercom = getentarray ("intercom", "targetname");
  2217.     while(1)
  2218.     {  
  2219.         while( level.zombie_vars["zombie_powerup_fire_sale_on"] == false)
  2220.         {
  2221.             wait(0.2);     
  2222.         }  
  2223.         for(i=0;i<intercom.size;i++)
  2224.         {
  2225.             intercom[i] thread play_firesale_audio();
  2226.             //PlaySoundatposition( "zmb_vox_ann_firesale", intercom[i].origin );           
  2227.         }  
  2228.         while( level.zombie_vars["zombie_powerup_fire_sale_on"] == true)
  2229.         {
  2230.             wait (0.1);    
  2231.         }
  2232.         level notify ("firesale_over");
  2233.     }
  2234. }
  2235. play_firesale_audio()
  2236. {
  2237.     if( is_true(level.player_4_vox_override ))
  2238.     {
  2239.         self playloopsound ("mus_fire_sale_rich");
  2240.     }
  2241.     else
  2242.     {
  2243.         self playloopsound ("mus_fire_sale");
  2244.     }
  2245.    
  2246.     level waittill ("firesale_over");
  2247.     self stoploopsound (); 
  2248.    
  2249. }
  2250.  
  2251. setup_bonfiresale_audio()
  2252. {
  2253.     wait(2);
  2254.    
  2255.     intercom = getentarray ("intercom", "targetname");
  2256.     while(1)
  2257.     {  
  2258.         while( level.zombie_vars["zombie_powerup_fire_sale_on"] == false)
  2259.         {
  2260.             wait(0.2);     
  2261.         }  
  2262.         for(i=0;i<intercom.size;i++)
  2263.         {
  2264.             intercom[i] thread play_bonfiresale_audio();
  2265.             //PlaySoundatposition( "zmb_vox_ann_firesale", intercom[i].origin );           
  2266.         }  
  2267.         while( level.zombie_vars["zombie_powerup_fire_sale_on"] == true)
  2268.         {
  2269.             wait (0.1);    
  2270.         }
  2271.         level notify ("firesale_over");
  2272.     }
  2273. }
  2274. play_bonfiresale_audio()
  2275. {
  2276.     if( is_true( level.player_4_vox_override ))
  2277.     {
  2278.         self playloopsound ("mus_fire_sale_rich");
  2279.     }
  2280.     else
  2281.     {
  2282.         self playloopsound ("mus_fire_sale");
  2283.     }
  2284.    
  2285.     level waittill ("firesale_over");
  2286.     self stoploopsound (); 
  2287.    
  2288. }
  2289.  
  2290. //******************************************************************************
  2291. // free perk powerup
  2292. //******************************************************************************
  2293. free_perk_powerup( item )
  2294. {
  2295.     players = getplayers();
  2296.     for ( i = 0; i < players.size; i++ )
  2297.     {
  2298.         if ( !players[i] maps\_laststand::player_is_in_laststand() && !(players[i].sessionstate == "spectator") )
  2299.         {
  2300.             players[i] maps\_zombiemode_perks::give_random_perk();
  2301.         }
  2302.     }
  2303. }
  2304.  
  2305. //******************************************************************************
  2306. // random weapon powerup
  2307. //******************************************************************************
  2308. random_weapon_powerup_throttle()
  2309. {
  2310.     self.random_weapon_powerup_throttle = true;
  2311.     wait( 0.25 );
  2312.     self.random_weapon_powerup_throttle = false;
  2313. }
  2314.  
  2315.  
  2316. random_weapon_powerup( item, player )
  2317. {
  2318.     if ( player.sessionstate == "spectator" || player maps\_laststand::player_is_in_laststand() )
  2319.     {
  2320.         return false;
  2321.     }
  2322.    
  2323.     if ( is_true( player.random_weapon_powerup_throttle ) || player IsSwitchingWeapons() || player is_drinking() )
  2324.     {
  2325.         return false;
  2326.     }
  2327.    
  2328.     current_weapon = player GetCurrentWeapon();
  2329.     current_weapon_type = WeaponInventoryType( current_weapon );
  2330.     if ( !is_tactical_grenade( item.weapon ) )
  2331.     {
  2332.         if ( "primary" != current_weapon_type && "altmode" != current_weapon_type )
  2333.         {
  2334.             return false;
  2335.         }
  2336.  
  2337.         if ( !isdefined( level.zombie_weapons[current_weapon] ) && !maps\_zombiemode_weapons::is_weapon_upgraded( current_weapon ) && "altmode" != current_weapon_type )
  2338.         {
  2339.             return false;
  2340.         }
  2341.     }
  2342.  
  2343.     player thread random_weapon_powerup_throttle();
  2344.  
  2345.     weapon_string = item.weapon;
  2346.     if ( player HasWeapon( "bowie_knife_zm" ) )
  2347.     {
  2348.         if ( weapon_string == "knife_ballistic_zm" )
  2349.         {
  2350.             weapon_string = "knife_ballistic_bowie_zm";
  2351.         }
  2352.         else if ( weapon_string == "knife_ballistic_upgraded_zm" )
  2353.         {
  2354.             weapon_string = "knife_ballistic_bowie_upgraded_zm";
  2355.         }
  2356.     }
  2357.     else if ( player HasWeapon( "sickle_knife_zm" ) )
  2358.     {
  2359.         if ( weapon_string == "knife_ballistic_zm" )
  2360.         {
  2361.             weapon_string = "knife_ballistic_sickle_zm";
  2362.         }
  2363.         else if ( weapon_string == "knife_ballistic_upgraded_zm" )
  2364.         {
  2365.             weapon_string = "knife_ballistic_sickle_upgraded_zm";
  2366.         }
  2367.     }
  2368.  
  2369.     player thread maps\_zombiemode_weapons::weapon_give( weapon_string );
  2370.     return true;
  2371. }
  2372.  
  2373. //******************************************************************************
  2374. // bonus points powerups
  2375. //******************************************************************************
  2376. bonus_points_player_powerup( item, player )
  2377. {
  2378.     points = RandomIntRange( 1, 25 ) * 100;
  2379.  
  2380.     if ( !player maps\_laststand::player_is_in_laststand() && !(player.sessionstate == "spectator") )
  2381.     {
  2382.         player maps\_zombiemode_score::player_add_points( "bonus_points_powerup", points );
  2383.     }
  2384. }
  2385.  
  2386. bonus_points_team_powerup( item )
  2387. {
  2388.     points = RandomIntRange( 1, 25 ) * 100;
  2389.  
  2390.     players = getplayers();
  2391.     for ( i = 0; i < players.size; i++ )
  2392.     {
  2393.         if ( !players[i] maps\_laststand::player_is_in_laststand() && !(players[i].sessionstate == "spectator") )
  2394.         {
  2395.             players[i] maps\_zombiemode_score::player_add_points( "bonus_points_powerup", points );
  2396.         }
  2397.     }
  2398. }
  2399.  
  2400. lose_points_team_powerup( item )
  2401. {
  2402.     points = RandomIntRange( 1, 25 ) * 100;
  2403.  
  2404.     players = getplayers();
  2405.     for ( i = 0; i < players.size; i++ )
  2406.     {
  2407.         if ( !players[i] maps\_laststand::player_is_in_laststand() && !(players[i].sessionstate == "spectator") )
  2408.         {
  2409.             if ( 0 > (players[i].score - points) )
  2410.             {
  2411.                 players[i] maps\_zombiemode_score::minus_to_player_score( players[i].score );
  2412.             }
  2413.             else
  2414.             {
  2415.                 players[i] maps\_zombiemode_score::minus_to_player_score( points );
  2416.             }
  2417.         }
  2418.     }
  2419. }
  2420.  
  2421. //******************************************************************************
  2422. // lose perk powerup
  2423. //******************************************************************************
  2424. lose_perk_powerup( item )
  2425. {
  2426.     players = getplayers();
  2427.     for ( i = 0; i < players.size; i++ )
  2428.     {
  2429.         player = players[i];
  2430.  
  2431.         if ( !player maps\_laststand::player_is_in_laststand() && !(player.sessionstate == "spectator") )
  2432.         {
  2433.             player maps\_zombiemode_perks::lose_random_perk();
  2434.         }
  2435.     }
  2436. }
  2437.  
  2438. //******************************************************************************
  2439. // empty clip powerup
  2440. //******************************************************************************
  2441. empty_clip_powerup( item )
  2442. {
  2443.     players = getplayers();
  2444.     for ( i = 0; i < players.size; i++ )
  2445.     {
  2446.         player = players[i];
  2447.  
  2448.         if ( !player maps\_laststand::player_is_in_laststand() && !(player.sessionstate == "spectator") )
  2449.         {
  2450.             weapon = player GetCurrentWeapon();
  2451.             player SetWeaponAmmoClip( weapon, 0 );
  2452.         }
  2453.     }
  2454. }
  2455.  
  2456. //******************************************************************************
  2457. // Minigun powerup
  2458. //******************************************************************************
  2459. minigun_weapon_powerup( ent_player, time )
  2460. {
  2461.     ent_player endon( "disconnect" );
  2462.     ent_player endon( "death" );
  2463.     ent_player endon( "player_downed" );
  2464.    
  2465.     if ( !IsDefined( time ) )
  2466.     {
  2467.         time = 30;
  2468.     }
  2469.  
  2470.     // Just replenish the time if it's already active
  2471.     if ( ent_player.zombie_vars[ "zombie_powerup_minigun_on" ] &&
  2472.          ("minigun_zm" == ent_player GetCurrentWeapon() || (IsDefined(ent_player.has_minigun) && ent_player.has_minigun) ))
  2473.     {
  2474.         if ( ent_player.zombie_vars["zombie_powerup_minigun_time"] < time )
  2475.         {
  2476.             ent_player.zombie_vars["zombie_powerup_minigun_time"] = time;
  2477.         }
  2478.         return;
  2479.     }
  2480.  
  2481.     ent_player notify( "replace_weapon_powerup" );
  2482.     ent_player._show_solo_hud = true;
  2483.    
  2484.     // make sure weapons are replaced properly if the player is downed
  2485.     level._zombie_minigun_powerup_last_stand_func = ::minigun_watch_gunner_downed;
  2486.     ent_player.has_minigun = true;
  2487.     ent_player.has_powerup_weapon = true;
  2488.    
  2489.     ent_player increment_is_drinking();
  2490.     ent_player._zombie_gun_before_minigun = ent_player GetCurrentWeapon();
  2491.    
  2492.     // give player a minigun
  2493.     ent_player GiveWeapon( "minigun_zm" );
  2494.     ent_player SwitchToWeapon( "minigun_zm" );
  2495.    
  2496.     ent_player.zombie_vars[ "zombie_powerup_minigun_on" ] = true;
  2497.    
  2498.     level thread minigun_weapon_powerup_countdown( ent_player, "minigun_time_over", time );
  2499.     level thread minigun_weapon_powerup_replace( ent_player, "minigun_time_over" );
  2500. }
  2501.  
  2502. minigun_weapon_powerup_countdown( ent_player, str_gun_return_notify, time )
  2503. {
  2504.     ent_player endon( "death" );
  2505.     ent_player endon( "disconnect" );
  2506.     ent_player endon( "player_downed" );
  2507.     ent_player endon( str_gun_return_notify );
  2508.     ent_player endon( "replace_weapon_powerup" );
  2509.    
  2510.     //AUDIO: Starting powerup loop on ONLY this player
  2511.     setClientSysState( "levelNotify", "minis", ent_player );
  2512.  
  2513.     ent_player.zombie_vars["zombie_powerup_minigun_time"] = time;
  2514.     while ( ent_player.zombie_vars["zombie_powerup_minigun_time"] > 0)
  2515.     {
  2516.         wait(1.0);
  2517.         ent_player.zombie_vars["zombie_powerup_minigun_time"]--;
  2518.     }
  2519.    
  2520.     //AUDIO: Ending powerup loop on ONLY this player
  2521.     setClientSysState( "levelNotify", "minie", ent_player );
  2522.    
  2523.     level thread minigun_weapon_powerup_remove( ent_player, str_gun_return_notify );
  2524.    
  2525. }
  2526.  
  2527.  
  2528. minigun_weapon_powerup_replace( ent_player, str_gun_return_notify )
  2529. {
  2530.     ent_player endon( "death" );
  2531.     ent_player endon( "disconnect" );
  2532.     ent_player endon( "player_downed" );
  2533.     ent_player endon( str_gun_return_notify );
  2534.  
  2535.     ent_player waittill( "replace_weapon_powerup" );
  2536.  
  2537.     ent_player TakeWeapon( "minigun_zm" );
  2538.    
  2539.     ent_player.zombie_vars[ "zombie_powerup_minigun_on" ] = false;
  2540.    
  2541.     ent_player.has_minigun = false;
  2542.    
  2543.     ent_player decrement_is_drinking();
  2544. }
  2545.  
  2546.  
  2547. minigun_weapon_powerup_remove( ent_player, str_gun_return_notify )
  2548. {
  2549.     ent_player endon( "death" );
  2550.     ent_player endon( "player_downed" );
  2551.    
  2552.     // take the minigun back
  2553.     ent_player TakeWeapon( "minigun_zm" );
  2554.    
  2555.     ent_player.zombie_vars[ "zombie_powerup_minigun_on" ] = false;
  2556.     ent_player._show_solo_hud = false;
  2557.    
  2558.     ent_player.has_minigun = false;
  2559.     ent_player.has_powerup_weapon = false;
  2560.    
  2561.     // this gives the player back their weapons
  2562.     ent_player notify( str_gun_return_notify );
  2563.    
  2564.     ent_player decrement_is_drinking();
  2565.    
  2566.     if( IsDefined( ent_player._zombie_gun_before_minigun ) )
  2567.     {
  2568.         player_weapons = ent_player GetWeaponsListPrimaries();
  2569.         for( i = 0; i < player_weapons.size; i++ )
  2570.         {
  2571.             if( player_weapons[i] == ent_player._zombie_gun_before_minigun )
  2572.             {
  2573.                 ent_player SwitchToWeapon( ent_player._zombie_gun_before_minigun );
  2574.                 return;
  2575.             }
  2576.         }
  2577.     }
  2578.    
  2579.     // if the player got through all that without getting a weapon back give them the first one
  2580.     primaryWeapons = ent_player GetWeaponsListPrimaries();
  2581.     if( primaryWeapons.size > 0 )
  2582.     {
  2583.         ent_player SwitchToWeapon( primaryWeapons[0] );
  2584.     }
  2585.     else
  2586.     {
  2587.         allWeapons = ent_player GetWeaponsList();
  2588.         for( i = 0; i < allWeapons.size; i++ )
  2589.         {
  2590.             if( is_melee_weapon( allWeapons[i] ) )
  2591.             {
  2592.                 ent_player SwitchToWeapon( allWeapons[i] );
  2593.                 return;
  2594.             }
  2595.         }
  2596.     }
  2597.    
  2598. }
  2599.  
  2600. minigun_weapon_powerup_off()
  2601. {
  2602.     self.zombie_vars["zombie_powerup_minigun_time"] = 0;
  2603. }
  2604.  
  2605. minigun_watch_gunner_downed()
  2606. {
  2607.     if ( !is_true( self.has_minigun ) )
  2608.     {
  2609.         return;
  2610.     }
  2611.  
  2612.     primaryWeapons = self GetWeaponsListPrimaries();
  2613.    
  2614.     for( i = 0; i < primaryWeapons.size; i++ )
  2615.     {
  2616.         if( primaryWeapons[i] == "minigun_zm" )
  2617.         {
  2618.             self TakeWeapon( "minigun_zm" );
  2619.         }
  2620.     }
  2621.    
  2622.     // self decrement_is_drinking();
  2623.  
  2624.     // this gives the player back their weapons
  2625.     self notify( "minigun_time_over" );
  2626.     self.zombie_vars[ "zombie_powerup_minigun_on" ] = false;
  2627.     self._show_solo_hud = false;
  2628.  
  2629.     // wait a frame to let last stand finish initializing so that
  2630.     // the wholethe system knows we went into last stand with a powerup weapon
  2631.     wait( 0.05 );
  2632.     self.has_minigun = false;
  2633.     self.has_powerup_weapon = false;
  2634. }
  2635.  
  2636.  
  2637.  
  2638. //******************************************************************************
  2639. // Tesla powerup
  2640. //      players[p].zombie_vars[ "zombie_powerup_tesla_on" ] = false; // tesla
  2641. //      players[p].zombie_vars[ "zombie_powerup_tesla_time" ] = 0; 
  2642. //******************************************************************************
  2643. tesla_weapon_powerup( ent_player, time )
  2644. {
  2645.     ent_player endon( "disconnect" );
  2646.     ent_player endon( "death" );
  2647.     ent_player endon( "player_downed" );
  2648.    
  2649.     if ( !IsDefined( time ) )
  2650.     {
  2651.         time = 11; // no blink
  2652.     }
  2653.  
  2654.     // Just replenish the time if it's already active
  2655.     if ( ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] &&
  2656.          ("tesla_gun_zm" == ent_player GetCurrentWeapon() || (IsDefined(ent_player.has_tesla) && ent_player.has_tesla) ))
  2657.     {
  2658.         ent_player GiveMaxAmmo( "tesla_gun_zm" );
  2659.         if ( ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] < time )
  2660.         {
  2661.             ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = time;
  2662.         }
  2663.         return;
  2664.     }
  2665.  
  2666.     ent_player notify( "replace_weapon_powerup" );
  2667.     ent_player._show_solo_hud = true;
  2668.    
  2669.     // make sure weapons are replaced properly if the player is downed
  2670.     level._zombie_tesla_powerup_last_stand_func = ::tesla_watch_gunner_downed;
  2671.     ent_player.has_tesla = true;
  2672.     ent_player.has_powerup_weapon = true;
  2673.  
  2674.     ent_player increment_is_drinking();
  2675.     ent_player._zombie_gun_before_tesla = ent_player GetCurrentWeapon();
  2676.    
  2677.     // give player a minigun
  2678.     ent_player GiveWeapon( "tesla_gun_zm" );
  2679.     ent_player GiveMaxAmmo( "tesla_gun_zm" );
  2680.     ent_player SwitchToWeapon( "tesla_gun_zm" );
  2681.    
  2682.     ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] = true;
  2683.    
  2684.     level thread tesla_weapon_powerup_countdown( ent_player, "tesla_time_over", time );
  2685.     level thread tesla_weapon_powerup_replace( ent_player, "tesla_time_over" );
  2686. }
  2687.  
  2688. tesla_weapon_powerup_countdown( ent_player, str_gun_return_notify, time )
  2689. {
  2690.     ent_player endon( "death" );
  2691.     ent_player endon( "player_downed" );
  2692.     ent_player endon( str_gun_return_notify );
  2693.     ent_player endon( "replace_weapon_powerup" );
  2694.    
  2695.     //AUDIO: Starting powerup loop on ONLY this player
  2696.     setClientSysState( "levelNotify", "minis", ent_player );
  2697.  
  2698.     ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = time;
  2699.     while ( true )
  2700.     {
  2701.         ent_player waittill_any( "weapon_fired", "reload", "zmb_max_ammo" );
  2702.        
  2703.         if ( !ent_player GetWeaponAmmoStock( "tesla_gun_zm" ) )
  2704.         {
  2705.             clip_count = ent_player GetWeaponAmmoClip( "tesla_gun_zm" );
  2706.            
  2707.             if ( !clip_count )
  2708.             {
  2709.                 break; // powerup now ends
  2710.             }
  2711.             else if ( 1 == clip_count )
  2712.             {
  2713.                 ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = 1; // blink fast
  2714.             }
  2715.             else if ( 3 == clip_count )
  2716.             {
  2717.                 ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = 6; // blink
  2718.             }
  2719.         }
  2720.         else
  2721.         {
  2722.             ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = 11; // no blink
  2723.         }
  2724.     }
  2725.    
  2726.     //AUDIO: Ending powerup loop on ONLY this player
  2727.     setClientSysState( "levelNotify", "minie", ent_player ); // TODO: need a new sound for the tesla
  2728.    
  2729.     level thread tesla_weapon_powerup_remove( ent_player, str_gun_return_notify );
  2730.    
  2731. }
  2732.  
  2733.  
  2734. tesla_weapon_powerup_replace( ent_player, str_gun_return_notify )
  2735. {
  2736.     ent_player endon( "death" );
  2737.     ent_player endon( "disconnect" );
  2738.     ent_player endon( "player_downed" );
  2739.     ent_player endon( str_gun_return_notify );
  2740.  
  2741.     ent_player waittill( "replace_weapon_powerup" );
  2742.  
  2743.     ent_player TakeWeapon( "tesla_gun_zm" );
  2744.    
  2745.     ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] = false;
  2746.    
  2747.     ent_player.has_tesla = false;
  2748.    
  2749.     ent_player decrement_is_drinking();
  2750. }
  2751.  
  2752.  
  2753. tesla_weapon_powerup_remove( ent_player, str_gun_return_notify )
  2754. {
  2755.     ent_player endon( "death" );
  2756.     ent_player endon( "player_downed" );
  2757.    
  2758.     // take the minigun back
  2759.     ent_player TakeWeapon( "tesla_gun_zm" );
  2760.    
  2761.     ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] = false;
  2762.     ent_player._show_solo_hud = false;
  2763.    
  2764.     ent_player.has_tesla = false;
  2765.     ent_player.has_powerup_weapon = false;
  2766.    
  2767.     // this gives the player back their weapons
  2768.     ent_player notify( str_gun_return_notify );
  2769.    
  2770.     ent_player decrement_is_drinking();
  2771.    
  2772.     if( IsDefined( ent_player._zombie_gun_before_tesla ) )
  2773.     {
  2774.         player_weapons = ent_player GetWeaponsListPrimaries();
  2775.         for( i = 0; i < player_weapons.size; i++ )
  2776.         {
  2777.             if( player_weapons[i] == ent_player._zombie_gun_before_tesla )
  2778.             {
  2779.                 ent_player SwitchToWeapon( ent_player._zombie_gun_before_tesla );
  2780.                 return;
  2781.             }
  2782.         }
  2783.     }
  2784.    
  2785.     // if the player got through all that without getting a weapon back give them the first one
  2786.     primaryWeapons = ent_player GetWeaponsListPrimaries();
  2787.     if( primaryWeapons.size > 0 )
  2788.     {
  2789.         ent_player SwitchToWeapon( primaryWeapons[0] );
  2790.     }
  2791.     else
  2792.     {
  2793.         allWeapons = ent_player GetWeaponsList();
  2794.         for( i = 0; i < allWeapons.size; i++ )
  2795.         {
  2796.             if( is_melee_weapon( allWeapons[i] ) )
  2797.             {
  2798.                 ent_player SwitchToWeapon( allWeapons[i] );
  2799.                 return;
  2800.             }
  2801.         }
  2802.     }
  2803.    
  2804. }
  2805.  
  2806. tesla_weapon_powerup_off()
  2807. {
  2808.     self.zombie_vars[ "zombie_powerup_tesla_time" ] = 0;
  2809. }
  2810.  
  2811. tesla_watch_gunner_downed()
  2812. {
  2813.     if ( !is_true( self.has_tesla ) )
  2814.     {
  2815.         return;
  2816.     }
  2817.  
  2818.     primaryWeapons = self GetWeaponsListPrimaries();
  2819.    
  2820.     for( i = 0; i < primaryWeapons.size; i++ )
  2821.     {
  2822.         if( primaryWeapons[i] == "tesla_gun_zm" )
  2823.         {
  2824.             self TakeWeapon( "tesla_gun_zm" );
  2825.         }
  2826.     }
  2827.    
  2828.     // self decrement_is_drinking();
  2829.  
  2830.     // this gives the player back their weapons
  2831.     self notify( "tesla_time_over" );
  2832.     self.zombie_vars[ "zombie_powerup_tesla_on" ] = false;
  2833.     self._show_solo_hud = false;
  2834.  
  2835.     // wait a frame to let last stand finish initializing so that
  2836.     // the wholethe system knows we went into last stand with a powerup weapon
  2837.     wait( 0.05 );
  2838.     self.has_tesla = false;
  2839.     self.has_powerup_weapon = false;
  2840. }
  2841.  
  2842.  
  2843. tesla_powerup_active()
  2844. {
  2845.     players = get_players();
  2846.     for ( i = 0; i < players.size; i++ )
  2847.     {
  2848.         if ( players[i].zombie_vars[ "zombie_powerup_tesla_on" ] )
  2849.         {
  2850.             return true;
  2851.         }
  2852.     }
  2853.    
  2854.     return false;
  2855. }
  2856.  
  2857.  
  2858. //******************************************************************************
  2859. //
  2860. // DEBUG
  2861. //
  2862. print_powerup_drop( powerup, type )
  2863. {
  2864.     /#
  2865.         if( !IsDefined( level.powerup_drop_time ) )
  2866.         {
  2867.             level.powerup_drop_time = 0;
  2868.             level.powerup_random_count = 0;
  2869.             level.powerup_score_count = 0;
  2870.         }
  2871.  
  2872.         time = ( GetTime() - level.powerup_drop_time ) * 0.001;
  2873.         level.powerup_drop_time = GetTime();
  2874.  
  2875.         if( type == "random" )
  2876.         {
  2877.             level.powerup_random_count++;
  2878.         }
  2879.         else
  2880.         {
  2881.             level.powerup_score_count++;
  2882.         }
  2883.  
  2884.         println( "========== POWER UP DROPPED ==========" );
  2885.         println( "DROPPED: " + powerup );
  2886.         println( "HOW IT DROPPED: " + type );
  2887.         println( "--------------------" );
  2888.         println( "Drop Time: " + time );
  2889.         println( "Random Powerup Count: " + level.powerup_random_count );
  2890.         println( "Random Powerup Count: " + level.powerup_score_count );
  2891.         println( "======================================" );
  2892. #/
  2893. }
  2894.  
  2895.  
  2896.  
  2897.  
  2898.  
  2899. start_carpenter_new( origin )
  2900. {
  2901.    
  2902.     window_boards = getstructarray( "exterior_goal", "targetname" );
  2903.    
  2904.     //COLLIN
  2905.     carp_ent = spawn("script_origin", (0,0,0));
  2906.     carp_ent playloopsound( "evt_carpenter" ); 
  2907.    
  2908.     boards_near_players = get_near_boards(window_boards);
  2909.     boards_far_from_players = get_far_boards(window_boards);   
  2910.    
  2911.     //instantly repair all 'far' boards
  2912.     level repair_far_boards(boards_far_from_players);
  2913.  
  2914.     for(i=0;i<boards_near_players.size;i++)
  2915.     {
  2916.         window = boards_near_players[i];
  2917.        
  2918.         num_chunks_checked = 0;
  2919.        
  2920.         last_repaired_chunk = undefined;
  2921.        
  2922.         while(1)
  2923.         {
  2924.             if( all_chunks_intact( window.barrier_chunks ) )
  2925.             {
  2926.                 break;
  2927.             }
  2928.  
  2929.             chunk = get_random_destroyed_chunk( window.barrier_chunks );
  2930.  
  2931.             if( !IsDefined( chunk ) )
  2932.                 break;
  2933.  
  2934.             window thread maps\_zombiemode_blockers::replace_chunk( chunk, undefined, true );
  2935.            
  2936.             last_repaired_chunk = chunk;
  2937.            
  2938.             window.clip enable_trigger();
  2939.             window.clip DisconnectPaths();
  2940.             wait_network_frame();
  2941.            
  2942.             num_chunks_checked++;
  2943.            
  2944.             if(num_chunks_checked >= 20)
  2945.             {
  2946.                 break;  // Avoid staying in this while loop forever....
  2947.             }
  2948.         }
  2949.        
  2950.         //wait for the last window board to be repaired
  2951.        
  2952.        
  2953.         while((IsDefined(last_repaired_chunk)) && (last_repaired_chunk.state == "mid_repair"))
  2954.         {
  2955.             wait(.05);
  2956.         }
  2957.     }
  2958.    
  2959.     carp_ent stoploopsound( 1 );
  2960.     carp_ent playsound( "evt_carpenter_end", "sound_done" );
  2961.     carp_ent waittill( "sound_done" );
  2962.  
  2963.     players = get_players();
  2964.     for(i = 0; i < players.size; i++)
  2965.     {
  2966.         players[i] maps\_zombiemode_score::player_add_points( "carpenter_powerup", 200 );
  2967.     }
  2968.  
  2969.     carp_ent delete();
  2970. }
  2971.  
  2972.  
  2973. get_near_boards(windows)
  2974. {
  2975.     // get all boards that are farther than 500 units away from any player and put them into a list
  2976.     players = get_players();
  2977.     boards_near_players = [];
  2978.    
  2979.     for(j =0;j<windows.size;j++)
  2980.     {
  2981.         close = false;
  2982.         for(i=0;i<players.size;i++)
  2983.         {
  2984.             if( distancesquared(players[i].origin,windows[j].origin) <= level.board_repair_distance_squared  )
  2985.             {
  2986.                 close = true;
  2987.             }
  2988.         }
  2989.         if(close)
  2990.         {
  2991.             boards_near_players[boards_near_players.size] = windows[j];
  2992.         }          
  2993.     }
  2994.     return boards_near_players;
  2995. }
  2996.  
  2997. get_far_boards(windows)
  2998. {
  2999.     // get all boards that are farther than 500 units away from any player and put them into a list
  3000.     players = get_players();
  3001.     boards_far_from_players = [];
  3002.    
  3003.     for(j =0;j<windows.size;j++)
  3004.     {
  3005.         close = false;
  3006.         for(i=0;i<players.size;i++)
  3007.         {
  3008.             if( distancesquared(players[i].origin,windows[j].origin) >= level.board_repair_distance_squared  )
  3009.             {
  3010.                 close = true;
  3011.             }
  3012.         }
  3013.         if(close)
  3014.         {
  3015.             boards_far_from_players[boards_far_from_players.size] = windows[j];
  3016.         }          
  3017.     }
  3018.     return boards_far_from_players;
  3019. }
  3020.  
  3021. repair_far_boards(barriers)
  3022. {
  3023.     for(i=0;i<barriers.size;i++)
  3024.     {
  3025.         barrier = barriers[i];
  3026.         if( all_chunks_intact( barrier.barrier_chunks ) )
  3027.         {
  3028.             continue;
  3029.         }
  3030.        
  3031.         for(x=0;x<barrier.barrier_chunks.size;x++)
  3032.         {
  3033.  
  3034.             chunk = barrier.barrier_chunks[x];  
  3035.             chunk dontinterpolate();
  3036.             barrier maps\_zombiemode_blockers::replace_chunk_instant( chunk);
  3037.  
  3038.         }
  3039.        
  3040.         barrier.clip enable_trigger();
  3041.         barrier.clip DisconnectPaths();
  3042.        
  3043.         wait_network_frame();
  3044.         wait_network_frame();
  3045.         wait_network_frame();
  3046.     }
  3047. }
Advertisement
Add Comment
Please, Sign In to add comment