burc_2004

zm_tomb_dig.gsc

Oct 5th, 2015
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 31.30 KB | None | 0 0
  1. #include maps/mp/zombies/_zm_powerup_zombie_blood;
  2. #include maps/mp/zombies/_zm_weap_claymore;
  3. #include maps/mp/zombies/_zm_powerups;
  4. #include maps/mp/zm_tomb_main_quest;
  5. #include maps/mp/zombies/_zm_stats;
  6. #include maps/mp/zombies/_zm_zonemgr;
  7. #include maps/mp/zombies/_zm_audio_announcer;
  8. #include maps/mp/zombies/_zm_audio;
  9. #include maps/mp/zm_tomb_utility;
  10. #include maps/mp/zombies/_zm_unitrigger;
  11. #include maps/mp/zombies/_zm_utility;
  12. #include maps/mp/_utility;
  13. #include common_scripts/utility;
  14.  
  15. init_shovel()
  16. {
  17.     precachemodel( "p6_zm_tm_dig_mound" );
  18.     precachemodel( "p6_zm_tm_dig_mound_blood" );
  19.     precachemodel( "p6_zm_tm_shovel" );
  20.     precachemodel( "zombie_pickup_perk_bottle" );
  21.     precachemodel( "t6_wpn_claymore_world" );
  22.     maps/mp/zombies/_zm_audio_announcer::createvox( "blood_money", "powerup_blood_money" );
  23.     onplayerconnect_callback( ::init_shovel_player );
  24.     a_shovel_pos = getstructarray( "shovel_location", "targetname" );
  25.     a_shovel_zone = [];
  26.     _a45 = a_shovel_pos;
  27.     _k45 = getFirstArrayKey( _a45 );
  28.     while ( isDefined( _k45 ) )
  29.     {
  30.         s_shovel_pos = _a45[ _k45 ];
  31.         if ( !isDefined( a_shovel_zone[ s_shovel_pos.script_noteworthy ] ) )
  32.         {
  33.             a_shovel_zone[ s_shovel_pos.script_noteworthy ] = [];
  34.         }
  35.         a_shovel_zone[ s_shovel_pos.script_noteworthy ][ a_shovel_zone[ s_shovel_pos.script_noteworthy ].size ] = s_shovel_pos;
  36.         _k45 = getNextArrayKey( _a45, _k45 );
  37.     }
  38.     _a55 = a_shovel_zone;
  39.     _k55 = getFirstArrayKey( _a55 );
  40.     while ( isDefined( _k55 ) )
  41.     {
  42.         a_zone = _a55[ _k55 ];
  43.         s_pos = a_zone[ randomint( a_zone.size ) ];
  44.         m_shovel = spawn( "script_model", s_pos.origin );
  45.         m_shovel.angles = s_pos.angles;
  46.         m_shovel setmodel( "p6_zm_tm_shovel" );
  47.         generate_shovel_unitrigger( m_shovel );
  48.         _k55 = getNextArrayKey( _a55, _k55 );
  49.     }
  50.     level.get_player_perk_purchase_limit = ::get_player_perk_purchase_limit;
  51.     level.bonus_points_powerup_override = ::bonus_points_powerup_override;
  52.     level thread dig_powerups_tracking();
  53.     level thread dig_spots_init();
  54.     registerclientfield( "world", "shovel_player1", 14000, 2, "int", undefined, 0 );
  55.     registerclientfield( "world", "shovel_player2", 14000, 2, "int", undefined, 0 );
  56.     registerclientfield( "world", "shovel_player3", 14000, 2, "int", undefined, 0 );
  57.     registerclientfield( "world", "shovel_player4", 14000, 2, "int", undefined, 0 );
  58.     registerclientfield( "world", "helmet_player1", 14000, 1, "int", undefined, 0 );
  59.     registerclientfield( "world", "helmet_player2", 14000, 1, "int", undefined, 0 );
  60.     registerclientfield( "world", "helmet_player3", 14000, 1, "int", undefined, 0 );
  61.     registerclientfield( "world", "helmet_player4", 14000, 1, "int", undefined, 0 );
  62. /#
  63.     level thread setup_dig_devgui();
  64. #/
  65. }
  66.  
  67. init_shovel_player()
  68. {
  69.     self.dig_vars[ "has_shovel" ] = 0;
  70.     self.dig_vars[ "has_upgraded_shovel" ] = 0;
  71.     self.dig_vars[ "has_helmet" ] = 0;
  72.     self.dig_vars[ "n_spots_dug" ] = 0;
  73.     self.dig_vars[ "n_losing_streak" ] = 0;
  74. }
  75.  
  76. generate_shovel_unitrigger( e_shovel )
  77. {
  78.     s_unitrigger_stub = spawnstruct();
  79.     s_unitrigger_stub.origin = e_shovel.origin + vectorScale( ( 0, 0, -1 ), 32 );
  80.     s_unitrigger_stub.angles = e_shovel.angles;
  81.     s_unitrigger_stub.radius = 32;
  82.     s_unitrigger_stub.script_length = 64;
  83.     s_unitrigger_stub.script_width = 64;
  84.     s_unitrigger_stub.script_height = 64;
  85.     s_unitrigger_stub.cursor_hint = "HINT_NOICON";
  86.     s_unitrigger_stub.hint_string = &"ZM_TOMB_SHPU";
  87.     s_unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
  88.     s_unitrigger_stub.require_look_at = 1;
  89.     s_unitrigger_stub.prompt_and_visibility_func = ::shovel_trigger_prompt_and_visiblity;
  90.     s_unitrigger_stub.e_shovel = e_shovel;
  91.     unitrigger_force_per_player_triggers( s_unitrigger_stub, 1 );
  92.     maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( s_unitrigger_stub, ::shovel_unitrigger_think );
  93. }
  94.  
  95. shovel_trigger_prompt_and_visiblity( e_player )
  96. {
  97.     can_use = self.stub shovel_prompt_update( e_player );
  98.     self setinvisibletoplayer( e_player, !can_use );
  99.     self sethintstring( self.stub.hint_string );
  100.     return can_use;
  101. }
  102.  
  103. shovel_prompt_update( e_player )
  104. {
  105.     if ( !self unitrigger_stub_show_hint_prompt_valid( e_player ) )
  106.     {
  107.         return 0;
  108.     }
  109.     self.hint_string = &"ZM_TOMB_SHPU";
  110.     if ( isDefined( e_player.dig_vars[ "has_shovel" ] ) && e_player.dig_vars[ "has_shovel" ] )
  111.     {
  112.         self.hint_string = &"ZM_TOMB_SHAG";
  113.     }
  114.     return 1;
  115. }
  116.  
  117. shovel_unitrigger_think()
  118. {
  119.     self endon( "kill_trigger" );
  120.     while ( 1 )
  121.     {
  122.         self waittill( "trigger", e_player );
  123.         while ( e_player != self.parent_player )
  124.         {
  125.             continue;
  126.         }
  127.         if ( isDefined( e_player.dig_vars[ "has_shovel" ] ) && !e_player.dig_vars[ "has_shovel" ] )
  128.         {
  129.             e_player.dig_vars[ "has_shovel" ] = 1;
  130.             e_player playsound( "zmb_craftable_pickup" );
  131.             e_player dig_reward_dialog( "pickup_shovel" );
  132.             n_player = e_player getentitynumber() + 1;
  133.             level setclientfield( "shovel_player" + n_player, 1 );
  134.             e_player thread dig_disconnect_watch( n_player, self.stub.e_shovel.origin, self.stub.e_shovel.angles );
  135.             self.stub.e_shovel delete();
  136.             maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.stub );
  137.         }
  138.     }
  139. }
  140.  
  141. dig_reward_dialog( str_category )
  142. {
  143.     if ( isDefined( self.dig_vo_cooldown ) && !self.dig_vo_cooldown )
  144.     {
  145.         self do_player_general_vox( "digging", str_category );
  146.         if ( str_category != "pickup_shovel" )
  147.         {
  148.             self thread dig_reward_vo_cooldown();
  149.         }
  150.     }
  151. }
  152.  
  153. dig_reward_vo_cooldown()
  154. {
  155.     self endon( "disconnect" );
  156.     self.dig_vo_cooldown = 1;
  157.     wait 60;
  158.     self.dig_vo_cooldown = undefined;
  159. }
  160.  
  161. unitrigger_stub_show_hint_prompt_valid( e_player )
  162. {
  163.     if ( !is_player_valid( e_player ) )
  164.     {
  165.         self.hint_string = "";
  166.         return 0;
  167.     }
  168.     return 1;
  169. }
  170.  
  171. dig_disconnect_watch( n_player, v_origin, v_angles )
  172. {
  173.     self waittill( "disconnect" );
  174.     level setclientfield( "shovel_player" + n_player, 0 );
  175.     level setclientfield( "helmet_player" + n_player, 0 );
  176.     m_shovel = spawn( "script_model", v_origin );
  177.     m_shovel.angles = v_angles;
  178.     m_shovel setmodel( "p6_zm_tm_shovel" );
  179.     generate_shovel_unitrigger( m_shovel );
  180. }
  181.  
  182. dig_spots_init()
  183. {
  184.     flag_wait( "start_zombie_round_logic" );
  185.     level.n_dig_spots_cur = 0;
  186.     level.n_dig_spots_max = 15;
  187.     level.a_dig_spots = getstructarray( "dig_spot", "targetname" );
  188.     _a242 = level.a_dig_spots;
  189.     _k242 = getFirstArrayKey( _a242 );
  190.     while ( isDefined( _k242 ) )
  191.     {
  192.         s_dig_spot = _a242[ _k242 ];
  193.         if ( !isDefined( s_dig_spot.angles ) )
  194.         {
  195.             s_dig_spot.angles = ( 0, 0, -1 );
  196.         }
  197.         if ( isDefined( s_dig_spot.script_noteworthy ) && s_dig_spot.script_noteworthy == "initial_spot" )
  198.         {
  199.             s_dig_spot thread dig_spot_spawn();
  200.         }
  201.         else
  202.         {
  203.             s_dig_spot.dug = 1;
  204.         }
  205.         s_dig_spot.str_zone = maps/mp/zombies/_zm_zonemgr::get_zone_from_position( s_dig_spot.origin + vectorScale( ( 0, 0, -1 ), 32 ), 1 );
  206.         if ( !isDefined( s_dig_spot.str_zone ) )
  207.         {
  208.             s_dig_spot.str_zone = "";
  209. /#
  210.             assertmsg( "Dig spot at ( " + s_dig_spot.origin[ 0 ] + ", " + s_dig_spot.origin[ 1 ] + ", " + s_dig_spot.origin[ 2 ] + ") is not in a zone." );
  211. #/
  212.         }
  213.         wait_network_frame();
  214.         _k242 = getNextArrayKey( _a242, _k242 );
  215.     }
  216.     level thread dig_spots_respawn();
  217. }
  218.  
  219. dig_spots_respawn( a_dig_spots )
  220. {
  221.     while ( 1 )
  222.     {
  223.         level waittill( "end_of_round" );
  224.         wait 2;
  225.         a_dig_spots = array_randomize( level.a_dig_spots );
  226.         n_respawned = 0;
  227.         n_respawned_max = 3;
  228.         if ( level.weather_snow > 0 )
  229.         {
  230.             n_respawned_max = 0;
  231.         }
  232.         else
  233.         {
  234.             if ( level.weather_rain > 0 )
  235.             {
  236.                 n_respawned_max = 5;
  237.             }
  238.         }
  239.         if ( level.weather_snow == 0 )
  240.         {
  241.             n_respawned_max += randomint( get_players().size );
  242.         }
  243.         i = 0;
  244.         while ( i < a_dig_spots.size )
  245.         {
  246.             if ( isDefined( a_dig_spots[ i ].dug ) && a_dig_spots[ i ].dug && n_respawned < n_respawned_max && level.n_dig_spots_cur <= level.n_dig_spots_max )
  247.             {
  248.                 a_dig_spots[ i ].dug = undefined;
  249.                 a_dig_spots[ i ] thread dig_spot_spawn();
  250.                 wait_network_frame();
  251.                 n_respawned++;
  252.             }
  253.             i++;
  254.         }
  255.         while ( level.weather_snow > 0 && level.ice_staff_pieces.size > 0 )
  256.         {
  257.             _a316 = level.ice_staff_pieces;
  258.             _k316 = getFirstArrayKey( _a316 );
  259.             while ( isDefined( _k316 ) )
  260.             {
  261.                 s_staff = _a316[ _k316 ];
  262.                 a_staff_spots = [];
  263.                 n_active_mounds = 0;
  264.                 _a321 = level.a_dig_spots;
  265.                 _k321 = getFirstArrayKey( _a321 );
  266.                 while ( isDefined( _k321 ) )
  267.                 {
  268.                     s_dig_spot = _a321[ _k321 ];
  269.                     if ( isDefined( s_dig_spot.str_zone ) && issubstr( s_dig_spot.str_zone, s_staff.zone_substr ) )
  270.                     {
  271.                         if ( isDefined( s_dig_spot.dug ) && !s_dig_spot.dug )
  272.                         {
  273.                             n_active_mounds++;
  274.                             break;
  275.                         }
  276.                         else
  277.                         {
  278.                             a_staff_spots[ a_staff_spots.size ] = s_dig_spot;
  279.                         }
  280.                     }
  281.                     _k321 = getNextArrayKey( _a321, _k321 );
  282.                 }
  283.                 if ( n_active_mounds < 2 && a_staff_spots.size > 0 && level.n_dig_spots_cur <= level.n_dig_spots_max )
  284.                 {
  285.                     n_index = randomint( a_staff_spots.size );
  286.                     a_staff_spots[ n_index ].dug = undefined;
  287.                     a_staff_spots[ n_index ] thread dig_spot_spawn();
  288.                     arrayremoveindex( a_staff_spots, n_index );
  289.                     n_active_mounds++;
  290.                     wait_network_frame();
  291.                 }
  292.                 _k316 = getNextArrayKey( _a316, _k316 );
  293.             }
  294.         }
  295.     }
  296. }
  297.  
  298. dig_spot_spawn()
  299. {
  300.     level.n_dig_spots_cur++;
  301.     self.m_dig = spawn( "script_model", self.origin + vectorScale( ( 0, 0, -1 ), 40 ) );
  302.     self.m_dig setmodel( "p6_zm_tm_dig_mound" );
  303.     self.m_dig.angles = self.angles;
  304.     self.m_dig moveto( self.origin, 3, 0, 1 );
  305.     self.m_dig waittill( "movedone" );
  306.     t_dig = tomb_spawn_trigger_radius( self.origin + vectorScale( ( 0, 0, -1 ), 20 ), 100, 1 );
  307.     t_dig.prompt_and_visibility_func = ::dig_spot_trigger_visibility;
  308.     t_dig.require_look_at = 1;
  309.     t_dig waittill_dug( self );
  310.     t_dig tomb_unitrigger_delete();
  311.     t_dig = undefined;
  312.     self.m_dig delete();
  313.     self.m_dig = undefined;
  314. }
  315.  
  316. dig_spot_trigger_visibility( player )
  317. {
  318.     if ( isDefined( player.dig_vars[ "has_shovel" ] ) && player.dig_vars[ "has_shovel" ] )
  319.     {
  320.         self sethintstring( &"ZM_TOMB_X2D" );
  321.     }
  322.     else
  323.     {
  324.         self sethintstring( &"ZM_TOMB_NS" );
  325.     }
  326.     return 1;
  327. }
  328.  
  329. waittill_dug( s_dig_spot )
  330. {
  331.     while ( 1 )
  332.     {
  333.         self waittill( "trigger", player );
  334.         if ( isDefined( player.dig_vars[ "has_shovel" ] ) && player.dig_vars[ "has_shovel" ] )
  335.         {
  336.             player playsound( "evt_dig" );
  337.             s_dig_spot.dug = 1;
  338.             level.n_dig_spots_cur--;
  339.  
  340.             playfx( level._effect[ "digging" ], self.origin );
  341.             player setclientfieldtoplayer( "player_rumble_and_shake", 1 );
  342.             player maps/mp/zombies/_zm_stats::increment_client_stat( "tomb_dig", 0 );
  343.             player maps/mp/zombies/_zm_stats::increment_player_stat( "tomb_dig" );
  344.             s_staff_piece = s_dig_spot maps/mp/zm_tomb_main_quest::dig_spot_get_staff_piece( player );
  345.             if ( isDefined( s_staff_piece ) )
  346.             {
  347.                 s_staff_piece maps/mp/zm_tomb_main_quest::show_ice_staff_piece( self.origin );
  348.                 player dig_reward_dialog( "dig_staff_part" );
  349.             }
  350.             else n_good_chance = 50;
  351.             if ( player.dig_vars[ "n_spots_dug" ] == 0 || player.dig_vars[ "n_losing_streak" ] == 3 )
  352.             {
  353.                 player.dig_vars[ "n_losing_streak" ] = 0;
  354.                 n_good_chance = 100;
  355.             }
  356.             if ( player.dig_vars[ "has_upgraded_shovel" ] )
  357.             {
  358.                 if ( !player.dig_vars[ "has_helmet" ] )
  359.                 {
  360.                     n_helmet_roll = randomint( 100 );
  361.                     if ( n_helmet_roll >= 95 )
  362.                     {
  363.                         player.dig_vars[ "has_helmet" ] = 1;
  364.                         n_player = player getentitynumber() + 1;
  365.                         level setclientfield( "helmet_player" + n_player, 1 );
  366.                         player playsoundtoplayer( "zmb_squest_golden_anything", player );
  367.                         player maps/mp/zombies/_zm_stats::increment_client_stat( "tomb_golden_hard_hat", 0 );
  368.                         player maps/mp/zombies/_zm_stats::increment_player_stat( "tomb_golden_hard_hat" );
  369.                         return;
  370.                     }
  371.                 }
  372.                 n_good_chance = 70;
  373.             }
  374.             n_prize_roll = randomint( 100 );
  375.             if ( n_prize_roll > n_good_chance )
  376.             {
  377.                 if ( cointoss() )
  378.                 {
  379.                     player dig_reward_dialog( "dig_grenade" );
  380.                     self thread dig_up_grenade( player );
  381.                 }
  382.                 else
  383.                 {
  384.                     player dig_reward_dialog( "dig_zombie" );
  385.                     self thread dig_up_zombie( player, s_dig_spot );
  386.                 }
  387.                 player.dig_vars[ "n_losing_streak" ]++;
  388.             }
  389.             else if ( cointoss() )
  390.             {
  391.                 self thread dig_up_powerup( player );
  392.             }
  393.             else
  394.             {
  395.                 player dig_reward_dialog( "dig_gun" );
  396.                 self thread dig_up_weapon( player );
  397.             }
  398.             if ( !player.dig_vars[ "has_upgraded_shovel" ] )
  399.             {
  400.                 player.dig_vars[ "n_spots_dug" ]++;
  401.                 if ( player.dig_vars[ "n_spots_dug" ] >= 30 )
  402.                 {
  403.                     player.dig_vars[ "has_upgraded_shovel" ] = 1;
  404.                     player thread ee_zombie_blood_dig();
  405.                     n_player = player getentitynumber() + 1;
  406.                     level setclientfield( "shovel_player" + n_player, 2 );
  407.                     player playsoundtoplayer( "zmb_squest_golden_anything", player );
  408.                     player maps/mp/zombies/_zm_stats::increment_client_stat( "tomb_golden_shovel", 0 );
  409.                     player maps/mp/zombies/_zm_stats::increment_player_stat( "tomb_golden_shovel" );
  410.                 }
  411.             }
  412.             return;
  413.         }
  414.     }
  415. }
  416.  
  417. dig_up_zombie( player, s_dig_spot )
  418. {
  419.     ai_zombie = spawn_zombie( level.dig_spawners[ 0 ] );
  420.     ai_zombie endon( "death" );
  421.     ai_zombie ghost();
  422.     e_linker = spawn( "script_origin", ( 0, 0, -1 ) );
  423.     e_linker.origin = ai_zombie.origin;
  424.     e_linker.angles = ai_zombie.angles;
  425.     ai_zombie linkto( e_linker );
  426.     e_linker moveto( player.origin + vectorScale( ( 0, 0, -1 ), 100 ), 0,1 );
  427.     e_linker waittill( "movedone" );
  428.     ai_zombie unlink();
  429.     e_linker delete();
  430.     ai_zombie show();
  431.     ai_zombie playsound( "evt_zombie_dig_dirt" );
  432.     ai_zombie dug_zombie_rise( s_dig_spot );
  433.     find_flesh_struct_string = "find_flesh";
  434.     ai_zombie notify( "zombie_custom_think_done" );
  435. }
  436.  
  437. dig_up_powerup( player )
  438. {
  439.     powerup = spawn( "script_model", self.origin );
  440.     powerup endon( "powerup_grabbed" );
  441.     powerup endon( "powerup_timedout" );
  442.     a_rare_powerups = dig_get_rare_powerups( player );
  443.     powerup_item = undefined;
  444.     if ( ( level.dig_n_powerups_spawned + level.powerup_drop_count ) > 4 && !level.dig_last_prize_rare || a_rare_powerups.size == 0 && randomint( 100 ) < 80 )
  445.     {
  446.         if ( level.dig_n_zombie_bloods_spawned < 1 && randomint( 100 ) > 70 )
  447.         {
  448.             powerup_item = "zombie_blood";
  449.             level.dig_n_zombie_bloods_spawned++;
  450.             level.dig_n_powerups_spawned++;
  451.             player dig_reward_dialog( "dig_powerup" );
  452.         }
  453.         else
  454.         {
  455.             powerup_item = "bonus_points_player";
  456.             player dig_reward_dialog( "dig_cash" );
  457.         }
  458.         level.dig_last_prize_rare = 0;
  459.     }
  460.     else
  461.     {
  462.         powerup_item = a_rare_powerups[ randomint( a_rare_powerups.size ) ];
  463.         level.dig_last_prize_rare = 1;
  464.         level.dig_n_powerups_spawned++;
  465.         player dig_reward_dialog( "dig_powerup" );
  466.         dig_set_powerup_spawned( powerup_item );
  467.     }
  468.     powerup maps/mp/zombies/_zm_powerups::powerup_setup( powerup_item );
  469.     powerup movez( 40, 0,6 );
  470.     powerup waittill( "movedone" );
  471.     powerup thread maps/mp/zombies/_zm_powerups::powerup_timeout();
  472.     powerup thread maps/mp/zombies/_zm_powerups::powerup_wobble();
  473.     powerup thread maps/mp/zombies/_zm_powerups::powerup_grab();
  474. }
  475.  
  476. dig_get_rare_powerups( player )
  477. {
  478.     a_rare_powerups = [];
  479.     a_possible_powerups = array( "nuke", "double_points" );
  480.     if ( level.dig_magic_box_moved && !dig_has_powerup_spawned( "fire_sale" ) )
  481.     {
  482.         a_possible_powerups[ a_possible_powerups.size ] = "fire_sale";
  483.     }
  484.     if ( player.dig_vars[ "has_upgraded_shovel" ] )
  485.     {
  486.         a_possible_powerups = combinearrays( a_possible_powerups, array( "insta_kill", "full_ammo" ) );
  487.     }
  488.     _a639 = a_possible_powerups;
  489.     _k639 = getFirstArrayKey( _a639 );
  490.     while ( isDefined( _k639 ) )
  491.     {
  492.         powerup = _a639[ _k639 ];
  493.         if ( !dig_has_powerup_spawned( powerup ) )
  494.         {
  495.             a_rare_powerups[ a_rare_powerups.size ] = powerup;
  496.         }
  497.         _k639 = getNextArrayKey( _a639, _k639 );
  498.     }
  499.     return a_rare_powerups;
  500. }
  501.  
  502. dig_up_grenade( player )
  503. {
  504.     player endon( "disconnect" );
  505.     v_spawnpt = self.origin;
  506.     grenade = "frag_grenade_zm";
  507.     n_rand = randomintrange( 0, 4 );
  508.     player magicgrenadetype( grenade, v_spawnpt, vectorScale( ( 0, 0, -1 ), 300 ), 3 );
  509.     player playsound( "evt_grenade_digup" );
  510.     if ( n_rand )
  511.     {
  512.         wait 0,3;
  513.         if ( cointoss() )
  514.         {
  515.             player magicgrenadetype( grenade, v_spawnpt, ( 50, 50, 300 ), 3 );
  516.         }
  517.     }
  518. }
  519.  
  520. dig_up_weapon( digger )
  521. {
  522.     a_common_weapons = array( "ballista_zm", "c96_zm", "870mcs_zm" );
  523.     a_rare_weapons = array( "dsr50_zm", "srm1216_zm" );
  524.     if ( digger.dig_vars[ "has_upgraded_shovel" ] )
  525.     {
  526.         a_rare_weapons = combinearrays( a_rare_weapons, array( "claymore_zm", "ak74u_zm", "ksg_zm", "mp40_zm", "mp44_zm" ) );
  527.     }
  528.     str_weapon = undefined;
  529.     if ( randomint( 100 ) < 90 )
  530.     {
  531.         str_weapon = a_common_weapons[ getarraykeys( a_common_weapons )[ randomint( getarraykeys( a_common_weapons ).size ) ] ];
  532.     }
  533.     else
  534.     {
  535.         str_weapon = a_rare_weapons[ getarraykeys( a_rare_weapons )[ randomint( getarraykeys( a_rare_weapons ).size ) ] ];
  536.     }
  537.     v_spawnpt = self.origin + ( 0, 0, 40 );
  538.     v_spawnang = ( 0, 0, -1 );
  539.     str_spec_model = undefined;
  540.     if ( str_weapon == "claymore_zm" )
  541.     {
  542.         str_spec_model = "t6_wpn_claymore_world";
  543.         v_spawnang += vectorScale( ( 0, 0, -1 ), 90 );
  544.     }
  545.     v_angles = digger getplayerangles();
  546.     v_angles = ( 0, v_angles[ 1 ], 0 ) + vectorScale( ( 0, 0, -1 ), 90 ) + v_spawnang;
  547.     m_weapon = spawn_weapon_model( str_weapon, str_spec_model, v_spawnpt, v_angles );
  548.     if ( str_weapon == "claymore_zm" )
  549.     {
  550.         m_weapon setmodel( "t6_wpn_claymore_world" );
  551.         v_spawnang += vectorScale( ( 0, 0, -1 ), 90 );
  552.     }
  553.     m_weapon.angles = v_angles;
  554.     m_weapon playloopsound( "evt_weapon_digup" );
  555.     m_weapon thread timer_til_despawn( v_spawnpt, 40 * -1 );
  556.     m_weapon endon( "dig_up_weapon_timed_out" );
  557.     playfxontag( level._effect[ "special_glow" ], m_weapon, "tag_origin" );
  558.     m_weapon.trigger = tomb_spawn_trigger_radius( v_spawnpt, 100, 1 );
  559.     m_weapon.trigger.hint_string = &"ZM_TOMB_X2PU";
  560.     m_weapon.trigger.hint_parm1 = getweapondisplayname( str_weapon );
  561.     m_weapon.trigger waittill( "trigger", player );
  562.     m_weapon.trigger notify( "weapon_grabbed" );
  563.     m_weapon.trigger thread swap_weapon( str_weapon, player );
  564.     if ( isDefined( m_weapon.trigger ) )
  565.     {
  566.         m_weapon.trigger tomb_unitrigger_delete();
  567.         m_weapon.trigger = undefined;
  568.     }
  569.     if ( isDefined( m_weapon ) )
  570.     {
  571.         m_weapon delete();
  572.     }
  573.     if ( player != digger )
  574.     {
  575.         digger notify( "dig_up_weapon_shared" );
  576.     }
  577. }
  578.  
  579. swap_weapon( str_weapon, e_player )
  580. {
  581.     str_current_weapon = e_player getcurrentweapon();
  582.     if ( str_weapon == "claymore_zm" )
  583.     {
  584.         if ( !e_player hasweapon( str_weapon ) )
  585.         {
  586.             e_player thread maps/mp/zombies/_zm_weap_claymore::show_claymore_hint( "claymore_purchased" );
  587.             e_player thread maps/mp/zombies/_zm_weap_claymore::claymore_setup();
  588.             e_player thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "weapon_pickup", "grenade" );
  589.         }
  590.         else
  591.         {
  592.             e_player givemaxammo( str_weapon );
  593.         }
  594.         return;
  595.     }
  596.     if ( is_player_valid( e_player ) && !e_player.is_drinking && !is_placeable_mine( str_current_weapon ) && !is_equipment( str_current_weapon ) && level.revive_tool != str_current_weapon && str_current_weapon != "none" && !e_player hacker_active() )
  597.     {
  598.         if ( !e_player hasweapon( str_weapon ) )
  599.         {
  600.             e_player take_old_weapon_and_give_new( str_current_weapon, str_weapon );
  601.             return;
  602.         }
  603.         else
  604.         {
  605.             e_player givemaxammo( str_weapon );
  606.         }
  607.     }
  608. }
  609.  
  610. take_old_weapon_and_give_new( current_weapon, weapon )
  611. {
  612.     a_weapons = self getweaponslistprimaries();
  613.     if ( isDefined( a_weapons ) && a_weapons.size >= get_player_weapon_limit( self ) )
  614.     {
  615.         self takeweapon( current_weapon );
  616.     }
  617.     self giveweapon( weapon );
  618.     self switchtoweapon( weapon );
  619. }
  620.  
  621. timer_til_despawn( v_float, n_dist )
  622. {
  623.     self endon( "weapon_grabbed" );
  624.     putbacktime = 12;
  625.     self movez( n_dist, putbacktime, putbacktime * 0,5 );
  626.     self waittill( "movedone" );
  627.     self notify( "dig_up_weapon_timed_out" );
  628.     if ( isDefined( self.trigger ) )
  629.     {
  630.         self.trigger tomb_unitrigger_delete();
  631.         self.trigger = undefined;
  632.     }
  633.     if ( isDefined( self ) )
  634.     {
  635.         self delete();
  636.     }
  637. }
  638.  
  639. get_player_perk_purchase_limit()
  640. {
  641.     if ( isDefined( self.player_perk_purchase_limit ) )
  642.     {
  643.         return self.player_perk_purchase_limit;
  644.     }
  645.     return level.perk_purchase_limit;
  646. }
  647.  
  648. increment_player_perk_purchase_limit()
  649. {
  650.     if ( !isDefined( self.player_perk_purchase_limit ) )
  651.     {
  652.         self.player_perk_purchase_limit = level.perk_purchase_limit;
  653.     }
  654.     if ( self.player_perk_purchase_limit < 8 )
  655.     {
  656.         self.player_perk_purchase_limit++;
  657.     }
  658. }
  659.  
  660. ee_zombie_blood_dig()
  661. {
  662.     self endon( "disconnect" );
  663.     n_z_spots_found = 0;
  664.     a_z_spots = getstructarray( "zombie_blood_dig_spot", "targetname" );
  665.     self.t_zombie_blood_dig = spawn( "trigger_radius_use", ( 0, 0, -1 ), 0, 100, 50 );
  666.     self.t_zombie_blood_dig.e_unique_player = self;
  667.     self.t_zombie_blood_dig triggerignoreteam();
  668.     self.t_zombie_blood_dig setcursorhint( "HINT_NOICON" );
  669.     self.t_zombie_blood_dig sethintstring( &"ZM_TOMB_X2D" );
  670.     self.t_zombie_blood_dig maps/mp/zombies/_zm_powerup_zombie_blood::make_zombie_blood_entity();
  671.     while ( n_z_spots_found < 4 )
  672.     {
  673.         a_randomized = array_randomize( a_z_spots );
  674.         n_index = undefined;
  675.         i = 0;
  676.         while ( i < a_randomized.size )
  677.         {
  678.             if ( !isDefined( a_randomized[ i ].n_player ) )
  679.             {
  680.                 n_index = i;
  681.                 break;
  682.             }
  683.             else
  684.             {
  685.                 i++;
  686.             }
  687.         }
  688. /#
  689.         assert( isDefined( n_index ), "No more zombie blood dig spots.  Add more to the map." );
  690. #/
  691.         s_z_spot = a_randomized[ n_index ];
  692.         s_z_spot.n_player = self getentitynumber();
  693.         s_z_spot create_zombie_blood_dig_spot( self );
  694.         n_z_spots_found++;
  695.         level waittill( "end_of_round" );
  696.     }
  697.     self.t_zombie_blood_dig delete();
  698. }
  699.  
  700. ee_zombie_blood_dig_disconnect_watch()
  701. {
  702.     self waittill( "disconnect" );
  703.     if ( isDefined( self.t_zombie_blood_dig ) )
  704.     {
  705.         self.t_zombie_blood_dig delete();
  706.     }
  707.     a_z_spots = getstructarray( "zombie_blood_dig_spot", "targetname" );
  708.     _a917 = a_z_spots;
  709.     _k917 = getFirstArrayKey( _a917 );
  710.     while ( isDefined( _k917 ) )
  711.     {
  712.         s_pos = _a917[ _k917 ];
  713.         if ( isDefined( s_pos.n_player ) && s_pos.n_player == self getentitynumber() )
  714.         {
  715.             s_pos.n_player = undefined;
  716.         }
  717.         if ( isDefined( s_pos.m_dig ) )
  718.         {
  719.             s_pos delete();
  720.         }
  721.         _k917 = getNextArrayKey( _a917, _k917 );
  722.     }
  723. }
  724.  
  725. create_zombie_blood_dig_spot( e_player )
  726. {
  727.     self.m_dig = spawn( "script_model", self.origin + vectorScale( ( 0, 0, -1 ), 40 ) );
  728.     self.m_dig.angles = self.angles;
  729.     self.m_dig setmodel( "p6_zm_tm_dig_mound_blood" );
  730.     self.m_dig maps/mp/zombies/_zm_powerup_zombie_blood::make_zombie_blood_entity();
  731.     self.m_dig moveto( self.origin, 3, 0, 1 );
  732.     self.m_dig waittill( "movedone" );
  733.     self.m_dig.e_unique_player = e_player;
  734. /#
  735.     self thread puzzle_debug_position( "+", vectorScale( ( 0, 0, -1 ), 255 ), self.origin );
  736. #/
  737.     e_player.t_zombie_blood_dig.origin = self.origin + vectorScale( ( 0, 0, -1 ), 20 );
  738.     e_player.t_zombie_blood_dig waittill_zombie_blood_dug( self );
  739. /#
  740.     self notify( "stop_debug_position" );
  741. #/
  742. }
  743.  
  744. waittill_zombie_blood_dug( s_dig_spot )
  745. {
  746.     self endon( "death" );
  747.     while ( 1 )
  748.     {
  749.         self waittill( "trigger", player );
  750.         if ( isDefined( player.dig_vars[ "has_shovel" ] ) && player.dig_vars[ "has_shovel" ] )
  751.         {
  752.             player.t_zombie_blood_dig.origin = ( 0, 0, -1 );
  753.             player playsound( "evt_dig" );
  754.             playfx( level._effect[ "digging" ], self.origin );
  755.             s_dig_spot.m_dig delete();
  756.             spawn_perk_upgrade_bottle( s_dig_spot.origin, player );
  757.             return;
  758.         }
  759.     }
  760. }
  761.  
  762. spawn_perk_upgrade_bottle( v_origin, e_player )
  763. {
  764.     m_bottle = spawn( "script_model", v_origin + vectorScale( ( 0, 0, -1 ), 40 ) );
  765.     m_bottle setmodel( "zombie_pickup_perk_bottle" );
  766.     m_bottle.angles = vectorScale( ( 0, 0, -1 ), 10 );
  767.     m_bottle setinvisibletoall();
  768.     m_bottle setvisibletoplayer( e_player );
  769.     m_fx = spawn( "script_model", m_bottle.origin );
  770.     m_fx setmodel( "tag_origin" );
  771.     m_fx setinvisibletoall();
  772.     m_fx setvisibletoplayer( e_player );
  773.     playfxontag( level._effect[ "special_glow" ], m_fx, "tag_origin" );
  774.     m_bottle linkto( m_fx );
  775.     m_fx thread rotate_perk_upgrade_bottle();
  776.     while ( isDefined( e_player ) && !e_player istouching( m_bottle ) )
  777.     {
  778.         wait 0,05;
  779.     }
  780.     m_bottle delete();
  781.     m_fx delete();
  782.     if ( isDefined( e_player ) )
  783.     {
  784.         e_player increment_player_perk_purchase_limit();
  785.         e_player maps/mp/zombies/_zm_stats::increment_client_stat( "tomb_perk_extension", 0 );
  786.         e_player maps/mp/zombies/_zm_stats::increment_player_stat( "tomb_perk_extension" );
  787.     }
  788. }
  789.  
  790. rotate_perk_upgrade_bottle()
  791. {
  792.     self endon( "death" );
  793.     while ( 1 )
  794.     {
  795.         self rotateyaw( 360, 5 );
  796.         self waittill( "rotatedone" );
  797.     }
  798. }
  799.  
  800. bonus_points_powerup_override()
  801. {
  802.     level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "blood_money" );
  803.     points = randomintrange( 1, 6 ) * 50;
  804.     return points;
  805. }
  806.  
  807. dig_powerups_tracking()
  808. {
  809.     level endon( "end_game" );
  810.     level.dig_powerups_tracking = [];
  811.     level.dig_magic_box_moved = 0;
  812.     level.dig_last_prize_rare = 0;
  813.     level.dig_n_zombie_bloods_spawned = 0;
  814.     level.dig_n_powerups_spawned = 0;
  815.     while ( 1 )
  816.     {
  817.         level waittill( "end_of_round" );
  818.         _a1065 = level.dig_powerups_tracking;
  819.         str_powerup = getFirstArrayKey( _a1065 );
  820.         while ( isDefined( str_powerup ) )
  821.         {
  822.             value = _a1065[ str_powerup ];
  823.             level.dig_powerups_tracking[ str_powerup ] = 0;
  824.             str_powerup = getNextArrayKey( _a1065, str_powerup );
  825.         }
  826.         level.dig_n_zombie_bloods_spawned = 0;
  827.         level.dig_n_powerups_spawned = 0;
  828.     }
  829. }
  830.  
  831. dig_has_powerup_spawned( str_powerup )
  832. {
  833.     if ( !isDefined( level.dig_powerups_tracking[ str_powerup ] ) )
  834.     {
  835.         level.dig_powerups_tracking[ str_powerup ] = 0;
  836.     }
  837.     return level.dig_powerups_tracking[ str_powerup ];
  838. }
  839.  
  840. dig_set_powerup_spawned( str_powerup )
  841. {
  842.     level.dig_powerups_tracking[ str_powerup ] = 1;
  843. }
  844.  
  845. setup_dig_devgui()
  846. {
  847. /#
  848.     setdvar( "give_shovel", "off" );
  849.     setdvar( "give_golden_shovel", "off" );
  850.     setdvar( "give_helmet", "off" );
  851.     setdvar( "spawn_max_mounds", "off" );
  852.     setdvar( "spawn_all_mounds", "off" );
  853.     setdvar( "test_blood_mounds", "off" );
  854.     setdvar( "force_weather_rain", "off" );
  855.     setdvar( "force_weather_snow", "off" );
  856.     setdvar( "force_weather_none", "off" );
  857.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Digging:1/Give Shovel:1" "give_shovel on"\n" );
  858.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Digging:1/Give Golden Shovel:2" "give_golden_shovel on"\n" );
  859.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Digging:1/Give Helmet:3" "give_helmet on"\n" );
  860.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Digging:1/Spawn Max Mounds:4" "spawn_max_mounds on"\n" );
  861.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Digging:1/Spawn All Mounds:5" "spawn_all_mounds on"\n" );
  862.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Digging:1/Test Blood Mounds:6" "test_blood_mounds on"\n" );
  863.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Weather:1/Rain:1" "force_weather_rain on"\n" );
  864.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Weather:1/Snow:2" "force_weather_snow on"\n" );
  865.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Weather:1/Clear:3" "force_weather_none on"\n" );
  866.     level thread watch_devgui_dig();
  867. #/
  868. }
  869.  
  870. watch_devgui_dig()
  871. {
  872. /#
  873.     while ( 1 )
  874.     {
  875.         while ( getDvar( "give_shovel" ) == "on" )
  876.         {
  877.             setdvar( "give_shovel", "off" );
  878.             _a1131 = getplayers();
  879.             _k1131 = getFirstArrayKey( _a1131 );
  880.             while ( isDefined( _k1131 ) )
  881.             {
  882.                 player = _a1131[ _k1131 ];
  883.                 player.dig_vars[ "has_shovel" ] = 1;
  884.                 n_player = player getentitynumber() + 1;
  885.                 level setclientfield( "shovel_player" + n_player, 1 );
  886.                 _k1131 = getNextArrayKey( _a1131, _k1131 );
  887.             }
  888.         }
  889.         while ( getDvar( "give_golden_shovel" ) == "on" )
  890.         {
  891.             setdvar( "give_golden_shovel", "off" );
  892.             _a1141 = getplayers();
  893.             _k1141 = getFirstArrayKey( _a1141 );
  894.             while ( isDefined( _k1141 ) )
  895.             {
  896.                 player = _a1141[ _k1141 ];
  897.                 player.dig_vars[ "has_shovel" ] = 1;
  898.                 player.dig_vars[ "has_upgraded_shovel" ] = 1;
  899.                 player thread ee_zombie_blood_dig();
  900.                 n_player = player getentitynumber() + 1;
  901.                 level setclientfield( "shovel_player" + n_player, 2 );
  902.                 _k1141 = getNextArrayKey( _a1141, _k1141 );
  903.             }
  904.         }
  905.         while ( getDvar( "give_helmet" ) == "on" )
  906.         {
  907.             setdvar( "give_helmet", "off" );
  908.             _a1153 = getplayers();
  909.             _k1153 = getFirstArrayKey( _a1153 );
  910.             while ( isDefined( _k1153 ) )
  911.             {
  912.                 player = _a1153[ _k1153 ];
  913.                 player.dig_vars[ "has_helmet" ] = 1;
  914.                 n_player = player getentitynumber() + 1;
  915.                 level setclientfield( "helmet_player" + n_player, 1 );
  916.                 _k1153 = getNextArrayKey( _a1153, _k1153 );
  917.             }
  918.         }
  919.         while ( getDvar( "spawn_max_mounds" ) == "on" )
  920.         {
  921.             setdvar( "spawn_max_mounds", "off" );
  922.             a_dig_spots = array_randomize( level.a_dig_spots );
  923.             i = 0;
  924.             while ( i < a_dig_spots.size )
  925.             {
  926.                 if ( isDefined( a_dig_spots[ i ].dug ) && a_dig_spots[ i ].dug && level.n_dig_spots_cur <= level.n_dig_spots_max )
  927.                 {
  928.                     a_dig_spots[ i ].dug = undefined;
  929.                     a_dig_spots[ i ] thread dig_spot_spawn();
  930.                     wait_network_frame();
  931.                 }
  932.                 i++;
  933.             }
  934.         }
  935.         while ( getDvar( "spawn_all_mounds" ) == "on" )
  936.         {
  937.             setdvar( "spawn_all_mounds", "off" );
  938.             a_dig_spots = array_randomize( level.a_dig_spots );
  939.             i = 0;
  940.             while ( i < a_dig_spots.size )
  941.             {
  942.                 if ( isDefined( a_dig_spots[ i ].dug ) && a_dig_spots[ i ].dug )
  943.                 {
  944.                     a_dig_spots[ i ].dug = undefined;
  945.                     a_dig_spots[ i ] thread dig_spot_spawn();
  946.                     wait_network_frame();
  947.                 }
  948.                 i++;
  949.             }
  950.         }
  951.         while ( getDvar( "test_blood_mounds" ) == "on" )
  952.         {
  953.             setdvar( "test_blood_mounds", "off" );
  954.             a_z_spots = getstructarray( "zombie_blood_dig_spot", "targetname" );
  955.             _a1193 = a_z_spots;
  956.             _k1193 = getFirstArrayKey( _a1193 );
  957.             while ( isDefined( _k1193 ) )
  958.             {
  959.                 s_spot = _a1193[ _k1193 ];
  960.                 s_spot.m_dig = spawn( "script_model", s_spot.origin + vectorScale( ( 0, 0, -1 ), 40 ) );
  961.                 s_spot.m_dig.angles = s_spot.angles;
  962.                 s_spot.m_dig setmodel( "p6_zm_tm_dig_mound_blood" );
  963.                 s_spot.m_dig moveto( s_spot.origin, 3, 0, 1 );
  964.                 wait_network_frame();
  965.                 _k1193 = getNextArrayKey( _a1193, _k1193 );
  966.             }
  967.         }
  968.         while ( getDvar( "force_weather_rain" ) == "on" )
  969.         {
  970.             setdvar( "force_weather_rain", "off" );
  971.             level.weather_snow = 0;
  972.             level.weather_rain = 5;
  973.             level.weather_vision = 1;
  974.             level setclientfield( "rain_level", level.weather_rain );
  975.             level setclientfield( "snow_level", level.weather_snow );
  976.             wait 1;
  977.             _a1212 = getplayers();
  978.             _k1212 = getFirstArrayKey( _a1212 );
  979.             while ( isDefined( _k1212 ) )
  980.             {
  981.                 player = _a1212[ _k1212 ];
  982.                 if ( is_player_valid( player, 0, 1 ) )
  983.                 {
  984.                     player set_weather_to_player();
  985.                 }
  986.                 _k1212 = getNextArrayKey( _a1212, _k1212 );
  987.             }
  988.         }
  989.         while ( getDvar( "force_weather_snow" ) == "on" )
  990.         {
  991.             setdvar( "force_weather_snow", "off" );
  992.             level.weather_snow = 5;
  993.             level.weather_rain = 0;
  994.             level.weather_vision = 2;
  995.             level setclientfield( "rain_level", level.weather_rain );
  996.             level setclientfield( "snow_level", level.weather_snow );
  997.             wait 1;
  998.             _a1229 = getplayers();
  999.             _k1229 = getFirstArrayKey( _a1229 );
  1000.             while ( isDefined( _k1229 ) )
  1001.             {
  1002.                 player = _a1229[ _k1229 ];
  1003.                 if ( is_player_valid( player, 0, 1 ) )
  1004.                 {
  1005.                     player set_weather_to_player();
  1006.                 }
  1007.                 _k1229 = getNextArrayKey( _a1229, _k1229 );
  1008.             }
  1009.         }
  1010.         while ( getDvar( "force_weather_none" ) == "on" )
  1011.         {
  1012.             setdvar( "force_weather_none", "off" );
  1013.             level.weather_snow = 0;
  1014.             level.weather_rain = 0;
  1015.             level.weather_vision = 3;
  1016.             level setclientfield( "rain_level", level.weather_rain );
  1017.             level setclientfield( "snow_level", level.weather_snow );
  1018.             wait 1;
  1019.             _a1246 = getplayers();
  1020.             _k1246 = getFirstArrayKey( _a1246 );
  1021.             while ( isDefined( _k1246 ) )
  1022.             {
  1023.                 player = _a1246[ _k1246 ];
  1024.                 if ( is_player_valid( player, 0, 1 ) )
  1025.                 {
  1026.                     player set_weather_to_player();
  1027.                 }
  1028.                 _k1246 = getNextArrayKey( _a1246, _k1246 );
  1029.             }
  1030.         }
  1031.         wait 0,05;
  1032. #/
  1033.     }
  1034. }
Advertisement
Add Comment
Please, Sign In to add comment