burc_2004

zm_tomb_utility.gsc

Oct 22nd, 2015
396
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 47.63 KB | None | 0 0
  1. #include maps/mp/zm_tomb_craftables;
  2. #include maps/mp/zm_tomb_tank;
  3. #include maps/mp/zm_tomb_challenges;
  4. #include maps/mp/zombies/_zm_challenges;
  5. #include maps/mp/zm_tomb_chamber;
  6. #include maps/mp/zombies/_zm_zonemgr;
  7. #include maps/mp/zombies/_zm_unitrigger;
  8. #include maps/mp/animscripts/zm_shared;
  9. #include maps/mp/zombies/_zm_ai_basic;
  10. #include maps/mp/zm_tomb_vo;
  11. #include maps/mp/zm_tomb_teleporter;
  12. #include maps/mp/zombies/_zm_equipment;
  13. #include maps/mp/zombies/_zm_spawner;
  14. #include maps/mp/zombies/_zm_net;
  15. #include maps/mp/zombies/_zm_utility;
  16. #include maps/mp/_utility;
  17. #include common_scripts/utility;
  18.  
  19. setup_devgui()
  20. {
  21. /#
  22.     execdevgui( "devgui_zombie_tomb" );
  23.     level.custom_devgui = ::zombie_devgui_tomb;
  24.     setdvar( "complete_puzzles1", "off" );
  25.     setdvar( "complete_puzzles2", "off" );
  26.     setdvar( "open_all_teleporters", "off" );
  27.     setdvar( "show_craftable_locations", "off" );
  28.     setdvar( "show_morse_code", "off" );
  29.     setdvar( "sam_intro_skip", "off" );
  30.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Quest:1/Open All Teleporters:1" "open_all_teleporters on"\n" );
  31.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Quest:1/Skip Chamber Puzzles:2" "complete_puzzles1 on"\n" );
  32.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Quest:1/Skip Top-side Puzzles:3" "complete_puzzles2 on"\n" );
  33.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Quest:1/Show Craftable Locations:4" "show_craftable_locations on "\n" );
  34.     adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Quest:1/Skip Samantha Intro:5" "sam_intro_skip on"\n" );
  35.     adddebugcommand( "devgui_cmd "Zombies:2/Tomb:1/Easter Ann:3/Show Morse Code:1" "show_morse_code on "\n" );
  36.     level thread watch_devgui_quadrotor();
  37.     level thread watch_devgui_complete_puzzles();
  38.     level thread watch_for_upgraded_staffs();
  39. #/
  40. }
  41.  
  42. zombie_devgui_tomb( cmd )
  43. {
  44. /#
  45.     cmd_strings = strtok( cmd, " " );
  46.     switch( cmd_strings[ 0 ] )
  47.     {
  48.         case "force_recapture_start":
  49.             level notify( "force_recapture_start" );
  50.             break;
  51.         case "force_capture_zone_1":
  52.         case "force_capture_zone_2":
  53.         case "force_capture_zone_3":
  54.         case "force_capture_zone_4":
  55.         case "force_capture_zone_5":
  56.         case "force_capture_zone_6":
  57.             level notify( "force_zone_capture" );
  58.             break;
  59.         case "force_recapture_zone_1":
  60.         case "force_recapture_zone_2":
  61.         case "force_recapture_zone_3":
  62.         case "force_recapture_zone_4":
  63.         case "force_recapture_zone_5":
  64.         case "force_recapture_zone_6":
  65.             level notify( "force_zone_recapture" );
  66.             break;
  67.     }
  68. #/
  69. }
  70.  
  71. watch_for_upgraded_staffs()
  72. {
  73. /#
  74.     cmd = "";
  75.     while ( 1 )
  76.     {
  77.         wait 0,25;
  78.         while ( !isDefined( level.zombie_devgui_gun ) || level.zombie_devgui_gun != cmd )
  79.         {
  80.             a_players = get_players();
  81.             _a102 = a_players;
  82.             _k102 = getFirstArrayKey( _a102 );
  83.             while ( isDefined( _k102 ) )
  84.             {
  85.                 player = _a102[ _k102 ];
  86.                 has_upgraded_staff = 0;
  87.                 a_str_weapons = player getweaponslist();
  88.                 _a107 = a_str_weapons;
  89.                 _k107 = getFirstArrayKey( _a107 );
  90.                 while ( isDefined( _k107 ) )
  91.                 {
  92.                     str_weapon = _a107[ _k107 ];
  93.                     if ( is_weapon_upgraded_staff( str_weapon ) )
  94.                     {
  95.                         has_upgraded_staff = 1;
  96.                     }
  97.                     _k107 = getNextArrayKey( _a107, _k107 );
  98.                 }
  99.                 if ( has_upgraded_staff )
  100.                 {
  101.                     player update_staff_accessories();
  102.                 }
  103.                 _k102 = getNextArrayKey( _a102, _k102 );
  104.             }
  105.         }
  106. #/
  107.     }
  108. }
  109.  
  110. watch_devgui_complete_puzzles()
  111. {
  112. /#
  113.     while ( 1 )
  114.     {
  115.         if ( getDvar( "complete_puzzles1" ) == "on" || getDvar( "complete_puzzles2" ) == "on" )
  116.         {
  117.             flag_set( "air_puzzle_1_complete" );
  118.             flag_set( "ice_puzzle_1_complete" );
  119.             flag_set( "electric_puzzle_1_complete" );
  120.             flag_set( "fire_puzzle_1_complete" );
  121.             flag_set( "chamber_puzzle_cheat" );
  122.             setdvar( "complete_puzzles1", "off" );
  123.             level notify( "open_all_gramophone_doors" );
  124.         }
  125.         if ( getDvar( "show_morse_code" ) == "on" )
  126.         {
  127.             flag_set( "show_morse_code" );
  128.             setdvar( "show_morse_code", "off" );
  129.         }
  130.         if ( getDvar( "complete_puzzles2" ) == "on" )
  131.         {
  132.             flag_set( "air_puzzle_2_complete" );
  133.             flag_set( "ice_puzzle_2_complete" );
  134.             flag_set( "electric_puzzle_2_complete" );
  135.             flag_set( "fire_puzzle_2_complete" );
  136.             flag_set( "chamber_puzzle_cheat" );
  137.             flag_set( "staff_air_zm_upgrade_unlocked" );
  138.             flag_set( "staff_water_zm_upgrade_unlocked" );
  139.             flag_set( "staff_fire_zm_upgrade_unlocked" );
  140.             flag_set( "staff_lightning_zm_upgrade_unlocked" );
  141.             setdvar( "complete_puzzles2", "off" );
  142.         }
  143.         if ( getDvar( "sam_intro_skip" ) == "on" )
  144.         {
  145.             flag_set( "samantha_intro_done" );
  146.             setdvar( "sam_intro_skip", "off" );
  147.         }
  148.         if ( getDvar( "open_all_teleporters" ) == "on" )
  149.         {
  150.             maps/mp/zm_tomb_teleporter::stargate_teleport_enable( 1 );
  151.             maps/mp/zm_tomb_teleporter::stargate_teleport_enable( 2 );
  152.             maps/mp/zm_tomb_teleporter::stargate_teleport_enable( 3 );
  153.             maps/mp/zm_tomb_teleporter::stargate_teleport_enable( 4 );
  154.             setdvar( "open_all_teleporters", "off" );
  155.             flag_set( "activate_zone_chamber" );
  156.         }
  157.         wait 0,5;
  158. #/
  159.     }
  160. }
  161.  
  162. get_teleport_fx_from_enum( n_enum )
  163. {
  164.     switch( n_enum )
  165.     {
  166.         case 1:
  167.             return "teleport_fire";
  168.         case 4:
  169.             return "teleport_ice";
  170.         case 3:
  171.             return "teleport_elec";
  172.         case 2:
  173.         default:
  174.             return "teleport_air";
  175.     }
  176. }
  177.  
  178. watch_devgui_quadrotor()
  179. {
  180. /#
  181.     while ( getDvar( #"7D075455" ) != "on" )
  182.     {
  183.         wait 0,1;
  184.     }
  185.     players = getplayers();
  186.     _a218 = players;
  187.     _k218 = getFirstArrayKey( _a218 );
  188.     while ( isDefined( _k218 ) )
  189.     {
  190.         player = _a218[ _k218 ];
  191.         player set_player_equipment( "equip_dieseldrone_zm" );
  192.         player giveweapon( "equip_dieseldrone_zm" );
  193.         player setweaponammoclip( "equip_dieseldrone_zm", 1 );
  194.         player thread show_equipment_hint( "equip_dieseldrone_zm" );
  195.         player notify( "equip_dieseldrone_zm" + "_given" );
  196.         player set_equipment_invisibility_to_player( "equip_dieseldrone_zm", 1 );
  197.         player setactionslot( 1, "weapon", "equip_dieseldrone_zm" );
  198.         _k218 = getNextArrayKey( _a218, _k218 );
  199. #/
  200.     }
  201. }
  202.  
  203. include_craftable( craftable_struct )
  204. {
  205. /#
  206.     println( "ZM >> include_craftable = " + craftable_struct.name );
  207. #/
  208.     maps/mp/zombies/_zm_craftables::include_zombie_craftable( craftable_struct );
  209. }
  210.  
  211. is_craftable()
  212. {
  213.     return self maps/mp/zombies/_zm_craftables::is_craftable();
  214. }
  215.  
  216. is_part_crafted( craftable_name, part_modelname )
  217. {
  218.     return maps/mp/zombies/_zm_craftables::is_part_crafted( craftable_name, part_modelname );
  219. }
  220.  
  221. wait_for_craftable( craftable_name )
  222. {
  223.     level waittill( craftable_name + "_crafted", player );
  224.     return player;
  225. }
  226.  
  227. check_solo_status()
  228. {
  229.     if ( getnumexpectedplayers() == 1 || !sessionmodeisonlinegame() && !sessionmodeisprivate() )
  230.     {
  231.         level.is_forever_solo_game = 1;
  232.     }
  233.     else
  234.     {
  235.         level.is_forever_solo_game = 0;
  236.     }
  237. }
  238.  
  239. player_slow_movement_speed_monitor()
  240. {
  241.     self endon( "disconnect" );
  242.     n_movescale_delta_no_perk = 0,4 / 4;
  243.     n_movescale_delta_staminup = 0,3 / 6;
  244.     n_new_move_scale = 1;
  245.     n_move_scale_delta = 1;
  246.     self.n_move_scale = n_new_move_scale;
  247.     while ( 1 )
  248.     {
  249.         is_player_slowed = 0;
  250.         self.is_player_slowed = 0;
  251.         _a305 = level.a_e_slow_areas;
  252.         _k305 = getFirstArrayKey( _a305 );
  253.         while ( isDefined( _k305 ) )
  254.         {
  255.             area = _a305[ _k305 ];
  256.             if ( self istouching( area ) )
  257.             {
  258.                 self setclientfieldtoplayer( "sndMudSlow", 1 );
  259.                 is_player_slowed = 1;
  260.                 self.is_player_slowed = 1;
  261.                 if ( isDefined( self.played_mud_vo ) && !self.played_mud_vo && isDefined( self.dontspeak ) && !self.dontspeak )
  262.                 {
  263.                     self thread maps/mp/zm_tomb_vo::struggle_mud_vo();
  264.                 }
  265.                 if ( self hasperk( "specialty_longersprint" ) )
  266.                 {
  267.                     n_new_move_scale = 0,7;
  268.                     n_move_scale_delta = n_movescale_delta_staminup;
  269.                 }
  270.                 else
  271.                 {
  272.                     n_new_move_scale = 0,6;
  273.                     n_move_scale_delta = n_movescale_delta_no_perk;
  274.                 }
  275.                 break;
  276.             }
  277.             else
  278.             {
  279.                 _k305 = getNextArrayKey( _a305, _k305 );
  280.             }
  281.         }
  282.         if ( !is_player_slowed )
  283.         {
  284.             self setclientfieldtoplayer( "sndMudSlow", 0 );
  285.             self notify( "mud_slowdown_cleared" );
  286.             n_new_move_scale = 1;
  287.         }
  288.         if ( self.n_move_scale != n_new_move_scale )
  289.         {
  290.             if ( self.n_move_scale > ( n_new_move_scale + n_move_scale_delta ) )
  291.             {
  292.                 self.n_move_scale -= n_move_scale_delta;
  293.             }
  294.             else
  295.             {
  296.                 self.n_move_scale = n_new_move_scale;
  297.             }
  298.             self setmovespeedscale( self.n_move_scale );
  299.         }
  300.         wait 0,1;
  301.     }
  302. }
  303.  
  304. dug_zombie_spawn_init( animname_set )
  305. {
  306.     if ( !isDefined( animname_set ) )
  307.     {
  308.         animname_set = 0;
  309.     }
  310.     self.targetname = "zombie";
  311.     self.script_noteworthy = undefined;
  312.     if ( !animname_set )
  313.     {
  314.         self.animname = "zombie";
  315.     }
  316.     if ( isDefined( get_gamemode_var( "pre_init_zombie_spawn_func" ) ) )
  317.     {
  318.         self [[ get_gamemode_var( "pre_init_zombie_spawn_func" ) ]]();
  319.     }
  320.     self thread play_ambient_zombie_vocals();
  321.     self.zmb_vocals_attack = "zmb_vocals_zombie_attack";
  322.     self.ignoreall = 1;
  323.     self.ignoreme = 1;
  324.     self.allowdeath = 1;
  325.     self.force_gib = 1;
  326.     self.is_zombie = 1;
  327.     self.has_legs = 1;
  328.     self allowedstances( "stand" );
  329.     self.zombie_damaged_by_bar_knockdown = 0;
  330.     self.gibbed = 0;
  331.     self.head_gibbed = 0;
  332.     self setphysparams( 15, 0, 72 );
  333.     self.disablearrivals = 1;
  334.     self.disableexits = 1;
  335.     self.grenadeawareness = 0;
  336.     self.badplaceawareness = 0;
  337.     self.ignoresuppression = 1;
  338.     self.suppressionthreshold = 1;
  339.     self.nododgemove = 1;
  340.     self.dontshootwhilemoving = 1;
  341.     self.pathenemylookahead = 0;
  342.     self.badplaceawareness = 0;
  343.     self.chatinitialized = 0;
  344.     self.a.disablepain = 1;
  345.     self disable_react();
  346.     if ( isDefined( level.zombie_health ) )
  347.     {
  348.         self.maxhealth = level.zombie_health;
  349.         if ( isDefined( level.zombie_respawned_health ) && level.zombie_respawned_health.size > 0 )
  350.         {
  351.             self.health = level.zombie_respawned_health[ 0 ];
  352.             arrayremovevalue( level.zombie_respawned_health, level.zombie_respawned_health[ 0 ] );
  353.         }
  354.         else
  355.         {
  356.             self.health = level.zombie_health;
  357.         }
  358.     }
  359.     else
  360.     {
  361.         self.maxhealth = level.zombie_vars[ "zombie_health_start" ];
  362.         self.health = self.maxhealth;
  363.     }
  364.     self.freezegun_damage = 0;
  365.     self.dropweapon = 0;
  366.     level thread zombie_death_event( self );
  367.     self init_zombie_run_cycle();
  368.     self thread dug_zombie_think();
  369.     self thread zombie_gib_on_damage();
  370.     self thread zombie_damage_failsafe();
  371.     self thread enemy_death_detection();
  372.     if ( isDefined( level._zombie_custom_spawn_logic ) )
  373.     {
  374.         if ( isarray( level._zombie_custom_spawn_logic ) )
  375.         {
  376.             i = 0;
  377.             while ( i < level._zombie_custom_spawn_logic.size )
  378.             {
  379.                 self thread [[ level._zombie_custom_spawn_logic[ i ] ]]();
  380.                 i++;
  381.             }
  382.         }
  383.         else self thread [[ level._zombie_custom_spawn_logic ]]();
  384.     }
  385.     if ( !isDefined( self.no_eye_glow ) || !self.no_eye_glow )
  386.     {
  387.         if ( isDefined( self.is_inert ) && !self.is_inert )
  388.         {
  389.             self thread delayed_zombie_eye_glow();
  390.         }
  391.     }
  392.     self.deathfunction = ::zombie_death_animscript;
  393.     self.flame_damage_time = 0;
  394.     self.meleedamage = 60;
  395.     self.no_powerups = 1;
  396.     self zombie_history( "zombie_spawn_init -> Spawned = " + self.origin );
  397.     self.thundergun_knockdown_func = level.basic_zombie_thundergun_knockdown;
  398.     self.tesla_head_gib_func = ::zombie_tesla_head_gib;
  399.     self.team = level.zombie_team;
  400.     if ( isDefined( get_gamemode_var( "post_init_zombie_spawn_func" ) ) )
  401.     {
  402.         self [[ get_gamemode_var( "post_init_zombie_spawn_func" ) ]]();
  403.     }
  404.     if ( isDefined( level.zombie_init_done ) )
  405.     {
  406.         self [[ level.zombie_init_done ]]();
  407.     }
  408.     self.zombie_init_done = 1;
  409.     self notify( "zombie_init_done" );
  410. }
  411.  
  412. dug_zombie_think()
  413. {
  414.     self endon( "death" );
  415. /#
  416.     assert( !self.isdog );
  417. #/
  418.     self.ai_state = "zombie_think";
  419.     find_flesh_struct_string = undefined;
  420.     self waittill( "zombie_custom_think_done", find_flesh_struct_string );
  421.     node = undefined;
  422.     desired_nodes = [];
  423.     self.entrance_nodes = [];
  424.     if ( isDefined( level.max_barrier_search_dist_override ) )
  425.     {
  426.         max_dist = level.max_barrier_search_dist_override;
  427.     }
  428.     else
  429.     {
  430.         max_dist = 500;
  431.     }
  432.     if ( !isDefined( find_flesh_struct_string ) && isDefined( self.target ) && self.target != "" )
  433.     {
  434.         desired_origin = get_desired_origin();
  435. /#
  436.         assert( isDefined( desired_origin ), "Spawner @ " + self.origin + " has a .target but did not find a target" );
  437. #/
  438.         origin = desired_origin;
  439.         node = getclosest( origin, level.exterior_goals );
  440.         self.entrance_nodes[ self.entrance_nodes.size ] = node;
  441.         self zombie_history( "zombie_think -> #1 entrance (script_forcegoal) origin = " + self.entrance_nodes[ 0 ].origin );
  442.     }
  443.     else
  444.     {
  445.         if ( self should_skip_teardown( find_flesh_struct_string ) )
  446.         {
  447.             self zombie_setup_attack_properties();
  448.             if ( isDefined( self.target ) )
  449.             {
  450.                 end_at_node = getnode( self.target, "targetname" );
  451.                 if ( isDefined( end_at_node ) )
  452.                 {
  453.                     self setgoalnode( end_at_node );
  454.                     self waittill( "goal" );
  455.                 }
  456.             }
  457.             if ( isDefined( self.start_inert ) && self.start_inert )
  458.             {
  459.                 self thread maps/mp/zombies/_zm_ai_basic::start_inert( 1 );
  460.                 self zombie_complete_emerging_into_playable_area();
  461.             }
  462.             else
  463.             {
  464.                 self thread maps/mp/zombies/_zm_ai_basic::find_flesh();
  465.                 self thread dug_zombie_entered_playable();
  466.             }
  467.             return;
  468.         }
  469.         else if ( isDefined( find_flesh_struct_string ) )
  470.         {
  471. /#
  472.             assert( isDefined( find_flesh_struct_string ) );
  473. #/
  474.             i = 0;
  475.             while ( i < level.exterior_goals.size )
  476.             {
  477.                 if ( level.exterior_goals[ i ].script_string == find_flesh_struct_string )
  478.                 {
  479.                     node = level.exterior_goals[ i ];
  480.                     break;
  481.                 }
  482.                 else
  483.                 {
  484.                     i++;
  485.                 }
  486.             }
  487.             self.entrance_nodes[ self.entrance_nodes.size ] = node;
  488.             self zombie_history( "zombie_think -> #1 entrance origin = " + node.origin );
  489.             self thread zombie_assure_node();
  490.         }
  491.         else
  492.         {
  493.             origin = self.origin;
  494.             desired_origin = get_desired_origin();
  495.             if ( isDefined( desired_origin ) )
  496.             {
  497.                 origin = desired_origin;
  498.             }
  499.             nodes = get_array_of_closest( origin, level.exterior_goals, undefined, 3 );
  500.             desired_nodes[ 0 ] = nodes[ 0 ];
  501.             prev_dist = distance( self.origin, nodes[ 0 ].origin );
  502.             i = 1;
  503.             while ( i < nodes.size )
  504.             {
  505.                 dist = distance( self.origin, nodes[ i ].origin );
  506.                 if ( ( dist - prev_dist ) > max_dist )
  507.                 {
  508.                     break;
  509.                 }
  510.                 else
  511.                 {
  512.                     prev_dist = dist;
  513.                     desired_nodes[ i ] = nodes[ i ];
  514.                     i++;
  515.                 }
  516.             }
  517.             node = desired_nodes[ 0 ];
  518.             if ( desired_nodes.size > 1 )
  519.             {
  520.                 node = desired_nodes[ randomint( desired_nodes.size ) ];
  521.             }
  522.             self.entrance_nodes = desired_nodes;
  523.             self zombie_history( "zombie_think -> #1 entrance origin = " + node.origin );
  524.             self thread zombie_assure_node();
  525.         }
  526.     }
  527. /#
  528.     assert( isDefined( node ), "Did not find a node!!! [Should not see this!]" );
  529. #/
  530.     level thread draw_line_ent_to_pos( self, node.origin, "goal" );
  531.     self.first_node = node;
  532.     self thread zombie_goto_entrance( node );
  533. }
  534.  
  535. dug_zombie_entered_playable()
  536. {
  537.     self endon( "death" );
  538.     if ( !isDefined( level.playable_areas ) )
  539.     {
  540.         level.playable_areas = getentarray( "player_volume", "script_noteworthy" );
  541.     }
  542.     while ( 1 )
  543.     {
  544.         _a671 = level.playable_areas;
  545.         _k671 = getFirstArrayKey( _a671 );
  546.         while ( isDefined( _k671 ) )
  547.         {
  548.             area = _a671[ _k671 ];
  549.             if ( self istouching( area ) )
  550.             {
  551.                 self dug_zombie_complete_emerging_into_playable_area();
  552.                 return;
  553.             }
  554.             _k671 = getNextArrayKey( _a671, _k671 );
  555.         }
  556.         wait 1;
  557.     }
  558. }
  559.  
  560. dug_zombie_complete_emerging_into_playable_area()
  561. {
  562.     self.completed_emerging_into_playable_area = 1;
  563.     self notify( "completed_emerging_into_playable_area" );
  564.     self.no_powerups = 1;
  565.     self thread zombie_free_cam_allowed();
  566. }
  567.  
  568. dug_zombie_rise( spot, func_rise_fx )
  569. {
  570.     if ( !isDefined( func_rise_fx ) )
  571.     {
  572.         func_rise_fx = ::zombie_rise_fx;
  573.     }
  574.     self endon( "death" );
  575.     self.in_the_ground = 1;
  576.     self.no_eye_glow = 1;
  577.     self.anchor = spawn( "script_origin", self.origin );
  578.     self.anchor.angles = self.angles;
  579.     self linkto( self.anchor );
  580.     if ( !isDefined( spot.angles ) )
  581.     {
  582.         spot.angles = ( 0, 0, 1 );
  583.     }
  584.     anim_org = spot.origin;
  585.     anim_ang = spot.angles;
  586.     self ghost();
  587.     self.anchor moveto( anim_org, 0,05 );
  588.     self.anchor waittill( "movedone" );
  589.     target_org = get_desired_origin();
  590.     if ( isDefined( target_org ) )
  591.     {
  592.         anim_ang = vectorToAngle( target_org - self.origin );
  593.         self.anchor rotateto( ( 0, anim_ang[ 1 ], 0 ), 0,05 );
  594.         self.anchor waittill( "rotatedone" );
  595.     }
  596.     self unlink();
  597.     if ( isDefined( self.anchor ) )
  598.     {
  599.         self.anchor delete();
  600.     }
  601.     self thread hide_pop();
  602.     level thread zombie_rise_death( self, spot );
  603.     spot thread [[ func_rise_fx ]]( self );
  604.     substate = 0;
  605.     if ( self.zombie_move_speed == "walk" )
  606.     {
  607.         substate = randomint( 2 );
  608.     }
  609.     else if ( self.zombie_move_speed == "run" )
  610.     {
  611.         substate = 2;
  612.     }
  613.     else
  614.     {
  615.         if ( self.zombie_move_speed == "sprint" )
  616.         {
  617.             substate = 3;
  618.         }
  619.     }
  620.     self orientmode( "face default" );
  621.     self playsound( "zmb_vocals_capzomb_spawn" );
  622.     self animscripted( self.origin, spot.angles, "zm_dug_rise" );
  623.     self maps/mp/animscripts/zm_shared::donotetracks( "rise_anim", ::handle_rise_notetracks, spot );
  624.     self.no_eye_glow = 0;
  625.     self thread zombie_eye_glow();
  626.     self notify( "rise_anim_finished" );
  627.     spot notify( "stop_zombie_rise_fx" );
  628.     self.in_the_ground = 0;
  629.     self notify( "risen" );
  630. }
  631.  
  632. is_weapon_upgraded_staff( weapon )
  633. {
  634.     if ( weapon == "staff_water_upgraded_zm" )
  635.     {
  636.         return 1;
  637.     }
  638.     else
  639.     {
  640.         if ( weapon == "staff_lightning_upgraded_zm" )
  641.         {
  642.             return 1;
  643.         }
  644.         else
  645.         {
  646.             if ( weapon == "staff_fire_upgraded_zm" )
  647.             {
  648.                 return 1;
  649.             }
  650.             else
  651.             {
  652.                 if ( weapon == "staff_air_upgraded_zm" )
  653.                 {
  654.                     return 1;
  655.                 }
  656.             }
  657.         }
  658.     }
  659.     return 0;
  660. }
  661.  
  662. watch_staff_usage()
  663. {
  664.     self notify( "watch_staff_usage" );
  665.     self endon( "watch_staff_usage" );
  666.     self endon( "disconnect" );
  667.     self setclientfieldtoplayer( "player_staff_charge", 0 );
  668.     while ( 1 )
  669.     {
  670.         self waittill( "weapon_change", weapon );
  671.         has_upgraded_staff = 0;
  672.         has_revive_staff = 0;
  673.         weapon_is_upgraded_staff = is_weapon_upgraded_staff( weapon );
  674.         str_upgraded_staff_weapon = undefined;
  675.         a_str_weapons = self getweaponslist();
  676.         _a820 = a_str_weapons;
  677.         _k820 = getFirstArrayKey( _a820 );
  678.         while ( isDefined( _k820 ) )
  679.         {
  680.             str_weapon = _a820[ _k820 ];
  681.             if ( is_weapon_upgraded_staff( str_weapon ) )
  682.             {
  683.                 has_upgraded_staff = 1;
  684.                 str_upgraded_staff_weapon = str_weapon;
  685.             }
  686.             if ( str_weapon == "staff_revive_zm" )
  687.             {
  688.                 has_revive_staff = 1;
  689.             }
  690.             _k820 = getNextArrayKey( _a820, _k820 );
  691.         }
  692. /#
  693.         if ( has_upgraded_staff && !has_revive_staff )
  694.         {
  695.             has_revive_staff = 1;
  696. #/
  697.         }
  698.         if ( has_upgraded_staff && !has_revive_staff )
  699.         {
  700.             self takeweapon( str_upgraded_staff_weapon );
  701.             has_upgraded_staff = 0;
  702.         }
  703.         if ( !has_upgraded_staff && has_revive_staff )
  704.         {
  705.             self takeweapon( "staff_revive_zm" );
  706.             has_revive_staff = 0;
  707.         }
  708.         if ( !has_revive_staff || !weapon_is_upgraded_staff && weapon != "none" && weaponaltweaponname( weapon ) != "none" )
  709.         {
  710.             self setactionslot( 3, "altmode" );
  711.         }
  712.         else
  713.         {
  714.             self setactionslot( 3, "weapon", "staff_revive_zm" );
  715.         }
  716.         if ( weapon_is_upgraded_staff )
  717.         {
  718.             self thread staff_charge_watch_wrapper( weapon );
  719.         }
  720.     }
  721. }
  722.  
  723. staff_charge_watch()
  724. {
  725.     self endon( "disconnect" );
  726.     self endon( "player_downed" );
  727.     self endon( "weapon_change" );
  728.     self endon( "weapon_fired" );
  729.     while ( !self attackbuttonpressed() )
  730.     {
  731.         wait 0,05;
  732.     }
  733.     n_old_charge = 0;
  734.     while ( 1 )
  735.     {
  736.         if ( n_old_charge != self.chargeshotlevel )
  737.         {
  738.             self setclientfieldtoplayer( "player_staff_charge", self.chargeshotlevel );
  739.             n_old_charge = self.chargeshotlevel;
  740.         }
  741.         wait 0,1;
  742.     }
  743. }
  744.  
  745. staff_charge_watch_wrapper( weapon )
  746. {
  747.     self notify( "staff_charge_watch_wrapper" );
  748.     self endon( "staff_charge_watch_wrapper" );
  749.     self endon( "disconnect" );
  750.     self setclientfieldtoplayer( "player_staff_charge", 0 );
  751.     while ( is_weapon_upgraded_staff( weapon ) )
  752.     {
  753.         self staff_charge_watch();
  754.         self setclientfieldtoplayer( "player_staff_charge", 0 );
  755.         weapon = self getcurrentweapon();
  756.     }
  757. }
  758.  
  759. door_record_hint()
  760. {
  761.     hud = setting_tutorial_hud();
  762.     hud settext( &"ZM_TOMB_RU" );
  763.     wait 3;
  764.     hud destroy();
  765. }
  766.  
  767. swap_staff_hint()
  768. {
  769.     level notify( "staff_Hint" );
  770.     hud = setting_tutorial_hud();
  771.     hud settext( &"ZM_TOMB_OSO" );
  772.     level waittill_any_or_timeout( 3, "staff_hint" );
  773.     hud destroy();
  774. }
  775.  
  776. door_gramophone_elsewhere_hint()
  777. {
  778.     hud = setting_tutorial_hud();
  779.     hud settext( &"ZM_TOMB_GREL" );
  780.     wait 3;
  781.     hud destroy();
  782. }
  783.  
  784. puzzle_debug_position( string_to_show, color, origin, str_dvar, n_show_time )
  785. {
  786. /#
  787.     self endon( "death" );
  788.     self endon( "stop_debug_position" );
  789.     if ( !isDefined( string_to_show ) )
  790.     {
  791.         string_to_show = "+";
  792.     }
  793.     if ( !isDefined( color ) )
  794.     {
  795.         color = vectorScale( ( 0, 0, 1 ), 255 );
  796.     }
  797.     while ( isDefined( str_dvar ) )
  798.     {
  799.         while ( getDvar( "show_craftable_locations" ) != "on" )
  800.         {
  801.             wait 1;
  802.         }
  803.     }
  804.     while ( 1 )
  805.     {
  806.         if ( isDefined( origin ) )
  807.         {
  808.             where_to_draw = origin;
  809.         }
  810.         else
  811.         {
  812.             where_to_draw = self.origin;
  813.         }
  814.         print3d( where_to_draw, string_to_show, color, 1 );
  815.         wait 0,1;
  816.         if ( isDefined( n_show_time ) )
  817.         {
  818.             n_show_time -= 0,1;
  819.             if ( n_show_time <= 0 )
  820.             {
  821.                 return;
  822.             }
  823.         }
  824.         else
  825.         {
  826. #/
  827.         }
  828.     }
  829. }
  830.  
  831. placeholder_puzzle_delete_ent( str_flag_name )
  832. {
  833.     self endon( "death" );
  834.     flag_wait( str_flag_name );
  835.     self delete();
  836. }
  837.  
  838. placeholder_puzzle_spin_model()
  839. {
  840.     self endon( "death" );
  841.     while ( 1 )
  842.     {
  843.         self rotateyaw( 360, 10, 0, 0 );
  844.         wait 9,9;
  845.     }
  846. }
  847.  
  848. setting_tutorial_hud()
  849. {
  850.     client_hint = newclienthudelem( self );
  851.     client_hint.alignx = "center";
  852.     client_hint.aligny = "middle";
  853.     client_hint.horzalign = "center";
  854.     client_hint.vertalign = "bottom";
  855.     client_hint.y = -120;
  856.     client_hint.foreground = 1;
  857.     client_hint.font = "default";
  858.     client_hint.fontscale = 1,5;
  859.     client_hint.alpha = 1;
  860.     client_hint.color = ( 0, 0, 1 );
  861.     return client_hint;
  862. }
  863.  
  864. tomb_trigger_update_message( func_per_player_msg )
  865. {
  866.     a_players = getplayers();
  867.     _a1041 = a_players;
  868.     _k1041 = getFirstArrayKey( _a1041 );
  869.     while ( isDefined( _k1041 ) )
  870.     {
  871.         e_player = _a1041[ _k1041 ];
  872.         n_player = e_player getentitynumber();
  873.         if ( !isDefined( self.stub.playertrigger[ n_player ] ) )
  874.         {
  875.         }
  876.         else
  877.         {
  878.             new_msg = self [[ func_per_player_msg ]]( e_player );
  879.             self.stub.playertrigger[ n_player ].stored_hint_string = new_msg;
  880.             self.stub.playertrigger[ n_player ] sethintstring( new_msg );
  881.         }
  882.         _k1041 = getNextArrayKey( _a1041, _k1041 );
  883.     }
  884. }
  885.  
  886. set_unitrigger_hint_string( str_message )
  887. {
  888.     self.hint_string = str_message;
  889.     maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self );
  890.     maps/mp/zombies/_zm_unitrigger::register_unitrigger( self, ::tomb_unitrigger_think );
  891. }
  892.  
  893. tomb_spawn_trigger_radius( origin, radius, use_trigger, func_per_player_msg )
  894. {
  895.     if ( !isDefined( use_trigger ) )
  896.     {
  897.         use_trigger = 0;
  898.     }
  899.     trigger_stub = spawnstruct();
  900.     trigger_stub.origin = origin;
  901.     trigger_stub.radius = radius;
  902.     if ( use_trigger )
  903.     {
  904.         trigger_stub.cursor_hint = "HINT_NOICON";
  905.         trigger_stub.script_unitrigger_type = "unitrigger_radius_use";
  906.     }
  907.     else
  908.     {
  909.         trigger_stub.script_unitrigger_type = "unitrigger_radius";
  910.     }
  911.     if ( isDefined( func_per_player_msg ) )
  912.     {
  913.         trigger_stub.func_update_msg = func_per_player_msg;
  914.         maps/mp/zombies/_zm_unitrigger::unitrigger_force_per_player_triggers( trigger_stub, 1 );
  915.     }
  916.     maps/mp/zombies/_zm_unitrigger::register_unitrigger( trigger_stub, ::tomb_unitrigger_think );
  917.     return trigger_stub;
  918. }
  919.  
  920. tomb_unitrigger_think()
  921. {
  922.     self endon( "kill_trigger" );
  923.     if ( isDefined( self.stub.func_update_msg ) )
  924.     {
  925.         self thread tomb_trigger_update_message( self.stub.func_update_msg );
  926.     }
  927.     while ( 1 )
  928.     {
  929.         self waittill( "trigger", player );
  930.         self.stub notify( "trigger" );
  931.     }
  932. }
  933.  
  934. tomb_unitrigger_delete()
  935. {
  936.     maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self );
  937.     self structdelete();
  938. }
  939.  
  940. zombie_gib_all()
  941. {
  942.     if ( !isDefined( self ) )
  943.     {
  944.         return;
  945.     }
  946.     if ( isDefined( self.is_mechz ) && self.is_mechz )
  947.     {
  948.         return;
  949.     }
  950.     a_gib_ref = [];
  951.     a_gib_ref[ 0 ] = level._zombie_gib_piece_index_all;
  952.     self gib( "normal", a_gib_ref );
  953.     self ghost();
  954.     wait 0,4;
  955.     if ( isDefined( self ) )
  956.     {
  957.         self self_delete();
  958.     }
  959. }
  960.  
  961. zombie_gib_guts()
  962. {
  963.     if ( !isDefined( self ) )
  964.     {
  965.         return;
  966.     }
  967.     if ( isDefined( self.is_mechz ) && self.is_mechz )
  968.     {
  969.         return;
  970.     }
  971.     v_origin = self gettagorigin( "J_SpineLower" );
  972.     if ( isDefined( v_origin ) )
  973.     {
  974.         v_forward = anglesToForward( ( 0, randomint( 360 ), 0 ) );
  975.         playfx( level._effect[ "zombie_guts_explosion" ], v_origin, v_forward );
  976.     }
  977.     wait_network_frame();
  978.     if ( isDefined( self ) )
  979.     {
  980.         self ghost();
  981.         wait randomfloatrange( 0,4, 1,1 );
  982.         if ( isDefined( self ) )
  983.         {
  984.             self self_delete();
  985.         }
  986.     }
  987. }
  988.  
  989. link_platform_nodes( nd_1, nd_2 )
  990. {
  991.     if ( !nodesarelinked( nd_1, nd_2 ) )
  992.     {
  993.         link_nodes( nd_1, nd_2 );
  994.     }
  995.     if ( !nodesarelinked( nd_2, nd_1 ) )
  996.     {
  997.         link_nodes( nd_2, nd_1 );
  998.     }
  999. }
  1000.  
  1001. unlink_platform_nodes( nd_1, nd_2 )
  1002. {
  1003.     if ( nodesarelinked( nd_1, nd_2 ) )
  1004.     {
  1005.         unlink_nodes( nd_1, nd_2 );
  1006.     }
  1007.     if ( nodesarelinked( nd_2, nd_1 ) )
  1008.     {
  1009.         unlink_nodes( nd_2, nd_1 );
  1010.     }
  1011. }
  1012.  
  1013. init_weather_manager()
  1014. {
  1015.     level.weather_snow = 0;
  1016.     level.weather_rain = 0;
  1017.     level.weather_fog = 0;
  1018.     level.weather_vision = 0;
  1019.     level thread weather_manager();
  1020.     level thread rotate_skydome();
  1021.     onplayerconnect_callback( ::set_weather_to_player );
  1022.     level.force_weather = [];
  1023.     if ( cointoss() )
  1024.     {
  1025.         level.force_weather[ 3 ] = "snow";
  1026.     }
  1027.     else
  1028.     {
  1029.         level.force_weather[ 4 ] = "snow";
  1030.     }
  1031.     i = 5;
  1032.     while ( i <= 9 )
  1033.     {
  1034.         if ( cointoss() )
  1035.         {
  1036.             level.force_weather[ i ] = "none";
  1037.             i++;
  1038.             continue;
  1039.         }
  1040.         else
  1041.         {
  1042.             level.force_weather[ i ] = "rain";
  1043.         }
  1044.         i++;
  1045.     }
  1046.     level.force_weather[ 10 ] = "snow";
  1047. }
  1048.  
  1049. randomize_weather()
  1050. {
  1051.     weather_name = level.force_weather[ level.round_number ];
  1052.     if ( !isDefined( weather_name ) )
  1053.     {
  1054.         n_round_weather = randomint( 100 );
  1055.         rounds_since_snow = level.round_number - level.last_snow_round;
  1056.         rounds_since_rain = level.round_number - level.last_rain_round;
  1057.         if ( n_round_weather < 40 || rounds_since_snow > 3 )
  1058.         {
  1059.             weather_name = "snow";
  1060.         }
  1061.         else
  1062.         {
  1063.             if ( n_round_weather < 80 || rounds_since_rain > 4 )
  1064.             {
  1065.                 weather_name = "rain";
  1066.             }
  1067.             else
  1068.             {
  1069.                 weather_name = "none";
  1070.             }
  1071.         }
  1072.     }
  1073.     if ( weather_name == "snow" )
  1074.     {
  1075.         level.weather_snow = randomintrange( 1, 5 );
  1076.         level.weather_rain = 0;
  1077.         level.weather_vision = 2;
  1078.         level.last_snow_round = level.round_number;
  1079.     }
  1080.     else if ( weather_name == "rain" )
  1081.     {
  1082.         level.weather_snow = 0;
  1083.         level.weather_rain = randomintrange( 1, 5 );
  1084.         level.weather_vision = 1;
  1085.         level.last_rain_round = level.round_number;
  1086.     }
  1087.     else
  1088.     {
  1089.         level.weather_snow = 0;
  1090.         level.weather_rain = 0;
  1091.         level.weather_vision = 3;
  1092.     }
  1093. }
  1094.  
  1095. weather_manager()
  1096. {
  1097.     level.last_snow_round = 0;
  1098.     level.last_rain_round = 0;
  1099.     while ( 1 )
  1100.     {
  1101.         level waittill( "end_of_round" );
  1102.         randomize_weather();
  1103.         level setclientfield( "rain_level", level.weather_rain );
  1104.         level setclientfield( "snow_level", level.weather_snow );
  1105.         wait 2;
  1106.         _a1330 = getplayers();
  1107.         _k1330 = getFirstArrayKey( _a1330 );
  1108.         while ( isDefined( _k1330 ) )
  1109.         {
  1110.             player = _a1330[ _k1330 ];
  1111.             if ( is_player_valid( player, 0, 1 ) )
  1112.             {
  1113.                 player set_weather_to_player();
  1114.             }
  1115.             _k1330 = getNextArrayKey( _a1330, _k1330 );
  1116.         }
  1117.     }
  1118. }
  1119.  
  1120. set_weather_to_player()
  1121. {
  1122.     self setclientfieldtoplayer( "player_weather_visionset", level.weather_vision );
  1123. }
  1124.  
  1125. rotate_skydome()
  1126. {
  1127.     level.sky_rotation = 360;
  1128.     while ( 1 )
  1129.     {
  1130.         level.sky_rotation -= 0,025;
  1131.         if ( level.sky_rotation < 0 )
  1132.         {
  1133.             level.sky_rotation += 360;
  1134.         }
  1135.         setdvar( "r_skyRotation", level.sky_rotation );
  1136.         wait 0,1;
  1137.     }
  1138. }
  1139.  
  1140. play_puzzle_stinger_on_all_players()
  1141. {
  1142.     players = getplayers();
  1143.     _a1367 = players;
  1144.     _k1367 = getFirstArrayKey( _a1367 );
  1145.     while ( isDefined( _k1367 ) )
  1146.     {
  1147.         player = _a1367[ _k1367 ];
  1148.         player playsound( "zmb_squest_step2_finished" );
  1149.         _k1367 = getNextArrayKey( _a1367, _k1367 );
  1150.     }
  1151. }
  1152.  
  1153. puzzle_orb_move( v_to_pos )
  1154. {
  1155.     dist = distance( self.origin, v_to_pos );
  1156.     if ( dist == 0 )
  1157.     {
  1158.         return;
  1159.     }
  1160.     movetime = dist / 300;
  1161.     self moveto( v_to_pos, movetime, 0, 0 );
  1162.     self waittill( "movedone" );
  1163. }
  1164.  
  1165. puzzle_orb_follow_path( s_start )
  1166. {
  1167.     s_next_pos = s_start;
  1168.     while ( isDefined( s_next_pos ) )
  1169.     {
  1170.         self puzzle_orb_move( s_next_pos.origin );
  1171.         if ( isDefined( s_next_pos.target ) )
  1172.         {
  1173.             s_next_pos = getstruct( s_next_pos.target, "targetname" );
  1174.             continue;
  1175.         }
  1176.         else
  1177.         {
  1178.             s_next_pos = undefined;
  1179.         }
  1180.     }
  1181. }
  1182.  
  1183. puzzle_orb_follow_return_path( s_start, n_element )
  1184. {
  1185.     a_path = [];
  1186.     s_next = s_start;
  1187.     while ( isDefined( s_next ) )
  1188.     {
  1189.         a_path[ a_path.size ] = s_next;
  1190.         if ( isDefined( s_next.target ) )
  1191.         {
  1192.             s_next = getstruct( s_next.target, "targetname" );
  1193.             continue;
  1194.         }
  1195.         else
  1196.         {
  1197.             s_next = undefined;
  1198.         }
  1199.     }
  1200.     v_start = a_path[ a_path.size - 1 ].origin + vectorScale( ( 0, 0, 1 ), 1000 );
  1201.     e_model = spawn( "script_model", v_start );
  1202.     e_model setmodel( s_start.model );
  1203.     e_model setclientfield( "element_glow_fx", n_element );
  1204.     playfxontag( level._effect[ "puzzle_orb_trail" ], e_model, "tag_origin" );
  1205.     i = a_path.size - 1;
  1206.     while ( i >= 0 )
  1207.     {
  1208.         e_model puzzle_orb_move( a_path[ i ].origin );
  1209.         i--;
  1210.  
  1211.     }
  1212.     return e_model;
  1213. }
  1214.  
  1215. puzzle_orb_pillar_show()
  1216. {
  1217.     level notify( "sky_pillar_reset" );
  1218.     level endon( "sky_pillar_reset" );
  1219.     s_pillar = getstruct( "crypt_pillar", "targetname" );
  1220.     exploder( 333 );
  1221.     if ( isDefined( s_pillar.e_model ) )
  1222.     {
  1223.         s_pillar.e_model delete();
  1224.     }
  1225.     s_pillar.e_model = spawn( "script_model", s_pillar.origin );
  1226.     s_pillar.e_model endon( "death" );
  1227.     s_pillar.e_model ghost();
  1228.     s_pillar.e_model setmodel( "fxuse_sky_pillar_new" );
  1229.     s_pillar.e_model setclientfield( "sky_pillar", 1 );
  1230.     wait_network_frame();
  1231.     s_pillar.e_model show();
  1232.     wait 1;
  1233.     wait 27,5;
  1234.     s_pillar.e_model setclientfield( "sky_pillar", 0 );
  1235.     wait 1;
  1236.     s_pillar.e_model delete();
  1237. }
  1238.  
  1239. any_player_looking_at_plinth( min_lookat_dot, n_near_dist_sq )
  1240. {
  1241.     players = getplayers();
  1242.     _a1482 = players;
  1243.     _k1482 = getFirstArrayKey( _a1482 );
  1244.     while ( isDefined( _k1482 ) )
  1245.     {
  1246.         player = _a1482[ _k1482 ];
  1247.         dist_sq = distance2dsquared( player.origin, self.origin );
  1248.         if ( dist_sq < n_near_dist_sq )
  1249.         {
  1250.             fvec = anglesToForward( player.angles );
  1251.             to_self = self.origin - player.origin;
  1252.             to_self = vectornormalize( to_self );
  1253.             dot_to_self = vectordot( to_self, fvec );
  1254.             if ( dot_to_self > min_lookat_dot )
  1255.             {
  1256.                 return 1;
  1257.             }
  1258.         }
  1259.         _k1482 = getNextArrayKey( _a1482, _k1482 );
  1260.     }
  1261.     return 0;
  1262. }
  1263.  
  1264. puzzle_orb_ready_to_leave( str_zone, min_lookat_dot, n_near_dist_sq )
  1265. {
  1266.     if ( !level.zones[ str_zone ].is_occupied || flag( "chamber_puzzle_cheat" ) )
  1267.     {
  1268.         return 1;
  1269.     }
  1270.     return any_player_looking_at_plinth( min_lookat_dot, n_near_dist_sq );
  1271. }
  1272.  
  1273. puzzle_orb_chamber_to_crypt( str_start_point, e_gem_pos )
  1274. {
  1275.     a_puzzle_flags = strtok( e_gem_pos.script_flag, " " );
  1276. /#
  1277.     assert( a_puzzle_flags.size == 2 );
  1278. #/
  1279.     _a1517 = a_puzzle_flags;
  1280.     _k1517 = getFirstArrayKey( _a1517 );
  1281.     while ( isDefined( _k1517 ) )
  1282.     {
  1283.         str_flag = _a1517[ _k1517 ];
  1284. /#
  1285.         assert( level flag_exists( str_flag ) );
  1286. #/
  1287.         _k1517 = getNextArrayKey( _a1517, _k1517 );
  1288.     }
  1289.     flag_wait( a_puzzle_flags[ 0 ] );
  1290.     s_start = getstruct( str_start_point, "targetname" );
  1291.     e_model = spawn( "script_model", s_start.origin );
  1292.     e_model setmodel( s_start.model );
  1293.     e_model.script_int = e_gem_pos.script_int;
  1294.     wait_network_frame();
  1295.     e_model playsound( "zmb_squest_crystal_leave" );
  1296.     wait_network_frame();
  1297.     e_model playloopsound( "zmb_squest_crystal_loop", 1 );
  1298.     str_zone = maps/mp/zombies/_zm_zonemgr::get_zone_from_position( s_start.origin, 1 );
  1299.     time_looking_at_orb = 0;
  1300.     min_lookat_dot = cos( 30 );
  1301.     n_near_dist_sq = 32400;
  1302.     while ( time_looking_at_orb < 1 )
  1303.     {
  1304.         wait 0,1;
  1305.         if ( s_start puzzle_orb_ready_to_leave( str_zone, min_lookat_dot, n_near_dist_sq ) )
  1306.         {
  1307.             time_looking_at_orb += 0,1;
  1308.             continue;
  1309.         }
  1310.         else
  1311.         {
  1312.             time_looking_at_orb = 0;
  1313.         }
  1314.     }
  1315.     wait_network_frame();
  1316.     playfxontag( level._effect[ "puzzle_orb_trail" ], e_model, "tag_origin" );
  1317.     wait_network_frame();
  1318.     s_next_pos = getstruct( s_start.target, "targetname" );
  1319.     e_model puzzle_orb_follow_path( s_next_pos );
  1320.     v_sky_pos = e_model.origin;
  1321.     v_sky_pos = ( v_sky_pos[ 0 ], v_sky_pos[ 1 ], v_sky_pos[ 2 ] + 1000 );
  1322.     e_model puzzle_orb_move( v_sky_pos );
  1323.     e_model ghost();
  1324.     s_descend_start = getstruct( "orb_crypt_descent_path", "targetname" );
  1325.     v_pos_above_gem = s_descend_start.origin + vectorScale( ( 0, 0, 1 ), 3000 );
  1326.     e_model moveto( v_pos_above_gem, 0,05, 0, 0 );
  1327.     e_model waittill( "movedone" );
  1328.     flag_wait( a_puzzle_flags[ 1 ] );
  1329.     e_model show();
  1330.     level thread puzzle_orb_pillar_show();
  1331.     e_model puzzle_orb_follow_path( s_descend_start );
  1332.     flag_set( "disc_rotation_active" );
  1333.     e_model puzzle_orb_move( e_gem_pos.origin );
  1334.     e_model_nofx = spawn( "script_model", e_model.origin );
  1335.     e_model_nofx setmodel( e_model.model );
  1336.     e_model_nofx.script_int = e_gem_pos.script_int;
  1337.     e_model delete();
  1338.     wait_network_frame();
  1339.     e_model_nofx playsound( "zmb_squest_crystal_arrive" );
  1340.     wait_network_frame();
  1341.     e_model_nofx playloopsound( "zmb_squest_crystal_loop", 1 );
  1342.     flag_clear( "disc_rotation_active" );
  1343.     return e_model_nofx;
  1344. }
  1345.  
  1346. capture_zombie_spawn_init( animname_set )
  1347. {
  1348.     if ( !isDefined( animname_set ) )
  1349.     {
  1350.         animname_set = 0;
  1351.     }
  1352.     self.targetname = "capture_zombie_ai";
  1353.     if ( !animname_set )
  1354.     {
  1355.         self.animname = "zombie";
  1356.     }
  1357.     self.sndname = "capzomb";
  1358.     if ( isDefined( get_gamemode_var( "pre_init_zombie_spawn_func" ) ) )
  1359.     {
  1360.         self [[ get_gamemode_var( "pre_init_zombie_spawn_func" ) ]]();
  1361.     }
  1362.     self thread play_ambient_zombie_vocals();
  1363.     self.zmb_vocals_attack = "zmb_vocals_capzomb_attack";
  1364.     self.no_damage_points = 1;
  1365.     self.deathpoints_already_given = 1;
  1366.     self.ignore_enemy_count = 1;
  1367.     self.ignoreall = 1;
  1368.     self.ignoreme = 1;
  1369.     self.allowdeath = 1;
  1370.     self.force_gib = 1;
  1371.     self.is_zombie = 1;
  1372.     self.has_legs = 1;
  1373.     self allowedstances( "stand" );
  1374.     self.zombie_damaged_by_bar_knockdown = 0;
  1375.     self.gibbed = 0;
  1376.     self.head_gibbed = 0;
  1377.     self.disablearrivals = 1;
  1378.     self.disableexits = 1;
  1379.     self.grenadeawareness = 0;
  1380.     self.badplaceawareness = 0;
  1381.     self.ignoresuppression = 1;
  1382.     self.suppressionthreshold = 1;
  1383.     self.nododgemove = 1;
  1384.     self.dontshootwhilemoving = 1;
  1385.     self.pathenemylookahead = 0;
  1386.     self.badplaceawareness = 0;
  1387.     self.chatinitialized = 0;
  1388.     self.a.disablepain = 1;
  1389.     self disable_react();
  1390.     if ( isDefined( level.zombie_health ) )
  1391.     {
  1392.         self.maxhealth = level.zombie_health;
  1393.         if ( isDefined( level.zombie_respawned_health ) && level.zombie_respawned_health.size > 0 )
  1394.         {
  1395.             self.health = level.zombie_respawned_health[ 0 ];
  1396.             arrayremovevalue( level.zombie_respawned_health, level.zombie_respawned_health[ 0 ] );
  1397.         }
  1398.         else
  1399.         {
  1400.             self.health = level.zombie_health;
  1401.         }
  1402.     }
  1403.     else
  1404.     {
  1405.         self.maxhealth = level.zombie_vars[ "zombie_health_start" ];
  1406.         self.health = self.maxhealth;
  1407.     }
  1408.     self.freezegun_damage = 0;
  1409.     self.dropweapon = 0;
  1410.     level thread zombie_death_event( self );
  1411.     self set_zombie_run_cycle();
  1412.     self thread dug_zombie_think();
  1413.     self thread zombie_gib_on_damage();
  1414.     self thread zombie_damage_failsafe();
  1415.     self thread enemy_death_detection();
  1416.     if ( !isDefined( self.no_eye_glow ) || !self.no_eye_glow )
  1417.     {
  1418.         if ( isDefined( self.is_inert ) && !self.is_inert )
  1419.         {
  1420.             self thread delayed_zombie_eye_glow();
  1421.         }
  1422.     }
  1423.     self.deathfunction = ::zombie_death_animscript;
  1424.     self.flame_damage_time = 0;
  1425.     self.meleedamage = 60;
  1426.     self.no_powerups = 1;
  1427.     self zombie_history( "zombie_spawn_init -> Spawned = " + self.origin );
  1428.     self.thundergun_knockdown_func = level.basic_zombie_thundergun_knockdown;
  1429.     self.tesla_head_gib_func = ::zombie_tesla_head_gib;
  1430.     self.team = level.zombie_team;
  1431.     if ( isDefined( get_gamemode_var( "post_init_zombie_spawn_func" ) ) )
  1432.     {
  1433.         self [[ get_gamemode_var( "post_init_zombie_spawn_func" ) ]]();
  1434.     }
  1435.     self.zombie_init_done = 1;
  1436.     self notify( "zombie_init_done" );
  1437. }
  1438.  
  1439. rumble_players_in_chamber( n_rumble_enum, n_rumble_time )
  1440. {
  1441.     if ( !isDefined( n_rumble_time ) )
  1442.     {
  1443.         n_rumble_time = 0,1;
  1444.     }
  1445.     a_players = getplayers();
  1446.     a_rumbled_players = [];
  1447.     _a1753 = a_players;
  1448.     _k1753 = getFirstArrayKey( _a1753 );
  1449.     while ( isDefined( _k1753 ) )
  1450.     {
  1451.         e_player = _a1753[ _k1753 ];
  1452.         if ( maps/mp/zm_tomb_chamber::is_point_in_chamber( e_player.origin ) )
  1453.         {
  1454.             e_player setclientfieldtoplayer( "player_rumble_and_shake", n_rumble_enum );
  1455.             a_rumbled_players[ a_rumbled_players.size ] = e_player;
  1456.         }
  1457.         _k1753 = getNextArrayKey( _a1753, _k1753 );
  1458.     }
  1459.     wait n_rumble_time;
  1460.     _a1764 = a_rumbled_players;
  1461.     _k1764 = getFirstArrayKey( _a1764 );
  1462.     while ( isDefined( _k1764 ) )
  1463.     {
  1464.         e_player = _a1764[ _k1764 ];
  1465.         e_player setclientfieldtoplayer( "player_rumble_and_shake", 0 );
  1466.         _k1764 = getNextArrayKey( _a1764, _k1764 );
  1467.     }
  1468. }
  1469.  
  1470. rumble_nearby_players( v_center, n_range, n_rumble_enum )
  1471. {
  1472.     n_range_sq = n_range * n_range;
  1473.     a_players = getplayers();
  1474.     a_rumbled_players = [];
  1475.     _a1775 = a_players;
  1476.     _k1775 = getFirstArrayKey( _a1775 );
  1477.     while ( isDefined( _k1775 ) )
  1478.     {
  1479.         e_player = _a1775[ _k1775 ];
  1480.         if ( distancesquared( v_center, e_player.origin ) < n_range_sq )
  1481.         {
  1482.             e_player setclientfieldtoplayer( "player_rumble_and_shake", n_rumble_enum );
  1483.             a_rumbled_players[ a_rumbled_players.size ] = e_player;
  1484.         }
  1485.         _k1775 = getNextArrayKey( _a1775, _k1775 );
  1486.     }
  1487.     wait_network_frame();
  1488.     _a1786 = a_rumbled_players;
  1489.     _k1786 = getFirstArrayKey( _a1786 );
  1490.     while ( isDefined( _k1786 ) )
  1491.     {
  1492.         e_player = _a1786[ _k1786 ];
  1493.         e_player setclientfieldtoplayer( "player_rumble_and_shake", 0 );
  1494.         _k1786 = getNextArrayKey( _a1786, _k1786 );
  1495.     }
  1496. }
  1497.  
  1498. whirlwind_rumble_player( e_whirlwind, str_active_flag )
  1499. {
  1500.     if ( isDefined( self.whirlwind_rumble_on ) && self.whirlwind_rumble_on )
  1501.     {
  1502.         return;
  1503.     }
  1504.     self.whirlwind_rumble_on = 1;
  1505.     n_rumble_level = 1;
  1506.     self setclientfieldtoplayer( "player_rumble_and_shake", 4 );
  1507.     dist_sq = distancesquared( self.origin, e_whirlwind.origin );
  1508.     range_inner_sq = 10000;
  1509.     range_sq = 90000;
  1510.     while ( dist_sq < range_sq )
  1511.     {
  1512.         wait 0,05;
  1513.         if ( !isDefined( e_whirlwind ) )
  1514.         {
  1515.             break;
  1516.         }
  1517.         else if ( isDefined( str_active_flag ) )
  1518.         {
  1519.             if ( !flag( str_active_flag ) )
  1520.             {
  1521.                 break;
  1522.             }
  1523.         }
  1524.         else
  1525.         {
  1526.             dist_sq = distancesquared( self.origin, e_whirlwind.origin );
  1527.             if ( n_rumble_level == 1 && dist_sq < range_inner_sq )
  1528.             {
  1529.                 n_rumble_level = 2;
  1530.                 self setclientfieldtoplayer( "player_rumble_and_shake", 5 );
  1531.                 continue;
  1532.             }
  1533.             else
  1534.             {
  1535.                 if ( n_rumble_level == 2 && dist_sq >= range_inner_sq )
  1536.                 {
  1537.                     n_rumble_level = 1;
  1538.                     self setclientfieldtoplayer( "player_rumble_and_shake", 4 );
  1539.                 }
  1540.             }
  1541.         }
  1542.     }
  1543.     self setclientfieldtoplayer( "player_rumble_and_shake", 0 );
  1544.     self.whirlwind_rumble_on = 0;
  1545. }
  1546.  
  1547. whirlwind_rumble_nearby_players( str_active_flag )
  1548. {
  1549.     range_sq = 90000;
  1550.     while ( flag( str_active_flag ) )
  1551.     {
  1552.         a_players = getplayers();
  1553.         _a1853 = a_players;
  1554.         _k1853 = getFirstArrayKey( _a1853 );
  1555.         while ( isDefined( _k1853 ) )
  1556.         {
  1557.             player = _a1853[ _k1853 ];
  1558.             dist_sq = distancesquared( self.origin, player.origin );
  1559.             if ( dist_sq < range_sq )
  1560.             {
  1561.                 player thread whirlwind_rumble_player( self, str_active_flag );
  1562.             }
  1563.             _k1853 = getNextArrayKey( _a1853, _k1853 );
  1564.         }
  1565.         wait_network_frame();
  1566.     }
  1567. }
  1568.  
  1569. clean_up_bunker_doors()
  1570. {
  1571.     a_door_models = getentarray( "bunker_door", "script_noteworthy" );
  1572.     array_thread( a_door_models, ::bunker_door_clean_up );
  1573. }
  1574.  
  1575. bunker_door_clean_up()
  1576. {
  1577.     self waittill( "movedone" );
  1578.     self delete();
  1579. }
  1580.  
  1581. adjustments_for_solo()
  1582. {
  1583.     if ( isDefined( level.is_forever_solo_game ) && level.is_forever_solo_game )
  1584.     {
  1585.         a_door_buys = getentarray( "zombie_door", "targetname" );
  1586.         array_thread( a_door_buys, ::door_price_reduction_for_solo );
  1587.         a_debris_buys = getentarray( "zombie_debris", "targetname" );
  1588.         array_thread( a_debris_buys, ::door_price_reduction_for_solo );
  1589.         change_weapon_cost( "beretta93r_zm", 750 );
  1590.         change_weapon_cost( "870mcs_zm", 750 );
  1591.     }
  1592. }
  1593.  
  1594. door_price_reduction_for_solo()
  1595. {
  1596.     if ( self.zombie_cost >= 750 )
  1597.     {
  1598.         self.zombie_cost -= 250;
  1599.         if ( self.zombie_cost >= 2500 )
  1600.         {
  1601.             self.zombie_cost -= 250;
  1602.         }
  1603.         if ( self.targetname == "zombie_door" )
  1604.         {
  1605.             self set_hint_string( self, "default_buy_door", self.zombie_cost );
  1606.             return;
  1607.         }
  1608.         else
  1609.         {
  1610.             self set_hint_string( self, "default_buy_debris", self.zombie_cost );
  1611.         }
  1612.     }
  1613. }
  1614.  
  1615. change_weapon_cost( str_weapon, n_cost )
  1616. {
  1617.     level.zombie_weapons[ str_weapon ].cost = n_cost;
  1618.     level.zombie_weapons[ str_weapon ].ammo_cost = round_up_to_ten( int( n_cost * 0,5 ) );
  1619. }
  1620.  
  1621. zone_capture_powerup()
  1622. {
  1623.     while ( 1 )
  1624.     {
  1625.         flag_wait( "zone_capture_in_progress" );
  1626.         flag_waitopen( "zone_capture_in_progress" );
  1627.         wait 2;
  1628.         _a1945 = level.zone_capture.zones;
  1629.         _k1945 = getFirstArrayKey( _a1945 );
  1630.         while ( isDefined( _k1945 ) )
  1631.         {
  1632.             generator = _a1945[ _k1945 ];
  1633.             while ( generator ent_flag( "player_controlled" ) )
  1634.             {
  1635.                 _a1950 = level.a_uts_challenge_boxes;
  1636.                 _k1950 = getFirstArrayKey( _a1950 );
  1637.                 while ( isDefined( _k1950 ) )
  1638.                 {
  1639.                     uts_box = _a1950[ _k1950 ];
  1640.                     if ( uts_box.str_location == "start_bunker" )
  1641.                     {
  1642.                         if ( isDefined( level.is_forever_solo_game ) && level.is_forever_solo_game )
  1643.                         {
  1644.                             level thread maps/mp/zombies/_zm_challenges::open_box( undefined, uts_box, ::maps/mp/zm_tomb_challenges::reward_powerup_double_points, -1 );
  1645.                         }
  1646.                         else
  1647.                         {
  1648.                             level thread maps/mp/zombies/_zm_challenges::open_box( undefined, uts_box, ::maps/mp/zm_tomb_challenges::reward_powerup_zombie_blood, -1 );
  1649.                         }
  1650.                         return;
  1651.                     }
  1652.                     _k1950 = getNextArrayKey( _a1950, _k1950 );
  1653.                 }
  1654.             }
  1655.             _k1945 = getNextArrayKey( _a1945, _k1945 );
  1656.         }
  1657.     }
  1658. }
  1659.  
  1660. traversal_blocker()
  1661. {
  1662.     flag_wait( "activate_zone_nml" );
  1663.     m_traversal_blocker = getent( "traversal_blocker", "targetname" );
  1664.     m_traversal_blocker connectpaths();
  1665.     m_traversal_blocker delete();
  1666. }
  1667.  
  1668. _kill_zombie_network_safe_internal( e_attacker, str_weapon )
  1669. {
  1670.     if ( !isDefined( self ) )
  1671.     {
  1672.         return;
  1673.     }
  1674.     if ( !isalive( self ) )
  1675.     {
  1676.         return;
  1677.     }
  1678.     self.staff_dmg = str_weapon;
  1679.     self dodamage( self.health, self.origin, e_attacker, e_attacker, "none", self.kill_damagetype, 0, str_weapon );
  1680. }
  1681.  
  1682. _damage_zombie_network_safe_internal( e_attacker, str_weapon, n_damage_amt )
  1683. {
  1684.     if ( !isDefined( self ) )
  1685.     {
  1686.         return;
  1687.     }
  1688.     if ( !isalive( self ) )
  1689.     {
  1690.         return;
  1691.     }
  1692.     self dodamage( n_damage_amt, self.origin, e_attacker, e_attacker, "none", self.kill_damagetype, 0, str_weapon );
  1693. }
  1694.  
  1695. do_damage_network_safe( e_attacker, n_amount, str_weapon, str_mod )
  1696. {
  1697.     if ( isDefined( self.is_mechz ) && self.is_mechz )
  1698.     {
  1699.         self dodamage( n_amount, self.origin, e_attacker, e_attacker, "none", str_mod, 0, str_weapon );
  1700.     }
  1701.     else
  1702.     {
  1703.         if ( n_amount < self.health )
  1704.         {
  1705.             self.kill_damagetype = str_mod;
  1706.             maps/mp/zombies/_zm_net::network_safe_init( "dodamage", 6 );
  1707.             self maps/mp/zombies/_zm_net::network_choke_action( "dodamage", ::_damage_zombie_network_safe_internal, e_attacker, str_weapon, n_amount );
  1708.             return;
  1709.         }
  1710.         else
  1711.         {
  1712.             self.kill_damagetype = str_mod;
  1713.             maps/mp/zombies/_zm_net::network_safe_init( "dodamage_kill", 4 );
  1714.             self maps/mp/zombies/_zm_net::network_choke_action( "dodamage_kill", ::_kill_zombie_network_safe_internal, e_attacker, str_weapon );
  1715.         }
  1716.     }
  1717. }
  1718.  
  1719. _throttle_bullet_trace_think()
  1720. {
  1721.     level.bullet_traces_this_frame = 0;
  1722.     wait_network_frame();
  1723. }
  1724.  
  1725. bullet_trace_throttled( v_start, v_end, e_ignore )
  1726. {
  1727.     if ( !isDefined( level.bullet_traces_this_frame ) )
  1728.     {
  1729.         level thread _throttle_bullet_trace_think();
  1730.     }
  1731.     while ( level.bullet_traces_this_frame >= 2 )
  1732.     {
  1733.         wait_network_frame();
  1734.     }
  1735.     level.bullet_traces_this_frame++;
  1736.     return bullettracepassed( v_start, v_end, 0, e_ignore );
  1737. }
  1738.  
  1739. tomb_get_closest_player_using_paths( origin, players )
  1740. {
  1741.     min_length_to_player = 9999999;
  1742.     n_2d_distance_squared = 9999999;
  1743.     player_to_return = undefined;
  1744.     dist_to_tank = undefined;
  1745.     i = 0;
  1746.     while ( i < players.size )
  1747.     {
  1748.         player = players[ i ];
  1749.         if ( !isDefined( player ) )
  1750.         {
  1751.             i++;
  1752.             continue;
  1753.         }
  1754.         else if ( isDefined( player.b_already_on_tank ) && player.b_already_on_tank )
  1755.         {
  1756.             if ( !isDefined( dist_to_tank ) )
  1757.             {
  1758.                 length_to_player = self maps/mp/zm_tomb_tank::tomb_get_path_length_to_tank();
  1759.                 dist_to_tank = length_to_player;
  1760.             }
  1761.             else
  1762.             {
  1763.                 length_to_player = dist_to_tank;
  1764.             }
  1765.         }
  1766.         else
  1767.         {
  1768.             length_to_player = self get_path_length_to_enemy( player );
  1769.         }
  1770.         if ( isDefined( level.validate_enemy_path_length ) )
  1771.         {
  1772.             if ( length_to_player == 0 )
  1773.             {
  1774.                 valid = self thread [[ level.validate_enemy_path_length ]]( player );
  1775.                 if ( !valid )
  1776.                 {
  1777.                     i++;
  1778.                     continue;
  1779.                 }
  1780.             }
  1781.         }
  1782.         else if ( length_to_player < min_length_to_player )
  1783.         {
  1784.             min_length_to_player = length_to_player;
  1785.             player_to_return = player;
  1786.             n_2d_distance_squared = distance2dsquared( self.origin, player.origin );
  1787.             i++;
  1788.             continue;
  1789.         }
  1790.         else
  1791.         {
  1792.             if ( length_to_player == min_length_to_player && length_to_player <= 5 )
  1793.             {
  1794.                 n_new_distance = distance2dsquared( self.origin, player.origin );
  1795.                 if ( n_new_distance < n_2d_distance_squared )
  1796.                 {
  1797.                     min_length_to_player = length_to_player;
  1798.                     player_to_return = player;
  1799.                     n_2d_distance_squared = n_new_distance;
  1800.                 }
  1801.             }
  1802.         }
  1803.         i++;
  1804.     }
  1805.     return player_to_return;
  1806. }
  1807.  
  1808. update_staff_accessories( n_element_index )
  1809. {
  1810. /#
  1811.     if ( !isDefined( n_element_index ) )
  1812.     {
  1813.         n_element_index = 0;
  1814.         str_weapon = self getcurrentweapon();
  1815.         if ( is_weapon_upgraded_staff( str_weapon ) )
  1816.         {
  1817.             s_info = maps/mp/zm_tomb_craftables::get_staff_info_from_weapon_name( str_weapon );
  1818.             if ( isDefined( s_info ) )
  1819.             {
  1820.                 n_element_index = s_info.enum;
  1821.                 s_info.charger.is_charged = 1;
  1822. #/
  1823.             }
  1824.         }
  1825.     }
  1826.     if ( isDefined( self.one_inch_punch_flag_has_been_init ) && !self.one_inch_punch_flag_has_been_init )
  1827.     {
  1828.         cur_weapon = self get_player_melee_weapon();
  1829.         weapon_to_keep = "knife_zm";
  1830.         self.use_staff_melee = 0;
  1831.         if ( n_element_index != 0 )
  1832.         {
  1833.             staff_info = maps/mp/zm_tomb_craftables::get_staff_info_from_element_index( n_element_index );
  1834.             if ( staff_info.charger.is_charged )
  1835.             {
  1836.                 staff_info = staff_info.upgrade;
  1837.             }
  1838.             if ( isDefined( staff_info.melee ) )
  1839.             {
  1840.                 weapon_to_keep = staff_info.melee;
  1841.                 self.use_staff_melee = 1;
  1842.             }
  1843.         }
  1844.         melee_changed = 0;
  1845.         if ( cur_weapon != weapon_to_keep )
  1846.         {
  1847.             self takeweapon( cur_weapon );
  1848.             self giveweapon( weapon_to_keep );
  1849.             self set_player_melee_weapon( weapon_to_keep );
  1850.             melee_changed = 1;
  1851.         }
  1852.     }
  1853.     has_revive = self hasweapon( "staff_revive_zm" );
  1854.     has_upgraded_staff = 0;
  1855.     a_weapons = self getweaponslistprimaries();
  1856.     staff_info = maps/mp/zm_tomb_craftables::get_staff_info_from_element_index( n_element_index );
  1857.     _a2199 = a_weapons;
  1858.     _k2199 = getFirstArrayKey( _a2199 );
  1859.     while ( isDefined( _k2199 ) )
  1860.     {
  1861.         str_weapon = _a2199[ _k2199 ];
  1862.         if ( is_weapon_upgraded_staff( str_weapon ) )
  1863.         {
  1864.             has_upgraded_staff = 1;
  1865.         }
  1866.         _k2199 = getNextArrayKey( _a2199, _k2199 );
  1867.     }
  1868.     if ( has_revive && !has_upgraded_staff )
  1869.     {
  1870.         self setactionslot( 3, "altmode" );
  1871.         self takeweapon( "staff_revive_zm" );
  1872.     }
  1873.     else
  1874.     {
  1875.         if ( !has_revive && has_upgraded_staff )
  1876.         {
  1877.             self setactionslot( 3, "weapon", "staff_revive_zm" );
  1878.             self giveweapon( "staff_revive_zm" );
  1879.             if ( isDefined( staff_info ) )
  1880.             {
  1881.                 if ( isDefined( staff_info.upgrade.revive_ammo_stock ) )
  1882.                 {
  1883.                     self setweaponammostock( "staff_revive_zm", staff_info.upgrade.revive_ammo_stock );
  1884.                     self setweaponammoclip( "staff_revive_zm", staff_info.upgrade.revive_ammo_clip );
  1885.                 }
  1886.             }
  1887.         }
  1888.     }
  1889. }
  1890.  
  1891. get_round_enemy_array_wrapper()
  1892. {
  1893.     if ( isDefined( level.custom_get_round_enemy_array_func ) )
  1894.     {
  1895.         a_enemies = [[ level.custom_get_round_enemy_array_func ]]();
  1896.     }
  1897.     else
  1898.     {
  1899.         a_enemies = get_round_enemy_array();
  1900.     }
  1901.     return a_enemies;
  1902. }
  1903.  
  1904. add_ragdoll()
  1905. {
  1906.     level.n_active_ragdolls++;
  1907.     wait 1;
  1908.     if ( level.n_active_ragdolls > 0 )
  1909.     {
  1910.         level.n_active_ragdolls--;
  1911.  
  1912.     }
  1913. }
  1914.  
  1915. ragdoll_attempt()
  1916. {
  1917.     if ( level.n_active_ragdolls >= 4 )
  1918.     {
  1919.         return 0;
  1920.     }
  1921.     level thread add_ragdoll();
  1922.     return 1;
  1923. }
Advertisement
Add Comment
Please, Sign In to add comment