#include maps/mp/zm_tomb_craftables; #include maps/mp/zm_tomb_tank; #include maps/mp/zm_tomb_challenges; #include maps/mp/zombies/_zm_challenges; #include maps/mp/zm_tomb_chamber; #include maps/mp/zombies/_zm_zonemgr; #include maps/mp/zombies/_zm_unitrigger; #include maps/mp/animscripts/zm_shared; #include maps/mp/zombies/_zm_ai_basic; #include maps/mp/zm_tomb_vo; #include maps/mp/zm_tomb_teleporter; #include maps/mp/zombies/_zm_equipment; #include maps/mp/zombies/_zm_spawner; #include maps/mp/zombies/_zm_net; #include maps/mp/zombies/_zm_utility; #include maps/mp/_utility; #include common_scripts/utility; setup_devgui() { /# execdevgui( "devgui_zombie_tomb" ); level.custom_devgui = ::zombie_devgui_tomb; setdvar( "complete_puzzles1", "off" ); setdvar( "complete_puzzles2", "off" ); setdvar( "open_all_teleporters", "off" ); setdvar( "show_craftable_locations", "off" ); setdvar( "show_morse_code", "off" ); setdvar( "sam_intro_skip", "off" ); adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Quest:1/Open All Teleporters:1" "open_all_teleporters on"\n" ); adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Quest:1/Skip Chamber Puzzles:2" "complete_puzzles1 on"\n" ); adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Quest:1/Skip Top-side Puzzles:3" "complete_puzzles2 on"\n" ); adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Quest:1/Show Craftable Locations:4" "show_craftable_locations on "\n" ); adddebugcommand( "devgui_cmd "Zombies/Tomb:1/Quest:1/Skip Samantha Intro:5" "sam_intro_skip on"\n" ); adddebugcommand( "devgui_cmd "Zombies:2/Tomb:1/Easter Ann:3/Show Morse Code:1" "show_morse_code on "\n" ); level thread watch_devgui_quadrotor(); level thread watch_devgui_complete_puzzles(); level thread watch_for_upgraded_staffs(); #/ } zombie_devgui_tomb( cmd ) { /# cmd_strings = strtok( cmd, " " ); switch( cmd_strings[ 0 ] ) { case "force_recapture_start": level notify( "force_recapture_start" ); break; case "force_capture_zone_1": case "force_capture_zone_2": case "force_capture_zone_3": case "force_capture_zone_4": case "force_capture_zone_5": case "force_capture_zone_6": level notify( "force_zone_capture" ); break; case "force_recapture_zone_1": case "force_recapture_zone_2": case "force_recapture_zone_3": case "force_recapture_zone_4": case "force_recapture_zone_5": case "force_recapture_zone_6": level notify( "force_zone_recapture" ); break; } #/ } watch_for_upgraded_staffs() { /# cmd = ""; while ( 1 ) { wait 0,25; while ( !isDefined( level.zombie_devgui_gun ) || level.zombie_devgui_gun != cmd ) { a_players = get_players(); _a102 = a_players; _k102 = getFirstArrayKey( _a102 ); while ( isDefined( _k102 ) ) { player = _a102[ _k102 ]; has_upgraded_staff = 0; a_str_weapons = player getweaponslist(); _a107 = a_str_weapons; _k107 = getFirstArrayKey( _a107 ); while ( isDefined( _k107 ) ) { str_weapon = _a107[ _k107 ]; if ( is_weapon_upgraded_staff( str_weapon ) ) { has_upgraded_staff = 1; } _k107 = getNextArrayKey( _a107, _k107 ); } if ( has_upgraded_staff ) { player update_staff_accessories(); } _k102 = getNextArrayKey( _a102, _k102 ); } } #/ } } watch_devgui_complete_puzzles() { /# while ( 1 ) { if ( getDvar( "complete_puzzles1" ) == "on" || getDvar( "complete_puzzles2" ) == "on" ) { flag_set( "air_puzzle_1_complete" ); flag_set( "ice_puzzle_1_complete" ); flag_set( "electric_puzzle_1_complete" ); flag_set( "fire_puzzle_1_complete" ); flag_set( "chamber_puzzle_cheat" ); setdvar( "complete_puzzles1", "off" ); level notify( "open_all_gramophone_doors" ); } if ( getDvar( "show_morse_code" ) == "on" ) { flag_set( "show_morse_code" ); setdvar( "show_morse_code", "off" ); } if ( getDvar( "complete_puzzles2" ) == "on" ) { flag_set( "air_puzzle_2_complete" ); flag_set( "ice_puzzle_2_complete" ); flag_set( "electric_puzzle_2_complete" ); flag_set( "fire_puzzle_2_complete" ); flag_set( "chamber_puzzle_cheat" ); flag_set( "staff_air_zm_upgrade_unlocked" ); flag_set( "staff_water_zm_upgrade_unlocked" ); flag_set( "staff_fire_zm_upgrade_unlocked" ); flag_set( "staff_lightning_zm_upgrade_unlocked" ); setdvar( "complete_puzzles2", "off" ); } if ( getDvar( "sam_intro_skip" ) == "on" ) { flag_set( "samantha_intro_done" ); setdvar( "sam_intro_skip", "off" ); } if ( getDvar( "open_all_teleporters" ) == "on" ) { maps/mp/zm_tomb_teleporter::stargate_teleport_enable( 1 ); maps/mp/zm_tomb_teleporter::stargate_teleport_enable( 2 ); maps/mp/zm_tomb_teleporter::stargate_teleport_enable( 3 ); maps/mp/zm_tomb_teleporter::stargate_teleport_enable( 4 ); setdvar( "open_all_teleporters", "off" ); flag_set( "activate_zone_chamber" ); } wait 0,5; #/ } } get_teleport_fx_from_enum( n_enum ) { switch( n_enum ) { case 1: return "teleport_fire"; case 4: return "teleport_ice"; case 3: return "teleport_elec"; case 2: default: return "teleport_air"; } } watch_devgui_quadrotor() { /# while ( getDvar( #"7D075455" ) != "on" ) { wait 0,1; } players = getplayers(); _a218 = players; _k218 = getFirstArrayKey( _a218 ); while ( isDefined( _k218 ) ) { player = _a218[ _k218 ]; player set_player_equipment( "equip_dieseldrone_zm" ); player giveweapon( "equip_dieseldrone_zm" ); player setweaponammoclip( "equip_dieseldrone_zm", 1 ); player thread show_equipment_hint( "equip_dieseldrone_zm" ); player notify( "equip_dieseldrone_zm" + "_given" ); player set_equipment_invisibility_to_player( "equip_dieseldrone_zm", 1 ); player setactionslot( 1, "weapon", "equip_dieseldrone_zm" ); _k218 = getNextArrayKey( _a218, _k218 ); #/ } } include_craftable( craftable_struct ) { /# println( "ZM >> include_craftable = " + craftable_struct.name ); #/ maps/mp/zombies/_zm_craftables::include_zombie_craftable( craftable_struct ); } is_craftable() { return self maps/mp/zombies/_zm_craftables::is_craftable(); } is_part_crafted( craftable_name, part_modelname ) { return maps/mp/zombies/_zm_craftables::is_part_crafted( craftable_name, part_modelname ); } wait_for_craftable( craftable_name ) { level waittill( craftable_name + "_crafted", player ); return player; } check_solo_status() { if ( getnumexpectedplayers() == 1 || !sessionmodeisonlinegame() && !sessionmodeisprivate() ) { level.is_forever_solo_game = 1; } else { level.is_forever_solo_game = 0; } } player_slow_movement_speed_monitor() { self endon( "disconnect" ); n_movescale_delta_no_perk = 0,4 / 4; n_movescale_delta_staminup = 0,3 / 6; n_new_move_scale = 1; n_move_scale_delta = 1; self.n_move_scale = n_new_move_scale; while ( 1 ) { is_player_slowed = 0; self.is_player_slowed = 0; _a305 = level.a_e_slow_areas; _k305 = getFirstArrayKey( _a305 ); while ( isDefined( _k305 ) ) { area = _a305[ _k305 ]; if ( self istouching( area ) ) { self setclientfieldtoplayer( "sndMudSlow", 1 ); is_player_slowed = 1; self.is_player_slowed = 1; if ( isDefined( self.played_mud_vo ) && !self.played_mud_vo && isDefined( self.dontspeak ) && !self.dontspeak ) { self thread maps/mp/zm_tomb_vo::struggle_mud_vo(); } if ( self hasperk( "specialty_longersprint" ) ) { n_new_move_scale = 0,7; n_move_scale_delta = n_movescale_delta_staminup; } else { n_new_move_scale = 0,6; n_move_scale_delta = n_movescale_delta_no_perk; } break; } else { _k305 = getNextArrayKey( _a305, _k305 ); } } if ( !is_player_slowed ) { self setclientfieldtoplayer( "sndMudSlow", 0 ); self notify( "mud_slowdown_cleared" ); n_new_move_scale = 1; } if ( self.n_move_scale != n_new_move_scale ) { if ( self.n_move_scale > ( n_new_move_scale + n_move_scale_delta ) ) { self.n_move_scale -= n_move_scale_delta; } else { self.n_move_scale = n_new_move_scale; } self setmovespeedscale( self.n_move_scale ); } wait 0,1; } } dug_zombie_spawn_init( animname_set ) { if ( !isDefined( animname_set ) ) { animname_set = 0; } self.targetname = "zombie"; self.script_noteworthy = undefined; if ( !animname_set ) { self.animname = "zombie"; } if ( isDefined( get_gamemode_var( "pre_init_zombie_spawn_func" ) ) ) { self [[ get_gamemode_var( "pre_init_zombie_spawn_func" ) ]](); } self thread play_ambient_zombie_vocals(); self.zmb_vocals_attack = "zmb_vocals_zombie_attack"; self.ignoreall = 1; self.ignoreme = 1; self.allowdeath = 1; self.force_gib = 1; self.is_zombie = 1; self.has_legs = 1; self allowedstances( "stand" ); self.zombie_damaged_by_bar_knockdown = 0; self.gibbed = 0; self.head_gibbed = 0; self setphysparams( 15, 0, 72 ); self.disablearrivals = 1; self.disableexits = 1; self.grenadeawareness = 0; self.badplaceawareness = 0; self.ignoresuppression = 1; self.suppressionthreshold = 1; self.nododgemove = 1; self.dontshootwhilemoving = 1; self.pathenemylookahead = 0; self.badplaceawareness = 0; self.chatinitialized = 0; self.a.disablepain = 1; self disable_react(); if ( isDefined( level.zombie_health ) ) { self.maxhealth = level.zombie_health; if ( isDefined( level.zombie_respawned_health ) && level.zombie_respawned_health.size > 0 ) { self.health = level.zombie_respawned_health[ 0 ]; arrayremovevalue( level.zombie_respawned_health, level.zombie_respawned_health[ 0 ] ); } else { self.health = level.zombie_health; } } else { self.maxhealth = level.zombie_vars[ "zombie_health_start" ]; self.health = self.maxhealth; } self.freezegun_damage = 0; self.dropweapon = 0; level thread zombie_death_event( self ); self init_zombie_run_cycle(); self thread dug_zombie_think(); self thread zombie_gib_on_damage(); self thread zombie_damage_failsafe(); self thread enemy_death_detection(); if ( isDefined( level._zombie_custom_spawn_logic ) ) { if ( isarray( level._zombie_custom_spawn_logic ) ) { i = 0; while ( i < level._zombie_custom_spawn_logic.size ) { self thread [[ level._zombie_custom_spawn_logic[ i ] ]](); i++; } } else self thread [[ level._zombie_custom_spawn_logic ]](); } if ( !isDefined( self.no_eye_glow ) || !self.no_eye_glow ) { if ( isDefined( self.is_inert ) && !self.is_inert ) { self thread delayed_zombie_eye_glow(); } } self.deathfunction = ::zombie_death_animscript; self.flame_damage_time = 0; self.meleedamage = 60; self.no_powerups = 1; self zombie_history( "zombie_spawn_init -> Spawned = " + self.origin ); self.thundergun_knockdown_func = level.basic_zombie_thundergun_knockdown; self.tesla_head_gib_func = ::zombie_tesla_head_gib; self.team = level.zombie_team; if ( isDefined( get_gamemode_var( "post_init_zombie_spawn_func" ) ) ) { self [[ get_gamemode_var( "post_init_zombie_spawn_func" ) ]](); } if ( isDefined( level.zombie_init_done ) ) { self [[ level.zombie_init_done ]](); } self.zombie_init_done = 1; self notify( "zombie_init_done" ); } dug_zombie_think() { self endon( "death" ); /# assert( !self.isdog ); #/ self.ai_state = "zombie_think"; find_flesh_struct_string = undefined; self waittill( "zombie_custom_think_done", find_flesh_struct_string ); node = undefined; desired_nodes = []; self.entrance_nodes = []; if ( isDefined( level.max_barrier_search_dist_override ) ) { max_dist = level.max_barrier_search_dist_override; } else { max_dist = 500; } if ( !isDefined( find_flesh_struct_string ) && isDefined( self.target ) && self.target != "" ) { desired_origin = get_desired_origin(); /# assert( isDefined( desired_origin ), "Spawner @ " + self.origin + " has a .target but did not find a target" ); #/ origin = desired_origin; node = getclosest( origin, level.exterior_goals ); self.entrance_nodes[ self.entrance_nodes.size ] = node; self zombie_history( "zombie_think -> #1 entrance (script_forcegoal) origin = " + self.entrance_nodes[ 0 ].origin ); } else { if ( self should_skip_teardown( find_flesh_struct_string ) ) { self zombie_setup_attack_properties(); if ( isDefined( self.target ) ) { end_at_node = getnode( self.target, "targetname" ); if ( isDefined( end_at_node ) ) { self setgoalnode( end_at_node ); self waittill( "goal" ); } } if ( isDefined( self.start_inert ) && self.start_inert ) { self thread maps/mp/zombies/_zm_ai_basic::start_inert( 1 ); self zombie_complete_emerging_into_playable_area(); } else { self thread maps/mp/zombies/_zm_ai_basic::find_flesh(); self thread dug_zombie_entered_playable(); } return; } else if ( isDefined( find_flesh_struct_string ) ) { /# assert( isDefined( find_flesh_struct_string ) ); #/ i = 0; while ( i < level.exterior_goals.size ) { if ( level.exterior_goals[ i ].script_string == find_flesh_struct_string ) { node = level.exterior_goals[ i ]; break; } else { i++; } } self.entrance_nodes[ self.entrance_nodes.size ] = node; self zombie_history( "zombie_think -> #1 entrance origin = " + node.origin ); self thread zombie_assure_node(); } else { origin = self.origin; desired_origin = get_desired_origin(); if ( isDefined( desired_origin ) ) { origin = desired_origin; } nodes = get_array_of_closest( origin, level.exterior_goals, undefined, 3 ); desired_nodes[ 0 ] = nodes[ 0 ]; prev_dist = distance( self.origin, nodes[ 0 ].origin ); i = 1; while ( i < nodes.size ) { dist = distance( self.origin, nodes[ i ].origin ); if ( ( dist - prev_dist ) > max_dist ) { break; } else { prev_dist = dist; desired_nodes[ i ] = nodes[ i ]; i++; } } node = desired_nodes[ 0 ]; if ( desired_nodes.size > 1 ) { node = desired_nodes[ randomint( desired_nodes.size ) ]; } self.entrance_nodes = desired_nodes; self zombie_history( "zombie_think -> #1 entrance origin = " + node.origin ); self thread zombie_assure_node(); } } /# assert( isDefined( node ), "Did not find a node!!! [Should not see this!]" ); #/ level thread draw_line_ent_to_pos( self, node.origin, "goal" ); self.first_node = node; self thread zombie_goto_entrance( node ); } dug_zombie_entered_playable() { self endon( "death" ); if ( !isDefined( level.playable_areas ) ) { level.playable_areas = getentarray( "player_volume", "script_noteworthy" ); } while ( 1 ) { _a671 = level.playable_areas; _k671 = getFirstArrayKey( _a671 ); while ( isDefined( _k671 ) ) { area = _a671[ _k671 ]; if ( self istouching( area ) ) { self dug_zombie_complete_emerging_into_playable_area(); return; } _k671 = getNextArrayKey( _a671, _k671 ); } wait 1; } } dug_zombie_complete_emerging_into_playable_area() { self.completed_emerging_into_playable_area = 1; self notify( "completed_emerging_into_playable_area" ); self.no_powerups = 1; self thread zombie_free_cam_allowed(); } dug_zombie_rise( spot, func_rise_fx ) { if ( !isDefined( func_rise_fx ) ) { func_rise_fx = ::zombie_rise_fx; } self endon( "death" ); self.in_the_ground = 1; self.no_eye_glow = 1; self.anchor = spawn( "script_origin", self.origin ); self.anchor.angles = self.angles; self linkto( self.anchor ); if ( !isDefined( spot.angles ) ) { spot.angles = ( 0, 0, 1 ); } anim_org = spot.origin; anim_ang = spot.angles; self ghost(); self.anchor moveto( anim_org, 0,05 ); self.anchor waittill( "movedone" ); target_org = get_desired_origin(); if ( isDefined( target_org ) ) { anim_ang = vectorToAngle( target_org - self.origin ); self.anchor rotateto( ( 0, anim_ang[ 1 ], 0 ), 0,05 ); self.anchor waittill( "rotatedone" ); } self unlink(); if ( isDefined( self.anchor ) ) { self.anchor delete(); } self thread hide_pop(); level thread zombie_rise_death( self, spot ); spot thread [[ func_rise_fx ]]( self ); substate = 0; if ( self.zombie_move_speed == "walk" ) { substate = randomint( 2 ); } else if ( self.zombie_move_speed == "run" ) { substate = 2; } else { if ( self.zombie_move_speed == "sprint" ) { substate = 3; } } self orientmode( "face default" ); self playsound( "zmb_vocals_capzomb_spawn" ); self animscripted( self.origin, spot.angles, "zm_dug_rise" ); self maps/mp/animscripts/zm_shared::donotetracks( "rise_anim", ::handle_rise_notetracks, spot ); self.no_eye_glow = 0; self thread zombie_eye_glow(); self notify( "rise_anim_finished" ); spot notify( "stop_zombie_rise_fx" ); self.in_the_ground = 0; self notify( "risen" ); } is_weapon_upgraded_staff( weapon ) { if ( weapon == "staff_water_upgraded_zm" ) { return 1; } else { if ( weapon == "staff_lightning_upgraded_zm" ) { return 1; } else { if ( weapon == "staff_fire_upgraded_zm" ) { return 1; } else { if ( weapon == "staff_air_upgraded_zm" ) { return 1; } } } } return 0; } watch_staff_usage() { self notify( "watch_staff_usage" ); self endon( "watch_staff_usage" ); self endon( "disconnect" ); self setclientfieldtoplayer( "player_staff_charge", 0 ); while ( 1 ) { self waittill( "weapon_change", weapon ); has_upgraded_staff = 0; has_revive_staff = 0; weapon_is_upgraded_staff = is_weapon_upgraded_staff( weapon ); str_upgraded_staff_weapon = undefined; a_str_weapons = self getweaponslist(); _a820 = a_str_weapons; _k820 = getFirstArrayKey( _a820 ); while ( isDefined( _k820 ) ) { str_weapon = _a820[ _k820 ]; if ( is_weapon_upgraded_staff( str_weapon ) ) { has_upgraded_staff = 1; str_upgraded_staff_weapon = str_weapon; } if ( str_weapon == "staff_revive_zm" ) { has_revive_staff = 1; } _k820 = getNextArrayKey( _a820, _k820 ); } /# if ( has_upgraded_staff && !has_revive_staff ) { has_revive_staff = 1; #/ } if ( has_upgraded_staff && !has_revive_staff ) { self takeweapon( str_upgraded_staff_weapon ); has_upgraded_staff = 0; } if ( !has_upgraded_staff && has_revive_staff ) { self takeweapon( "staff_revive_zm" ); has_revive_staff = 0; } if ( !has_revive_staff || !weapon_is_upgraded_staff && weapon != "none" && weaponaltweaponname( weapon ) != "none" ) { self setactionslot( 3, "altmode" ); } else { self setactionslot( 3, "weapon", "staff_revive_zm" ); } if ( weapon_is_upgraded_staff ) { self thread staff_charge_watch_wrapper( weapon ); } } } staff_charge_watch() { self endon( "disconnect" ); self endon( "player_downed" ); self endon( "weapon_change" ); self endon( "weapon_fired" ); while ( !self attackbuttonpressed() ) { wait 0,05; } n_old_charge = 0; while ( 1 ) { if ( n_old_charge != self.chargeshotlevel ) { self setclientfieldtoplayer( "player_staff_charge", self.chargeshotlevel ); n_old_charge = self.chargeshotlevel; } wait 0,1; } } staff_charge_watch_wrapper( weapon ) { self notify( "staff_charge_watch_wrapper" ); self endon( "staff_charge_watch_wrapper" ); self endon( "disconnect" ); self setclientfieldtoplayer( "player_staff_charge", 0 ); while ( is_weapon_upgraded_staff( weapon ) ) { self staff_charge_watch(); self setclientfieldtoplayer( "player_staff_charge", 0 ); weapon = self getcurrentweapon(); } } door_record_hint() { hud = setting_tutorial_hud(); hud settext( &"ZM_TOMB_RU" ); wait 3; hud destroy(); } swap_staff_hint() { level notify( "staff_Hint" ); hud = setting_tutorial_hud(); hud settext( &"ZM_TOMB_OSO" ); level waittill_any_or_timeout( 3, "staff_hint" ); hud destroy(); } door_gramophone_elsewhere_hint() { hud = setting_tutorial_hud(); hud settext( &"ZM_TOMB_GREL" ); wait 3; hud destroy(); } puzzle_debug_position( string_to_show, color, origin, str_dvar, n_show_time ) { /# self endon( "death" ); self endon( "stop_debug_position" ); if ( !isDefined( string_to_show ) ) { string_to_show = "+"; } if ( !isDefined( color ) ) { color = vectorScale( ( 0, 0, 1 ), 255 ); } while ( isDefined( str_dvar ) ) { while ( getDvar( "show_craftable_locations" ) != "on" ) { wait 1; } } while ( 1 ) { if ( isDefined( origin ) ) { where_to_draw = origin; } else { where_to_draw = self.origin; } print3d( where_to_draw, string_to_show, color, 1 ); wait 0,1; if ( isDefined( n_show_time ) ) { n_show_time -= 0,1; if ( n_show_time <= 0 ) { return; } } else { #/ } } } placeholder_puzzle_delete_ent( str_flag_name ) { self endon( "death" ); flag_wait( str_flag_name ); self delete(); } placeholder_puzzle_spin_model() { self endon( "death" ); while ( 1 ) { self rotateyaw( 360, 10, 0, 0 ); wait 9,9; } } setting_tutorial_hud() { client_hint = newclienthudelem( self ); client_hint.alignx = "center"; client_hint.aligny = "middle"; client_hint.horzalign = "center"; client_hint.vertalign = "bottom"; client_hint.y = -120; client_hint.foreground = 1; client_hint.font = "default"; client_hint.fontscale = 1,5; client_hint.alpha = 1; client_hint.color = ( 0, 0, 1 ); return client_hint; } tomb_trigger_update_message( func_per_player_msg ) { a_players = getplayers(); _a1041 = a_players; _k1041 = getFirstArrayKey( _a1041 ); while ( isDefined( _k1041 ) ) { e_player = _a1041[ _k1041 ]; n_player = e_player getentitynumber(); if ( !isDefined( self.stub.playertrigger[ n_player ] ) ) { } else { new_msg = self [[ func_per_player_msg ]]( e_player ); self.stub.playertrigger[ n_player ].stored_hint_string = new_msg; self.stub.playertrigger[ n_player ] sethintstring( new_msg ); } _k1041 = getNextArrayKey( _a1041, _k1041 ); } } set_unitrigger_hint_string( str_message ) { self.hint_string = str_message; maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self ); maps/mp/zombies/_zm_unitrigger::register_unitrigger( self, ::tomb_unitrigger_think ); } tomb_spawn_trigger_radius( origin, radius, use_trigger, func_per_player_msg ) { if ( !isDefined( use_trigger ) ) { use_trigger = 0; } trigger_stub = spawnstruct(); trigger_stub.origin = origin; trigger_stub.radius = radius; if ( use_trigger ) { trigger_stub.cursor_hint = "HINT_NOICON"; trigger_stub.script_unitrigger_type = "unitrigger_radius_use"; } else { trigger_stub.script_unitrigger_type = "unitrigger_radius"; } if ( isDefined( func_per_player_msg ) ) { trigger_stub.func_update_msg = func_per_player_msg; maps/mp/zombies/_zm_unitrigger::unitrigger_force_per_player_triggers( trigger_stub, 1 ); } maps/mp/zombies/_zm_unitrigger::register_unitrigger( trigger_stub, ::tomb_unitrigger_think ); return trigger_stub; } tomb_unitrigger_think() { self endon( "kill_trigger" ); if ( isDefined( self.stub.func_update_msg ) ) { self thread tomb_trigger_update_message( self.stub.func_update_msg ); } while ( 1 ) { self waittill( "trigger", player ); self.stub notify( "trigger" ); } } tomb_unitrigger_delete() { maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self ); self structdelete(); } zombie_gib_all() { if ( !isDefined( self ) ) { return; } if ( isDefined( self.is_mechz ) && self.is_mechz ) { return; } a_gib_ref = []; a_gib_ref[ 0 ] = level._zombie_gib_piece_index_all; self gib( "normal", a_gib_ref ); self ghost(); wait 0,4; if ( isDefined( self ) ) { self self_delete(); } } zombie_gib_guts() { if ( !isDefined( self ) ) { return; } if ( isDefined( self.is_mechz ) && self.is_mechz ) { return; } v_origin = self gettagorigin( "J_SpineLower" ); if ( isDefined( v_origin ) ) { v_forward = anglesToForward( ( 0, randomint( 360 ), 0 ) ); playfx( level._effect[ "zombie_guts_explosion" ], v_origin, v_forward ); } wait_network_frame(); if ( isDefined( self ) ) { self ghost(); wait randomfloatrange( 0,4, 1,1 ); if ( isDefined( self ) ) { self self_delete(); } } } link_platform_nodes( nd_1, nd_2 ) { if ( !nodesarelinked( nd_1, nd_2 ) ) { link_nodes( nd_1, nd_2 ); } if ( !nodesarelinked( nd_2, nd_1 ) ) { link_nodes( nd_2, nd_1 ); } } unlink_platform_nodes( nd_1, nd_2 ) { if ( nodesarelinked( nd_1, nd_2 ) ) { unlink_nodes( nd_1, nd_2 ); } if ( nodesarelinked( nd_2, nd_1 ) ) { unlink_nodes( nd_2, nd_1 ); } } init_weather_manager() { level.weather_snow = 0; level.weather_rain = 0; level.weather_fog = 0; level.weather_vision = 0; level thread weather_manager(); level thread rotate_skydome(); onplayerconnect_callback( ::set_weather_to_player ); level.force_weather = []; if ( cointoss() ) { level.force_weather[ 3 ] = "snow"; } else { level.force_weather[ 4 ] = "snow"; } i = 5; while ( i <= 9 ) { if ( cointoss() ) { level.force_weather[ i ] = "none"; i++; continue; } else { level.force_weather[ i ] = "rain"; } i++; } level.force_weather[ 10 ] = "snow"; } randomize_weather() { weather_name = level.force_weather[ level.round_number ]; if ( !isDefined( weather_name ) ) { n_round_weather = randomint( 100 ); rounds_since_snow = level.round_number - level.last_snow_round; rounds_since_rain = level.round_number - level.last_rain_round; if ( n_round_weather < 40 || rounds_since_snow > 3 ) { weather_name = "snow"; } else { if ( n_round_weather < 80 || rounds_since_rain > 4 ) { weather_name = "rain"; } else { weather_name = "none"; } } } if ( weather_name == "snow" ) { level.weather_snow = randomintrange( 1, 5 ); level.weather_rain = 0; level.weather_vision = 2; level.last_snow_round = level.round_number; } else if ( weather_name == "rain" ) { level.weather_snow = 0; level.weather_rain = randomintrange( 1, 5 ); level.weather_vision = 1; level.last_rain_round = level.round_number; } else { level.weather_snow = 0; level.weather_rain = 0; level.weather_vision = 3; } } weather_manager() { level.last_snow_round = 0; level.last_rain_round = 0; while ( 1 ) { level waittill( "end_of_round" ); randomize_weather(); level setclientfield( "rain_level", level.weather_rain ); level setclientfield( "snow_level", level.weather_snow ); wait 2; _a1330 = getplayers(); _k1330 = getFirstArrayKey( _a1330 ); while ( isDefined( _k1330 ) ) { player = _a1330[ _k1330 ]; if ( is_player_valid( player, 0, 1 ) ) { player set_weather_to_player(); } _k1330 = getNextArrayKey( _a1330, _k1330 ); } } } set_weather_to_player() { self setclientfieldtoplayer( "player_weather_visionset", level.weather_vision ); } rotate_skydome() { level.sky_rotation = 360; while ( 1 ) { level.sky_rotation -= 0,025; if ( level.sky_rotation < 0 ) { level.sky_rotation += 360; } setdvar( "r_skyRotation", level.sky_rotation ); wait 0,1; } } play_puzzle_stinger_on_all_players() { players = getplayers(); _a1367 = players; _k1367 = getFirstArrayKey( _a1367 ); while ( isDefined( _k1367 ) ) { player = _a1367[ _k1367 ]; player playsound( "zmb_squest_step2_finished" ); _k1367 = getNextArrayKey( _a1367, _k1367 ); } } puzzle_orb_move( v_to_pos ) { dist = distance( self.origin, v_to_pos ); if ( dist == 0 ) { return; } movetime = dist / 300; self moveto( v_to_pos, movetime, 0, 0 ); self waittill( "movedone" ); } puzzle_orb_follow_path( s_start ) { s_next_pos = s_start; while ( isDefined( s_next_pos ) ) { self puzzle_orb_move( s_next_pos.origin ); if ( isDefined( s_next_pos.target ) ) { s_next_pos = getstruct( s_next_pos.target, "targetname" ); continue; } else { s_next_pos = undefined; } } } puzzle_orb_follow_return_path( s_start, n_element ) { a_path = []; s_next = s_start; while ( isDefined( s_next ) ) { a_path[ a_path.size ] = s_next; if ( isDefined( s_next.target ) ) { s_next = getstruct( s_next.target, "targetname" ); continue; } else { s_next = undefined; } } v_start = a_path[ a_path.size - 1 ].origin + vectorScale( ( 0, 0, 1 ), 1000 ); e_model = spawn( "script_model", v_start ); e_model setmodel( s_start.model ); e_model setclientfield( "element_glow_fx", n_element ); playfxontag( level._effect[ "puzzle_orb_trail" ], e_model, "tag_origin" ); i = a_path.size - 1; while ( i >= 0 ) { e_model puzzle_orb_move( a_path[ i ].origin ); i--; } return e_model; } puzzle_orb_pillar_show() { level notify( "sky_pillar_reset" ); level endon( "sky_pillar_reset" ); s_pillar = getstruct( "crypt_pillar", "targetname" ); exploder( 333 ); if ( isDefined( s_pillar.e_model ) ) { s_pillar.e_model delete(); } s_pillar.e_model = spawn( "script_model", s_pillar.origin ); s_pillar.e_model endon( "death" ); s_pillar.e_model ghost(); s_pillar.e_model setmodel( "fxuse_sky_pillar_new" ); s_pillar.e_model setclientfield( "sky_pillar", 1 ); wait_network_frame(); s_pillar.e_model show(); wait 1; wait 27,5; s_pillar.e_model setclientfield( "sky_pillar", 0 ); wait 1; s_pillar.e_model delete(); } any_player_looking_at_plinth( min_lookat_dot, n_near_dist_sq ) { players = getplayers(); _a1482 = players; _k1482 = getFirstArrayKey( _a1482 ); while ( isDefined( _k1482 ) ) { player = _a1482[ _k1482 ]; dist_sq = distance2dsquared( player.origin, self.origin ); if ( dist_sq < n_near_dist_sq ) { fvec = anglesToForward( player.angles ); to_self = self.origin - player.origin; to_self = vectornormalize( to_self ); dot_to_self = vectordot( to_self, fvec ); if ( dot_to_self > min_lookat_dot ) { return 1; } } _k1482 = getNextArrayKey( _a1482, _k1482 ); } return 0; } puzzle_orb_ready_to_leave( str_zone, min_lookat_dot, n_near_dist_sq ) { if ( !level.zones[ str_zone ].is_occupied || flag( "chamber_puzzle_cheat" ) ) { return 1; } return any_player_looking_at_plinth( min_lookat_dot, n_near_dist_sq ); } puzzle_orb_chamber_to_crypt( str_start_point, e_gem_pos ) { a_puzzle_flags = strtok( e_gem_pos.script_flag, " " ); /# assert( a_puzzle_flags.size == 2 ); #/ _a1517 = a_puzzle_flags; _k1517 = getFirstArrayKey( _a1517 ); while ( isDefined( _k1517 ) ) { str_flag = _a1517[ _k1517 ]; /# assert( level flag_exists( str_flag ) ); #/ _k1517 = getNextArrayKey( _a1517, _k1517 ); } flag_wait( a_puzzle_flags[ 0 ] ); s_start = getstruct( str_start_point, "targetname" ); e_model = spawn( "script_model", s_start.origin ); e_model setmodel( s_start.model ); e_model.script_int = e_gem_pos.script_int; wait_network_frame(); e_model playsound( "zmb_squest_crystal_leave" ); wait_network_frame(); e_model playloopsound( "zmb_squest_crystal_loop", 1 ); str_zone = maps/mp/zombies/_zm_zonemgr::get_zone_from_position( s_start.origin, 1 ); time_looking_at_orb = 0; min_lookat_dot = cos( 30 ); n_near_dist_sq = 32400; while ( time_looking_at_orb < 1 ) { wait 0,1; if ( s_start puzzle_orb_ready_to_leave( str_zone, min_lookat_dot, n_near_dist_sq ) ) { time_looking_at_orb += 0,1; continue; } else { time_looking_at_orb = 0; } } wait_network_frame(); playfxontag( level._effect[ "puzzle_orb_trail" ], e_model, "tag_origin" ); wait_network_frame(); s_next_pos = getstruct( s_start.target, "targetname" ); e_model puzzle_orb_follow_path( s_next_pos ); v_sky_pos = e_model.origin; v_sky_pos = ( v_sky_pos[ 0 ], v_sky_pos[ 1 ], v_sky_pos[ 2 ] + 1000 ); e_model puzzle_orb_move( v_sky_pos ); e_model ghost(); s_descend_start = getstruct( "orb_crypt_descent_path", "targetname" ); v_pos_above_gem = s_descend_start.origin + vectorScale( ( 0, 0, 1 ), 3000 ); e_model moveto( v_pos_above_gem, 0,05, 0, 0 ); e_model waittill( "movedone" ); flag_wait( a_puzzle_flags[ 1 ] ); e_model show(); level thread puzzle_orb_pillar_show(); e_model puzzle_orb_follow_path( s_descend_start ); flag_set( "disc_rotation_active" ); e_model puzzle_orb_move( e_gem_pos.origin ); e_model_nofx = spawn( "script_model", e_model.origin ); e_model_nofx setmodel( e_model.model ); e_model_nofx.script_int = e_gem_pos.script_int; e_model delete(); wait_network_frame(); e_model_nofx playsound( "zmb_squest_crystal_arrive" ); wait_network_frame(); e_model_nofx playloopsound( "zmb_squest_crystal_loop", 1 ); flag_clear( "disc_rotation_active" ); return e_model_nofx; } capture_zombie_spawn_init( animname_set ) { if ( !isDefined( animname_set ) ) { animname_set = 0; } self.targetname = "capture_zombie_ai"; if ( !animname_set ) { self.animname = "zombie"; } self.sndname = "capzomb"; if ( isDefined( get_gamemode_var( "pre_init_zombie_spawn_func" ) ) ) { self [[ get_gamemode_var( "pre_init_zombie_spawn_func" ) ]](); } self thread play_ambient_zombie_vocals(); self.zmb_vocals_attack = "zmb_vocals_capzomb_attack"; self.no_damage_points = 1; self.deathpoints_already_given = 1; self.ignore_enemy_count = 1; self.ignoreall = 1; self.ignoreme = 1; self.allowdeath = 1; self.force_gib = 1; self.is_zombie = 1; self.has_legs = 1; self allowedstances( "stand" ); self.zombie_damaged_by_bar_knockdown = 0; self.gibbed = 0; self.head_gibbed = 0; self.disablearrivals = 1; self.disableexits = 1; self.grenadeawareness = 0; self.badplaceawareness = 0; self.ignoresuppression = 1; self.suppressionthreshold = 1; self.nododgemove = 1; self.dontshootwhilemoving = 1; self.pathenemylookahead = 0; self.badplaceawareness = 0; self.chatinitialized = 0; self.a.disablepain = 1; self disable_react(); if ( isDefined( level.zombie_health ) ) { self.maxhealth = level.zombie_health; if ( isDefined( level.zombie_respawned_health ) && level.zombie_respawned_health.size > 0 ) { self.health = level.zombie_respawned_health[ 0 ]; arrayremovevalue( level.zombie_respawned_health, level.zombie_respawned_health[ 0 ] ); } else { self.health = level.zombie_health; } } else { self.maxhealth = level.zombie_vars[ "zombie_health_start" ]; self.health = self.maxhealth; } self.freezegun_damage = 0; self.dropweapon = 0; level thread zombie_death_event( self ); self set_zombie_run_cycle(); self thread dug_zombie_think(); self thread zombie_gib_on_damage(); self thread zombie_damage_failsafe(); self thread enemy_death_detection(); if ( !isDefined( self.no_eye_glow ) || !self.no_eye_glow ) { if ( isDefined( self.is_inert ) && !self.is_inert ) { self thread delayed_zombie_eye_glow(); } } self.deathfunction = ::zombie_death_animscript; self.flame_damage_time = 0; self.meleedamage = 60; self.no_powerups = 1; self zombie_history( "zombie_spawn_init -> Spawned = " + self.origin ); self.thundergun_knockdown_func = level.basic_zombie_thundergun_knockdown; self.tesla_head_gib_func = ::zombie_tesla_head_gib; self.team = level.zombie_team; if ( isDefined( get_gamemode_var( "post_init_zombie_spawn_func" ) ) ) { self [[ get_gamemode_var( "post_init_zombie_spawn_func" ) ]](); } self.zombie_init_done = 1; self notify( "zombie_init_done" ); } rumble_players_in_chamber( n_rumble_enum, n_rumble_time ) { if ( !isDefined( n_rumble_time ) ) { n_rumble_time = 0,1; } a_players = getplayers(); a_rumbled_players = []; _a1753 = a_players; _k1753 = getFirstArrayKey( _a1753 ); while ( isDefined( _k1753 ) ) { e_player = _a1753[ _k1753 ]; if ( maps/mp/zm_tomb_chamber::is_point_in_chamber( e_player.origin ) ) { e_player setclientfieldtoplayer( "player_rumble_and_shake", n_rumble_enum ); a_rumbled_players[ a_rumbled_players.size ] = e_player; } _k1753 = getNextArrayKey( _a1753, _k1753 ); } wait n_rumble_time; _a1764 = a_rumbled_players; _k1764 = getFirstArrayKey( _a1764 ); while ( isDefined( _k1764 ) ) { e_player = _a1764[ _k1764 ]; e_player setclientfieldtoplayer( "player_rumble_and_shake", 0 ); _k1764 = getNextArrayKey( _a1764, _k1764 ); } } rumble_nearby_players( v_center, n_range, n_rumble_enum ) { n_range_sq = n_range * n_range; a_players = getplayers(); a_rumbled_players = []; _a1775 = a_players; _k1775 = getFirstArrayKey( _a1775 ); while ( isDefined( _k1775 ) ) { e_player = _a1775[ _k1775 ]; if ( distancesquared( v_center, e_player.origin ) < n_range_sq ) { e_player setclientfieldtoplayer( "player_rumble_and_shake", n_rumble_enum ); a_rumbled_players[ a_rumbled_players.size ] = e_player; } _k1775 = getNextArrayKey( _a1775, _k1775 ); } wait_network_frame(); _a1786 = a_rumbled_players; _k1786 = getFirstArrayKey( _a1786 ); while ( isDefined( _k1786 ) ) { e_player = _a1786[ _k1786 ]; e_player setclientfieldtoplayer( "player_rumble_and_shake", 0 ); _k1786 = getNextArrayKey( _a1786, _k1786 ); } } whirlwind_rumble_player( e_whirlwind, str_active_flag ) { if ( isDefined( self.whirlwind_rumble_on ) && self.whirlwind_rumble_on ) { return; } self.whirlwind_rumble_on = 1; n_rumble_level = 1; self setclientfieldtoplayer( "player_rumble_and_shake", 4 ); dist_sq = distancesquared( self.origin, e_whirlwind.origin ); range_inner_sq = 10000; range_sq = 90000; while ( dist_sq < range_sq ) { wait 0,05; if ( !isDefined( e_whirlwind ) ) { break; } else if ( isDefined( str_active_flag ) ) { if ( !flag( str_active_flag ) ) { break; } } else { dist_sq = distancesquared( self.origin, e_whirlwind.origin ); if ( n_rumble_level == 1 && dist_sq < range_inner_sq ) { n_rumble_level = 2; self setclientfieldtoplayer( "player_rumble_and_shake", 5 ); continue; } else { if ( n_rumble_level == 2 && dist_sq >= range_inner_sq ) { n_rumble_level = 1; self setclientfieldtoplayer( "player_rumble_and_shake", 4 ); } } } } self setclientfieldtoplayer( "player_rumble_and_shake", 0 ); self.whirlwind_rumble_on = 0; } whirlwind_rumble_nearby_players( str_active_flag ) { range_sq = 90000; while ( flag( str_active_flag ) ) { a_players = getplayers(); _a1853 = a_players; _k1853 = getFirstArrayKey( _a1853 ); while ( isDefined( _k1853 ) ) { player = _a1853[ _k1853 ]; dist_sq = distancesquared( self.origin, player.origin ); if ( dist_sq < range_sq ) { player thread whirlwind_rumble_player( self, str_active_flag ); } _k1853 = getNextArrayKey( _a1853, _k1853 ); } wait_network_frame(); } } clean_up_bunker_doors() { a_door_models = getentarray( "bunker_door", "script_noteworthy" ); array_thread( a_door_models, ::bunker_door_clean_up ); } bunker_door_clean_up() { self waittill( "movedone" ); self delete(); } adjustments_for_solo() { if ( isDefined( level.is_forever_solo_game ) && level.is_forever_solo_game ) { a_door_buys = getentarray( "zombie_door", "targetname" ); array_thread( a_door_buys, ::door_price_reduction_for_solo ); a_debris_buys = getentarray( "zombie_debris", "targetname" ); array_thread( a_debris_buys, ::door_price_reduction_for_solo ); change_weapon_cost( "beretta93r_zm", 750 ); change_weapon_cost( "870mcs_zm", 750 ); } } door_price_reduction_for_solo() { if ( self.zombie_cost >= 750 ) { self.zombie_cost -= 250; if ( self.zombie_cost >= 2500 ) { self.zombie_cost -= 250; } if ( self.targetname == "zombie_door" ) { self set_hint_string( self, "default_buy_door", self.zombie_cost ); return; } else { self set_hint_string( self, "default_buy_debris", self.zombie_cost ); } } } change_weapon_cost( str_weapon, n_cost ) { level.zombie_weapons[ str_weapon ].cost = n_cost; level.zombie_weapons[ str_weapon ].ammo_cost = round_up_to_ten( int( n_cost * 0,5 ) ); } zone_capture_powerup() { while ( 1 ) { flag_wait( "zone_capture_in_progress" ); flag_waitopen( "zone_capture_in_progress" ); wait 2; _a1945 = level.zone_capture.zones; _k1945 = getFirstArrayKey( _a1945 ); while ( isDefined( _k1945 ) ) { generator = _a1945[ _k1945 ]; while ( generator ent_flag( "player_controlled" ) ) { _a1950 = level.a_uts_challenge_boxes; _k1950 = getFirstArrayKey( _a1950 ); while ( isDefined( _k1950 ) ) { uts_box = _a1950[ _k1950 ]; if ( uts_box.str_location == "start_bunker" ) { if ( isDefined( level.is_forever_solo_game ) && level.is_forever_solo_game ) { level thread maps/mp/zombies/_zm_challenges::open_box( undefined, uts_box, ::maps/mp/zm_tomb_challenges::reward_powerup_double_points, -1 ); } else { level thread maps/mp/zombies/_zm_challenges::open_box( undefined, uts_box, ::maps/mp/zm_tomb_challenges::reward_powerup_zombie_blood, -1 ); } return; } _k1950 = getNextArrayKey( _a1950, _k1950 ); } } _k1945 = getNextArrayKey( _a1945, _k1945 ); } } } traversal_blocker() { flag_wait( "activate_zone_nml" ); m_traversal_blocker = getent( "traversal_blocker", "targetname" ); m_traversal_blocker connectpaths(); m_traversal_blocker delete(); } _kill_zombie_network_safe_internal( e_attacker, str_weapon ) { if ( !isDefined( self ) ) { return; } if ( !isalive( self ) ) { return; } self.staff_dmg = str_weapon; self dodamage( self.health, self.origin, e_attacker, e_attacker, "none", self.kill_damagetype, 0, str_weapon ); } _damage_zombie_network_safe_internal( e_attacker, str_weapon, n_damage_amt ) { if ( !isDefined( self ) ) { return; } if ( !isalive( self ) ) { return; } self dodamage( n_damage_amt, self.origin, e_attacker, e_attacker, "none", self.kill_damagetype, 0, str_weapon ); } do_damage_network_safe( e_attacker, n_amount, str_weapon, str_mod ) { if ( isDefined( self.is_mechz ) && self.is_mechz ) { self dodamage( n_amount, self.origin, e_attacker, e_attacker, "none", str_mod, 0, str_weapon ); } else { if ( n_amount < self.health ) { self.kill_damagetype = str_mod; maps/mp/zombies/_zm_net::network_safe_init( "dodamage", 6 ); self maps/mp/zombies/_zm_net::network_choke_action( "dodamage", ::_damage_zombie_network_safe_internal, e_attacker, str_weapon, n_amount ); return; } else { self.kill_damagetype = str_mod; maps/mp/zombies/_zm_net::network_safe_init( "dodamage_kill", 4 ); self maps/mp/zombies/_zm_net::network_choke_action( "dodamage_kill", ::_kill_zombie_network_safe_internal, e_attacker, str_weapon ); } } } _throttle_bullet_trace_think() { level.bullet_traces_this_frame = 0; wait_network_frame(); } bullet_trace_throttled( v_start, v_end, e_ignore ) { if ( !isDefined( level.bullet_traces_this_frame ) ) { level thread _throttle_bullet_trace_think(); } while ( level.bullet_traces_this_frame >= 2 ) { wait_network_frame(); } level.bullet_traces_this_frame++; return bullettracepassed( v_start, v_end, 0, e_ignore ); } tomb_get_closest_player_using_paths( origin, players ) { min_length_to_player = 9999999; n_2d_distance_squared = 9999999; player_to_return = undefined; dist_to_tank = undefined; i = 0; while ( i < players.size ) { player = players[ i ]; if ( !isDefined( player ) ) { i++; continue; } else if ( isDefined( player.b_already_on_tank ) && player.b_already_on_tank ) { if ( !isDefined( dist_to_tank ) ) { length_to_player = self maps/mp/zm_tomb_tank::tomb_get_path_length_to_tank(); dist_to_tank = length_to_player; } else { length_to_player = dist_to_tank; } } else { length_to_player = self get_path_length_to_enemy( player ); } if ( isDefined( level.validate_enemy_path_length ) ) { if ( length_to_player == 0 ) { valid = self thread [[ level.validate_enemy_path_length ]]( player ); if ( !valid ) { i++; continue; } } } else if ( length_to_player < min_length_to_player ) { min_length_to_player = length_to_player; player_to_return = player; n_2d_distance_squared = distance2dsquared( self.origin, player.origin ); i++; continue; } else { if ( length_to_player == min_length_to_player && length_to_player <= 5 ) { n_new_distance = distance2dsquared( self.origin, player.origin ); if ( n_new_distance < n_2d_distance_squared ) { min_length_to_player = length_to_player; player_to_return = player; n_2d_distance_squared = n_new_distance; } } } i++; } return player_to_return; } update_staff_accessories( n_element_index ) { /# if ( !isDefined( n_element_index ) ) { n_element_index = 0; str_weapon = self getcurrentweapon(); if ( is_weapon_upgraded_staff( str_weapon ) ) { s_info = maps/mp/zm_tomb_craftables::get_staff_info_from_weapon_name( str_weapon ); if ( isDefined( s_info ) ) { n_element_index = s_info.enum; s_info.charger.is_charged = 1; #/ } } } if ( isDefined( self.one_inch_punch_flag_has_been_init ) && !self.one_inch_punch_flag_has_been_init ) { cur_weapon = self get_player_melee_weapon(); weapon_to_keep = "knife_zm"; self.use_staff_melee = 0; if ( n_element_index != 0 ) { staff_info = maps/mp/zm_tomb_craftables::get_staff_info_from_element_index( n_element_index ); if ( staff_info.charger.is_charged ) { staff_info = staff_info.upgrade; } if ( isDefined( staff_info.melee ) ) { weapon_to_keep = staff_info.melee; self.use_staff_melee = 1; } } melee_changed = 0; if ( cur_weapon != weapon_to_keep ) { self takeweapon( cur_weapon ); self giveweapon( weapon_to_keep ); self set_player_melee_weapon( weapon_to_keep ); melee_changed = 1; } } has_revive = self hasweapon( "staff_revive_zm" ); has_upgraded_staff = 0; a_weapons = self getweaponslistprimaries(); staff_info = maps/mp/zm_tomb_craftables::get_staff_info_from_element_index( n_element_index ); _a2199 = a_weapons; _k2199 = getFirstArrayKey( _a2199 ); while ( isDefined( _k2199 ) ) { str_weapon = _a2199[ _k2199 ]; if ( is_weapon_upgraded_staff( str_weapon ) ) { has_upgraded_staff = 1; } _k2199 = getNextArrayKey( _a2199, _k2199 ); } if ( has_revive && !has_upgraded_staff ) { self setactionslot( 3, "altmode" ); self takeweapon( "staff_revive_zm" ); } else { if ( !has_revive && has_upgraded_staff ) { self setactionslot( 3, "weapon", "staff_revive_zm" ); self giveweapon( "staff_revive_zm" ); if ( isDefined( staff_info ) ) { if ( isDefined( staff_info.upgrade.revive_ammo_stock ) ) { self setweaponammostock( "staff_revive_zm", staff_info.upgrade.revive_ammo_stock ); self setweaponammoclip( "staff_revive_zm", staff_info.upgrade.revive_ammo_clip ); } } } } } get_round_enemy_array_wrapper() { if ( isDefined( level.custom_get_round_enemy_array_func ) ) { a_enemies = [[ level.custom_get_round_enemy_array_func ]](); } else { a_enemies = get_round_enemy_array(); } return a_enemies; } add_ragdoll() { level.n_active_ragdolls++; wait 1; if ( level.n_active_ragdolls > 0 ) { level.n_active_ragdolls--; } } ragdoll_attempt() { if ( level.n_active_ragdolls >= 4 ) { return 0; } level thread add_ragdoll(); return 1; }