Add sounds for mechz and brutus and fix scripts for the normal maps.

This commit is contained in:
JezuzLizard
2024-02-07 02:36:41 -08:00
parent c753fd3adf
commit baaea355b6
171 changed files with 6997 additions and 4620 deletions

View File

@ -489,7 +489,11 @@ bus_attack()
}
else
{
//level.the_bus thread maps\mp\zm_transit_bus::bus_disabled_by_emp( 30 );
func = getFunction( "maps/mp/zm_transit_bus", "bus_disabled_by_emp" );
if ( isDefined( func ) )
{
level.the_bus thread [[ func ]]( 30 );
}
self attach_to_bus();
}
}
@ -587,7 +591,11 @@ bus_disable( bus_attack_struct )
success = 0;
self.mod_melee = 0;
self.bus_shock_time = 0;
//level thread maps\mp\zm_transit_bus::do_player_bus_zombie_vox( "avogadro_onbus", 45 );
func = getFunction( "maps/mp/zm_transit_bus", "do_player_bus_zombie_vox" );
if ( isDefined( func ) )
{
level thread [[ func ]]( "avogadro_onbus", 45 );
}
while ( true )
{
@ -597,7 +605,8 @@ bus_disable( bus_attack_struct )
if ( self.bus_attack_time >= 20 )
{
self.bus_disabled = 1;
//level thread maps\mp\zm_transit_bus::do_player_bus_zombie_vox( "avogadro_stopbus", 45 );
func = getFunction( "maps/mp/zm_transit_bus", "do_player_bus_zombie_vox" );
level thread [[ func ]]( "avogadro_stopbus", 45 );
break;
}
@ -1396,7 +1405,11 @@ avogadro_damage_func( einflictor, eattacker, idamage, idflags, smeansofdeath, sw
if ( sweapon == "riotshield_zm" )
{
shield_damage = level.zombie_vars["riotshield_fling_damage_shield"];
//einflictor maps\mp\zombies\_zm_weap_riotshield::player_damage_shield( shield_damage, 0 );
func = getFunction( "maps/mp/zombies/_zm_weap_riotshield", "player_damage_shield" );
if ( isDefined( func ) )
{
einflictor [[ func ]]( shield_damage, 0 );
}
}
}

View File

@ -151,50 +151,53 @@ setup_interaction_matrix()
level.interaction_types["perk_machine"].spawn_bias = 800;
level.interaction_types["perk_machine"].num_times_to_scale = 3;
level.interaction_types["perk_machine"].unlock_cost = 2000;
// level.interaction_types["craftable_table"] = spawnstruct();
// level.interaction_types["craftable_table"].priority = 2;
// level.interaction_types["craftable_table"].animstate = "zm_smash_craftable_table";
// level.interaction_types["craftable_table"].notify_name = "table_smash_anim";
// level.interaction_types["craftable_table"].action_notetrack = "fire";
// level.interaction_types["craftable_table"].validity_func = ::is_craftable_table_valid;
// level.interaction_types["craftable_table"].get_func = ::get_craftable_tables;
// level.interaction_types["craftable_table"].value_func = ::get_dist_score;
// level.interaction_types["craftable_table"].interact_func = ::craftable_table_lock;
// level.interaction_types["craftable_table"].spawn_bias = 600;
// level.interaction_types["craftable_table"].num_times_to_scale = 1;
// level.interaction_types["craftable_table"].unlock_cost = 2000;
// level.interaction_types["craftable_table"].interaction_z_offset = -15;
// level.interaction_types["craftable_table"].interaction_yaw_offset = 270;
// level.interaction_types["craftable_table"].fx_z_offset = -44;
// level.interaction_types["craftable_table"].fx_yaw_offset = 270;
// level.interaction_types["trap"] = spawnstruct();
// level.interaction_types["trap"].priority = 3;
// level.interaction_types["trap"].animstate = "zm_smash_trap";
// level.interaction_types["trap"].notify_name = "trap_smash_anim";
// level.interaction_types["trap"].action_notetrack = "fire";
// level.interaction_types["trap"].validity_func = ::is_trap_valid;
// level.interaction_types["trap"].get_func = ::get_traps;
// level.interaction_types["trap"].value_func = ::get_dist_score;
// level.interaction_types["trap"].interact_func = ::trap_smash;
// level.interaction_types["trap"].spawn_bias = 400;
// level.interaction_types["trap"].interaction_z_offset = -15;
// level.interaction_types["plane_ramp"] = spawnstruct();
// level.interaction_types["plane_ramp"].priority = 4;
// level.interaction_types["plane_ramp"].animstate = "zm_lock_plane_ramp";
// level.interaction_types["plane_ramp"].notify_name = "plane_lock_anim";
// level.interaction_types["plane_ramp"].action_notetrack = "locked";
// level.interaction_types["plane_ramp"].end_notetrack = "lock_done";
// level.interaction_types["plane_ramp"].validity_func = ::is_plane_ramp_valid;
// level.interaction_types["plane_ramp"].get_func = ::get_plane_ramps;
// level.interaction_types["plane_ramp"].value_func = ::get_dist_score;
// level.interaction_types["plane_ramp"].interact_func = ::plane_ramp_lock;
// level.interaction_types["plane_ramp"].spawn_bias = 500;
// level.interaction_types["plane_ramp"].num_times_to_scale = 3;
// level.interaction_types["plane_ramp"].unlock_cost = 2000;
// level.interaction_types["plane_ramp"].interaction_z_offset = -60;
// level.interaction_types["plane_ramp"].fx_z_offset = -60;
// level.interaction_types["plane_ramp"].fx_x_offset = 70;
// level.interaction_types["plane_ramp"].fx_yaw_offset = 90;
if ( getDvar( "mapname" ) == "zm_prison" )
{
level.interaction_types["craftable_table"] = spawnstruct();
level.interaction_types["craftable_table"].priority = 2;
level.interaction_types["craftable_table"].animstate = "zm_smash_craftable_table";
level.interaction_types["craftable_table"].notify_name = "table_smash_anim";
level.interaction_types["craftable_table"].action_notetrack = "fire";
level.interaction_types["craftable_table"].validity_func = ::is_craftable_table_valid;
level.interaction_types["craftable_table"].get_func = ::get_craftable_tables;
level.interaction_types["craftable_table"].value_func = ::get_dist_score;
level.interaction_types["craftable_table"].interact_func = ::craftable_table_lock;
level.interaction_types["craftable_table"].spawn_bias = 600;
level.interaction_types["craftable_table"].num_times_to_scale = 1;
level.interaction_types["craftable_table"].unlock_cost = 2000;
level.interaction_types["craftable_table"].interaction_z_offset = -15;
level.interaction_types["craftable_table"].interaction_yaw_offset = 270;
level.interaction_types["craftable_table"].fx_z_offset = -44;
level.interaction_types["craftable_table"].fx_yaw_offset = 270;
level.interaction_types["trap"] = spawnstruct();
level.interaction_types["trap"].priority = 3;
level.interaction_types["trap"].animstate = "zm_smash_trap";
level.interaction_types["trap"].notify_name = "trap_smash_anim";
level.interaction_types["trap"].action_notetrack = "fire";
level.interaction_types["trap"].validity_func = ::is_trap_valid;
level.interaction_types["trap"].get_func = ::get_traps;
level.interaction_types["trap"].value_func = ::get_dist_score;
level.interaction_types["trap"].interact_func = ::trap_smash;
level.interaction_types["trap"].spawn_bias = 400;
level.interaction_types["trap"].interaction_z_offset = -15;
level.interaction_types["plane_ramp"] = spawnstruct();
level.interaction_types["plane_ramp"].priority = 4;
level.interaction_types["plane_ramp"].animstate = "zm_lock_plane_ramp";
level.interaction_types["plane_ramp"].notify_name = "plane_lock_anim";
level.interaction_types["plane_ramp"].action_notetrack = "locked";
level.interaction_types["plane_ramp"].end_notetrack = "lock_done";
level.interaction_types["plane_ramp"].validity_func = ::is_plane_ramp_valid;
level.interaction_types["plane_ramp"].get_func = ::get_plane_ramps;
level.interaction_types["plane_ramp"].value_func = ::get_dist_score;
level.interaction_types["plane_ramp"].interact_func = ::plane_ramp_lock;
level.interaction_types["plane_ramp"].spawn_bias = 500;
level.interaction_types["plane_ramp"].num_times_to_scale = 3;
level.interaction_types["plane_ramp"].unlock_cost = 2000;
level.interaction_types["plane_ramp"].interaction_z_offset = -60;
level.interaction_types["plane_ramp"].fx_z_offset = -60;
level.interaction_types["plane_ramp"].fx_x_offset = 70;
level.interaction_types["plane_ramp"].fx_yaw_offset = 90;
}
level.interaction_types["blocker"] = spawnstruct();
level.interaction_types["blocker"].priority = 5;
level.interaction_types["blocker"].animstate = "zm_smash_blocker";
@ -2360,12 +2363,19 @@ get_brutus_interest_points()
for ( i = 0; i < zone_names.size; i++ )
{
self thread get_zone_perk_machines( zone_names[i] );
//self thread get_zone_craftable_tables( zone_names[i] );
//self thread get_zone_traps( zone_names[i] );
//self thread get_zone_plane_ramp( zone_names[i] );
if ( getDvar( "mapname" ) == "zm_prison" )
{
self thread get_zone_craftable_tables( zone_names[i] );
self thread get_zone_traps( zone_names[i] );
self thread get_zone_plane_ramp( zone_names[i] );
}
}
//build_trap_array();
if ( getDvar( "mapname" ) == "zm_prison" )
{
build_trap_array();
}
flag_set( "brutus_setup_complete" );
}
@ -2631,7 +2641,8 @@ check_plane_valid( player )
plane_struct.is_locked = 0;
plane_struct.locked_cost = undefined;
plane_struct.lock_fx delete();
//plane_struct maps\mp\zm_alcatraz_sq::reset_plane_hint_string( player );
func = getFunction( "maps/mp/zm_alcatraz_sq", "reset_plane_hint_string" );
plane_struct [[ func ]]( player );
}
return false;

View File

@ -809,7 +809,10 @@ ghost_think()
{
self [[ level.slowgun_set_anim_rate_func ]]( 1.0 );
}
//self setclientfield( "slowgun_fx", 0 );
if ( level.script == "zm_buried" )
{
self setclientfield( "slowgun_fx", 0 );
}
self setclientfield( "sndGhostAudio", 1 );
self init_thinking();
@ -1592,11 +1595,13 @@ paralyzer_callback( player, upgraded )
if ( isdefined( self.ignore_slowgun_anim_rates ) && self.ignore_slowgun_anim_rates )
return;
// if ( upgraded )
// self setclientfield( "slowgun_fx", 5 );
// else
// self setclientfield( "slowgun_fx", 1 );
if ( level.script == "zm_buried" )
{
if ( upgraded )
self setclientfield( "slowgun_fx", 5 );
else
self setclientfield( "slowgun_fx", 1 );
}
self [[ level.slowgun_zombie_slow_for_time ]]( 0.3, 0 );
}

View File

@ -77,14 +77,12 @@ ghost_bad_path_init()
level.bad_zones[0].adjacent = [];
level.bad_zones[0].adjacent[0] = "zone_underground_courthouse2";
level.bad_zones[0].adjacent[1] = "zone_tunnels_north2";
//level.bad_zones[0].ignore_func = maps\mp\zm_buried::is_courthouse_open;
level.bad_zones[0].ignore_func = getFunction( "maps/mp/zm_buried", "is_courthouse_open" );
level.bad_zones[1] = spawnstruct();
level.bad_zones[1].name = "zone_underground_courthouse2";
level.bad_zones[1].adjacent = [];
level.bad_zones[1].adjacent[0] = "zone_underground_courthouse";
level.bad_zones[1].adjacent[1] = "zone_tunnels_north2";
//level.bad_zones[1].ignore_func = maps\mp\zm_buried::is_courthouse_open;
level.bad_zones[1].ignore_func = getFunction( "maps/mp/zm_buried", "is_courthouse_open" );
level.bad_zones[2] = spawnstruct();
level.bad_zones[2].name = "zone_tunnels_north2";
@ -93,7 +91,6 @@ ghost_bad_path_init()
level.bad_zones[2].adjacent[1] = "zone_underground_courthouse";
level.bad_zones[2].flag = "tunnels2courthouse";
level.bad_zones[2].flag_adjacent = "zone_tunnels_north";
//level.bad_zones[2].ignore_func = maps\mp\zm_buried::is_courthouse_open;
level.bad_zones[2].ignore_func = getFunction( "maps/mp/zm_buried", "is_courthouse_open" );
level.bad_zones[3] = spawnstruct();
level.bad_zones[3].name = "zone_tunnels_north";
@ -101,20 +98,17 @@ ghost_bad_path_init()
level.bad_zones[3].adjacent[0] = "zone_tunnels_center";
level.bad_zones[3].flag = "tunnels2courthouse";
level.bad_zones[3].flag_adjacent = "zone_tunnels_north2";
//level.bad_zones[3].ignore_func = maps\mp\zm_buried::is_tunnel_open;
level.bad_zones[3].ignore_func = getFunction( "maps/mp/zm_buried", "is_tunnel_open" );
level.bad_zones[4] = spawnstruct();
level.bad_zones[4].name = "zone_tunnels_center";
level.bad_zones[4].adjacent = [];
level.bad_zones[4].adjacent[0] = "zone_tunnels_north";
level.bad_zones[4].adjacent[1] = "zone_tunnels_south";
//level.bad_zones[4].ignore_func = maps\mp\zm_buried::is_tunnel_open;
level.bad_zones[4].ignore_func = getFunction( "maps/mp/zm_buried", "is_tunnel_open" );
level.bad_zones[5] = spawnstruct();
level.bad_zones[5].name = "zone_tunnels_south";
level.bad_zones[5].adjacent = [];
level.bad_zones[5].adjacent[0] = "zone_tunnels_center";
//level.bad_zones[5].ignore_func = maps\mp\zm_buried::is_tunnel_open;
level.bad_zones[5].ignore_func = getFunction( "maps/mp/zm_buried", "is_tunnel_open" );
}

File diff suppressed because it is too large Load Diff

View File

@ -14,291 +14,291 @@
mechz_in_range_for_jump()
{
if ( !isdefined( self.jump_pos ) )
{
if ( !isdefined( self.jump_pos ) )
{
/#
iprintln( "\\nMZ Error: Trying to jump without valid jump_pos\\n" );
iprintln( "\\nMZ Error: Trying to jump without valid jump_pos\\n" );
#/
self.jump_requested = 0;
return false;
}
self.jump_requested = 0;
return false;
}
dist = distancesquared( self.origin, self.jump_pos.origin );
dist = distancesquared( self.origin, self.jump_pos.origin );
if ( dist <= 100 )
return true;
if ( dist <= 100 )
return true;
return false;
return false;
}
mechz_jump_think( spawn_pos )
{
self endon( "death" );
self endon( "stop_jump_think" );
self.closest_jump_point = spawn_pos;
self.goal_pos = self.origin;
self setgoalpos( self.goal_pos );
self thread mechz_jump_stuck_watcher();
self endon( "death" );
self endon( "stop_jump_think" );
self.closest_jump_point = spawn_pos;
self.goal_pos = self.origin;
self setgoalpos( self.goal_pos );
self thread mechz_jump_stuck_watcher();
while ( true )
{
if ( isdefined( self.jump_requested ) && self.jump_requested )
{
if ( !self mechz_should_jump() )
{
self.jump_requested = 0;
self.jump_pos = undefined;
}
while ( true )
{
if ( isdefined( self.jump_requested ) && self.jump_requested )
{
if ( !self mechz_should_jump() )
{
self.jump_requested = 0;
self.jump_pos = undefined;
}
wait 1;
continue;
}
wait 1;
continue;
}
if ( !isdefined( self.ai_state ) || self.ai_state != "find_flesh" )
{
wait 0.05;
continue;
}
if ( !isdefined( self.ai_state ) || self.ai_state != "find_flesh" )
{
wait 0.05;
continue;
}
if ( isdefined( self.not_interruptable ) && self.not_interruptable )
{
wait 0.05;
continue;
}
if ( isdefined( self.not_interruptable ) && self.not_interruptable )
{
wait 0.05;
continue;
}
/#
if ( isdefined( self.force_behavior ) && self.force_behavior )
{
wait 0.05;
continue;
}
if ( isdefined( self.force_behavior ) && self.force_behavior )
{
wait 0.05;
continue;
}
#/
if ( self mechz_should_jump() )
{
self.jump_requested = 1;
self.jump_pos = get_closest_mechz_spawn_pos( self.origin );
if ( self mechz_should_jump() )
{
self.jump_requested = 1;
self.jump_pos = get_closest_mechz_spawn_pos( self.origin );
if ( !isdefined( self.jump_pos ) )
self.jump_requested = 0;
}
if ( !isdefined( self.jump_pos ) )
self.jump_requested = 0;
}
wait 1;
}
wait 1;
}
}
watch_for_riot_shield_melee()
{
self endon( "new_stuck_watcher" );
self endon( "death" );
self endon( "new_stuck_watcher" );
self endon( "death" );
while ( true )
{
self waittill( "item_attack" );
while ( true )
{
self waittill( "item_attack" );
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\tMZ: Resetting fail count because of item attack\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\tMZ: Resetting fail count because of item attack\\n" );
#/
self.fail_count = 0;
}
self.fail_count = 0;
}
}
watch_for_valid_melee()
{
self endon( "new_stuck_watcher" );
self endon( "death" );
self endon( "new_stuck_watcher" );
self endon( "death" );
while ( true )
{
self waittillmatch( "melee_anim", "end" );
while ( true )
{
self waittillmatch( "melee_anim", "end" );
if ( isdefined( self.favoriteenemy ) && distancesquared( self.origin, self.favoriteenemy.origin ) < 16384 )
{
if ( isdefined( self.favoriteenemy ) && distancesquared( self.origin, self.favoriteenemy.origin ) < 16384 )
{
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\tMZ: Resetting fail count because of melee\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\tMZ: Resetting fail count because of melee\\n" );
#/
self.fail_count = 0;
}
}
self.fail_count = 0;
}
}
}
mechz_jump_stuck_watcher()
{
self notify( "new_stuck_watcher" );
self endon( "death" );
self endon( "new_stuck_watcher" );
self.fail_count = 0;
self thread watch_for_valid_melee();
self thread watch_for_riot_shield_melee();
self notify( "new_stuck_watcher" );
self endon( "death" );
self endon( "new_stuck_watcher" );
self.fail_count = 0;
self thread watch_for_valid_melee();
self thread watch_for_riot_shield_melee();
while ( true )
{
if ( !isdefined( self.goal_pos ) )
{
wait 0.05;
continue;
}
while ( true )
{
if ( !isdefined( self.goal_pos ) )
{
wait 0.05;
continue;
}
if ( isdefined( self.not_interruptable ) && self.not_interruptable )
{
wait 0.05;
continue;
}
if ( isdefined( self.not_interruptable ) && self.not_interruptable )
{
wait 0.05;
continue;
}
if ( isdefined( self.ai_state ) && self.ai_state != "find_flesh" )
{
wait 0.05;
continue;
}
if ( isdefined( self.ai_state ) && self.ai_state != "find_flesh" )
{
wait 0.05;
continue;
}
/#
if ( isdefined( self.force_behavior ) && self.force_behavior )
{
wait 0.05;
continue;
}
if ( isdefined( self.force_behavior ) && self.force_behavior )
{
wait 0.05;
continue;
}
#/
if ( !findpath( self.origin, self.goal_pos, self, 0, 0 ) )
{
if ( !findpath( self.origin, self.goal_pos, self, 0, 0 ) )
{
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\tMZ: Incrementing fail count\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\tMZ: Incrementing fail count\\n" );
#/
/#
println( "Mechz could not path to goal_pos " + self.goal_pos );
println( "Mechz could not path to goal_pos " + self.goal_pos );
#/
self.fail_count++;
}
else
{
self.fail_count++;
}
else
{
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\tMZ: Resetting fail count because of good path\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\tMZ: Resetting fail count because of good path\\n" );
#/
self.fail_count = 0;
}
self.fail_count = 0;
}
wait 1;
}
wait 1;
}
}
mechz_should_jump()
{
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\tMZ: Checking should jump\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\tMZ: Checking should jump\\n" );
#/
if ( !isdefined( self.favoriteenemy ) )
{
if ( !isdefined( self.favoriteenemy ) )
{
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing jump because has no enemy\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing jump because has no enemy\\n" );
#/
return false;
}
return false;
}
dist = distancesquared( self.origin, self.favoriteenemy.origin );
dist = distancesquared( self.origin, self.favoriteenemy.origin );
if ( dist >= level.mechz_jump_dist_threshold )
{
if ( dist >= level.mechz_jump_dist_threshold )
{
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Doing jump because target is too far\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Doing jump because target is too far\\n" );
#/
return true;
}
return true;
}
if ( self.fail_count >= level.mechz_failed_paths_to_jump )
{
if ( self.fail_count >= level.mechz_failed_paths_to_jump )
{
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Doing jump because has failed too many pathfind checks\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Doing jump because has failed too many pathfind checks\\n" );
#/
return true;
}
return true;
}
return false;
return false;
}
mechz_do_jump( wait_for_stationary_tank )
{
self endon( "death" );
self endon( "kill_jump" );
self endon( "death" );
self endon( "kill_jump" );
/#
if ( getdvarint( #"_id_E7121222" ) > 0 )
println( "\\nMZ: Doing Jump-Teleport\\n" );
if ( getdvarint( #"_id_E7121222" ) > 0 )
println( "\\nMZ: Doing Jump-Teleport\\n" );
#/
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\nMZ: Jump setting not interruptable\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\nMZ: Jump setting not interruptable\\n" );
#/
self.not_interruptable = 1;
self setfreecameralockonallowed( 0 );
self thread mechz_jump_vo();
self animscripted( self.origin, self.angles, "zm_fly_out" );
self maps\mp\animscripts\zm_shared::donotetracks( "jump_anim" );
self ghost();
self.mechz_hidden = 1;
self.not_interruptable = 1;
self setfreecameralockonallowed( 0 );
self thread mechz_jump_vo();
self animscripted( self.origin, self.angles, "zm_fly_out" );
self maps\mp\animscripts\zm_shared::donotetracks( "jump_anim" );
self ghost();
self.mechz_hidden = 1;
if ( isdefined( self.m_claw ) )
self.m_claw ghost();
if ( isdefined( self.m_claw ) )
self.m_claw ghost();
if ( self.fx_field )
self.fx_field_old = self.fx_field;
if ( self.fx_field )
self.fx_field_old = self.fx_field;
self thread maps\mp\zombies\_zm_spawner::zombie_eye_glow_stop();
self fx_cleanup();
self animscripted( self.origin, self.angles, "zm_fly_hover" );
wait( level.mechz_jump_delay );
self thread maps\mp\zombies\_zm_spawner::zombie_eye_glow_stop();
self fx_cleanup();
self animscripted( self.origin, self.angles, "zm_fly_hover" );
wait( level.mechz_jump_delay );
if ( isdefined( wait_for_stationary_tank ) && wait_for_stationary_tank )
level.vh_tank ent_flag_waitopen( "tank_moving" );
if ( isdefined( wait_for_stationary_tank ) && wait_for_stationary_tank )
level.vh_tank ent_flag_waitopen( "tank_moving" );
self notsolid();
closest_jump_point = get_best_mechz_spawn_pos( 1 );
self notsolid();
closest_jump_point = get_best_mechz_spawn_pos( 1 );
if ( isdefined( closest_jump_point ) )
self.closest_jump_point = closest_jump_point;
if ( isdefined( closest_jump_point ) )
self.closest_jump_point = closest_jump_point;
if ( !isdefined( self.closest_jump_point.angles ) )
self.closest_jump_point.angles = ( 0, 0, 0 );
if ( !isdefined( self.closest_jump_point.angles ) )
self.closest_jump_point.angles = ( 0, 0, 0 );
self animscripted( self.closest_jump_point.origin, self.closest_jump_point.angles, "zm_fly_in" );
self solid();
self.mechz_hidden = 0;
self show();
self.fx_field = self.fx_field_old;
self.fx_field_old = undefined;
self setclientfield( "mechz_fx", self.fx_field );
self thread maps\mp\zombies\_zm_spawner::zombie_eye_glow();
self animscripted( self.closest_jump_point.origin, self.closest_jump_point.angles, "zm_fly_in" );
self solid();
self.mechz_hidden = 0;
self show();
self.fx_field = self.fx_field_old;
self.fx_field_old = undefined;
self setclientfield( "mechz_fx", self.fx_field );
self thread maps\mp\zombies\_zm_spawner::zombie_eye_glow();
if ( isdefined( self.m_claw ) )
self.m_claw show();
if ( isdefined( self.m_claw ) )
self.m_claw show();
self maps\mp\animscripts\zm_shared::donotetracks( "jump_anim" );
self.not_interruptable = 0;
self setfreecameralockonallowed( 1 );
self maps\mp\animscripts\zm_shared::donotetracks( "jump_anim" );
self.not_interruptable = 0;
self setfreecameralockonallowed( 1 );
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\nMZ: Jump clearing not interruptable\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\nMZ: Jump clearing not interruptable\\n" );
#/
mechz_jump_cleanup();
mechz_jump_cleanup();
}
mechz_kill_jump_watcher()
{
self endon( "jump_complete" );
self waittill_either( "death", "kill_jump" );
self mechz_jump_cleanup();
self endon( "jump_complete" );
self waittill_either( "death", "kill_jump" );
self mechz_jump_cleanup();
}
mechz_jump_cleanup()
{
self.fx_field = self.fx_field & ~128;
self setclientfield( "mechz_fx", self.fx_field );
self stopanimscripted();
self notify( "jump_complete" );
self.fx_field = self.fx_field & ~128;
self setclientfield( "mechz_fx", self.fx_field );
self stopanimscripted();
self notify( "jump_complete" );
}

File diff suppressed because it is too large Load Diff

View File

@ -11,304 +11,304 @@
mechz_debug()
{
/#
while ( true )
{
debug_level = getdvarint( #"_id_E7121222" );
while ( true )
{
debug_level = getdvarint( #"_id_E7121222" );
if ( isdefined( debug_level ) && debug_level )
{
if ( debug_level == 1 )
{
mechz_array = getentarray( "mechz_zombie_ai" );
if ( isdefined( debug_level ) && debug_level )
{
if ( debug_level == 1 )
{
mechz_array = getentarray( "mechz_zombie_ai" );
for ( i = 0; i < mechz_array.size; i++ )
{
if ( isdefined( mechz_array[i].goal_pos ) )
{
debugstar( mechz_array[i].goal_pos, ( 1, 0, 0 ), 1 );
line( mechz_array[i].goal_pos, mechz_array[i].origin, ( 1, 0, 0 ), 0, 1 );
}
}
}
}
}
for ( i = 0; i < mechz_array.size; i++ )
{
if ( isdefined( mechz_array[i].goal_pos ) )
{
debugstar( mechz_array[i].goal_pos, ( 1, 0, 0 ), 1 );
line( mechz_array[i].goal_pos, mechz_array[i].origin, ( 1, 0, 0 ), 0, 1 );
}
}
}
}
}
#/
}
setup_devgui()
{
/#
setdvar( "spawn_Mechz", "off" );
setdvar( "force_mechz_jump", "off" );
setdvar( "test_mechz_tank", "off" );
setdvar( "test_mechz_robot", "off" );
setdvar( "reset_mechz_thinking", "off" );
setdvar( "test_mechz_sprint", "off" );
setdvar( "mechz_force_behavior", "none" );
setdvarint( "mechz_behavior_orient", 0 );
setdvarint( "mechz_behavior_dist", 300 );
adddebugcommand( "devgui_cmd \"Zombies/Zombie Spawning:2/Spawn Zombie:1/Mech Zombie:1\" \"spawn_Mechz on\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Jump In:1\" \"mechz_force_behavior jump_in\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Jump Out:2\" \"mechz_force_behavior jump_out\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Flamethrower:3\" \"mechz_force_behavior flamethrower\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Damage Armor:4\" \"mechz_force_behavior damage_armor\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Damage Faceplate:5\" \"mechz_force_behavior damage_faceplate\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Claw Attack:5\" \"mechz_force_behavior claw_attack\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Melee:6\" \"mechz_force_behavior melee\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/zero degrees:1\" \"mechz_behavior_orient 0\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/forty-five degrees:2\" \"mechz_behavior_orient 45\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/ninety degrees:3\" \"mechz_behavior_orient 90\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/one thirty five degrees:4\" \"mechz_behavior_orient 135\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/one eighty degrees:5\" \"mechz_behavior_orient 180\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/two twenty five degrees:6\" \"mechz_behavior_orient 225\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/two seventy degrees:7\" \"mechz_behavior_orient 270\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/three fifteen degrees:8\" \"mechz_behavior_orient 315\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Distance:8/one hundred:1\" \"mechz_behavior_dist 100\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Distance:8/two hundred:2\" \"mechz_behavior_dist 200\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Distance:8/three hundred:3\" \"mechz_behavior_dist 300\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Distance:8/four hundred:4\" \"mechz_behavior_dist 400\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Distance:8/five hundred:5\" \"mechz_behavior_dist 500\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Test Tank Knockdown:2\" \"test_mechz_tank on\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Test Robot Knockdown:3\" \"test_mechz_robot on\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Test Sprint:4\" \"test_mechz_sprint on\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Reset Mech:5\" \"reset_mechz_thinking on\"\n" );
level thread watch_devgui_mechz();
setdvar( "spawn_Mechz", "off" );
setdvar( "force_mechz_jump", "off" );
setdvar( "test_mechz_tank", "off" );
setdvar( "test_mechz_robot", "off" );
setdvar( "reset_mechz_thinking", "off" );
setdvar( "test_mechz_sprint", "off" );
setdvar( "mechz_force_behavior", "none" );
setdvarint( "mechz_behavior_orient", 0 );
setdvarint( "mechz_behavior_dist", 300 );
adddebugcommand( "devgui_cmd \"Zombies/Zombie Spawning:2/Spawn Zombie:1/Mech Zombie:1\" \"spawn_Mechz on\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Jump In:1\" \"mechz_force_behavior jump_in\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Jump Out:2\" \"mechz_force_behavior jump_out\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Flamethrower:3\" \"mechz_force_behavior flamethrower\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Damage Armor:4\" \"mechz_force_behavior damage_armor\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Damage Faceplate:5\" \"mechz_force_behavior damage_faceplate\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Claw Attack:5\" \"mechz_force_behavior claw_attack\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Melee:6\" \"mechz_force_behavior melee\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/zero degrees:1\" \"mechz_behavior_orient 0\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/forty-five degrees:2\" \"mechz_behavior_orient 45\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/ninety degrees:3\" \"mechz_behavior_orient 90\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/one thirty five degrees:4\" \"mechz_behavior_orient 135\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/one eighty degrees:5\" \"mechz_behavior_orient 180\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/two twenty five degrees:6\" \"mechz_behavior_orient 225\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/two seventy degrees:7\" \"mechz_behavior_orient 270\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Angles:7/three fifteen degrees:8\" \"mechz_behavior_orient 315\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Distance:8/one hundred:1\" \"mechz_behavior_dist 100\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Distance:8/two hundred:2\" \"mechz_behavior_dist 200\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Distance:8/three hundred:3\" \"mechz_behavior_dist 300\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Distance:8/four hundred:4\" \"mechz_behavior_dist 400\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Force Behavior:1/Distance:8/five hundred:5\" \"mechz_behavior_dist 500\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Test Tank Knockdown:2\" \"test_mechz_tank on\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Test Robot Knockdown:3\" \"test_mechz_robot on\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Test Sprint:4\" \"test_mechz_sprint on\"\n" );
adddebugcommand( "devgui_cmd \"Zombies/MechZ:3/Reset Mech:5\" \"reset_mechz_thinking on\"\n" );
level thread watch_devgui_mechz();
#/
}
watch_devgui_mechz()
{
/#
while ( true )
{
if ( getdvar( #"_id_877D2B64" ) == "on" )
{
mechz_health_increases();
level.mechz_left_to_spawn = 1;
while ( true )
{
if ( getdvar( #"_id_877D2B64" ) == "on" )
{
mechz_health_increases();
level.mechz_left_to_spawn = 1;
if ( getdvarint( #"_id_FA81816F" ) >= 2 )
level.round_number++;
if ( getdvarint( #"_id_FA81816F" ) >= 2 )
level.round_number++;
level notify( "spawn_mechz" );
setdvar( "spawn_Mechz", "off" );
level.mechz_last_spawn_round = 0;
}
level notify( "spawn_mechz" );
setdvar( "spawn_Mechz", "off" );
level.mechz_last_spawn_round = 0;
}
if ( getdvar( #"_id_7D9211F9" ) != "none" )
{
behavior = getdvar( #"_id_7D9211F9" );
zombies = getaiarray( "axis" );
if ( getdvar( #"_id_7D9211F9" ) != "none" )
{
behavior = getdvar( #"_id_7D9211F9" );
zombies = getaiarray( "axis" );
for ( i = 0; i < zombies.size; i++ )
{
if ( isdefined( zombies[i].is_mechz ) && zombies[i].is_mechz )
zombies[i] thread mechz_force_behavior( behavior );
}
for ( i = 0; i < zombies.size; i++ )
{
if ( isdefined( zombies[i].is_mechz ) && zombies[i].is_mechz )
zombies[i] thread mechz_force_behavior( behavior );
}
setdvar( "mechz_force_behavior", "none" );
}
setdvar( "mechz_force_behavior", "none" );
}
if ( getdvar( #"_id_BD7CA008" ) == "on" )
{
setdvar( "test_mechz_tank", "off" );
mechz = undefined;
zombies = getaiarray( "axis" );
if ( getdvar( #"_id_BD7CA008" ) == "on" )
{
setdvar( "test_mechz_tank", "off" );
mechz = undefined;
zombies = getaiarray( "axis" );
for ( i = 0; i < zombies.size; i++ )
{
if ( isdefined( zombies[i].is_mechz ) && zombies[i].is_mechz )
mechz = zombies[i];
}
for ( i = 0; i < zombies.size; i++ )
{
if ( isdefined( zombies[i].is_mechz ) && zombies[i].is_mechz )
mechz = zombies[i];
}
if ( !isdefined( mechz ) )
continue;
if ( !isdefined( mechz ) )
continue;
mechz.not_interruptable = 1;
mechz mechz_stop_basic_find_flesh();
mechz.ai_state = "devgui";
mechz.goal_pos = ( 446, -4318, 200 );
mechz setgoalpos( mechz.goal_pos );
}
mechz.not_interruptable = 1;
mechz mechz_stop_basic_find_flesh();
mechz.ai_state = "devgui";
mechz.goal_pos = ( 446, -4318, 200 );
mechz setgoalpos( mechz.goal_pos );
}
if ( getdvar( #"_id_6CF3EB40" ) == "on" )
{
setdvar( "test_mechz_robot", "off" );
mechz = undefined;
zombies = getaiarray( "axis" );
if ( getdvar( #"_id_6CF3EB40" ) == "on" )
{
setdvar( "test_mechz_robot", "off" );
mechz = undefined;
zombies = getaiarray( "axis" );
for ( i = 0; i < zombies.size; i++ )
{
if ( isdefined( zombies[i].is_mechz ) && zombies[i].is_mechz )
mechz = zombies[i];
}
for ( i = 0; i < zombies.size; i++ )
{
if ( isdefined( zombies[i].is_mechz ) && zombies[i].is_mechz )
mechz = zombies[i];
}
if ( !isdefined( mechz ) )
continue;
if ( !isdefined( mechz ) )
continue;
mechz.not_interruptable = 1;
mechz mechz_stop_basic_find_flesh();
mechz.ai_state = "devgui";
mechz.goal_pos = ( 1657, -336, 92 );
mechz setgoalpos( mechz.goal_pos );
}
mechz.not_interruptable = 1;
mechz mechz_stop_basic_find_flesh();
mechz.ai_state = "devgui";
mechz.goal_pos = ( 1657, -336, 92 );
mechz setgoalpos( mechz.goal_pos );
}
if ( getdvar( #"_id_0DE1409A" ) == "on" )
{
setdvar( "test_mechz_sprint", "off" );
zombies = getaiarray( "axis" );
if ( getdvar( #"_id_0DE1409A" ) == "on" )
{
setdvar( "test_mechz_sprint", "off" );
zombies = getaiarray( "axis" );
for ( i = 0; i < zombies.size; i++ )
{
if ( isdefined( zombies[i].is_mechz ) && zombies[i].is_mechz )
zombies[i].force_sprint = 1;
}
}
for ( i = 0; i < zombies.size; i++ )
{
if ( isdefined( zombies[i].is_mechz ) && zombies[i].is_mechz )
zombies[i].force_sprint = 1;
}
}
if ( getdvar( #"_id_772BCD39" ) == "on" )
{
setdvar( "reset_mechz_thinking", "off" );
zombies = getaiarray( "axis" );
if ( getdvar( #"_id_772BCD39" ) == "on" )
{
setdvar( "reset_mechz_thinking", "off" );
zombies = getaiarray( "axis" );
for ( i = 0; i < zombies.size; i++ )
{
if ( isdefined( zombies[i].is_mechz ) && zombies[i].is_mechz )
{
zombies[i].not_interruptable = 0;
zombies[i].force_sprint = 0;
}
}
}
for ( i = 0; i < zombies.size; i++ )
{
if ( isdefined( zombies[i].is_mechz ) && zombies[i].is_mechz )
{
zombies[i].not_interruptable = 0;
zombies[i].force_sprint = 0;
}
}
}
wait 0.1;
}
wait 0.1;
}
#/
}
mechz_force_behavior( behavior )
{
/#
self notify( "kill_force_behavior" );
self thread mechz_stop_basic_find_flesh();
self.ignoreall = 1;
self.force_behavior = 1;
self notify( "kill_force_behavior" );
self thread mechz_stop_basic_find_flesh();
self.ignoreall = 1;
self.force_behavior = 1;
if ( behavior == "jump_in" )
self thread mechz_force_jump_in();
if ( behavior == "jump_in" )
self thread mechz_force_jump_in();
if ( behavior == "jump_out" )
self thread mechz_force_jump_out();
if ( behavior == "jump_out" )
self thread mechz_force_jump_out();
if ( behavior == "flamethrower" )
self thread mechz_force_flamethrower();
if ( behavior == "flamethrower" )
self thread mechz_force_flamethrower();
if ( behavior == "claw_attack" )
self thread mechz_force_claw_attack();
if ( behavior == "claw_attack" )
self thread mechz_force_claw_attack();
if ( behavior == "damage_armor" )
self thread mechz_force_damage_armor();
if ( behavior == "damage_armor" )
self thread mechz_force_damage_armor();
if ( behavior == "damage_faceplate" )
self thread mechz_force_damage_faceplate();
if ( behavior == "damage_faceplate" )
self thread mechz_force_damage_faceplate();
if ( behavior == "melee" )
self thread mechz_force_melee();
if ( behavior == "melee" )
self thread mechz_force_melee();
if ( behavior == "none" )
{
self.ignoreall = 0;
self.force_behavior = 0;
self notify( "kill_force_behavior" );
}
if ( behavior == "none" )
{
self.ignoreall = 0;
self.force_behavior = 0;
self notify( "kill_force_behavior" );
}
#/
}
get_behavior_orient()
{
/#
behavior_orient = getdvarint( #"_id_2F660A7B" );
return level.players[0].angles + vectorscale( ( 0, 1, 0 ), 180.0 ) + ( 0, behavior_orient, 0 );
behavior_orient = getdvarint( #"_id_2F660A7B" );
return level.players[0].angles + vectorscale( ( 0, 1, 0 ), 180.0 ) + ( 0, behavior_orient, 0 );
#/
}
setup_force_behavior()
{
/#
if ( !isdefined( level.test_align_struct ) )
{
player = get_players()[0];
pos = player.origin;
offset = anglestoforward( player.angles );
offset = vectornormalize( offset );
level.test_align_struct = spawn( "script_model", pos + 300 * offset );
level.test_align_struct setmodel( "tag_origin" );
level.test_align_struct.angles = player.angles + vectorscale( ( 0, 1, 0 ), 180.0 );
level.test_align_struct thread align_test_struct();
level.test_align_struct.angles = player.angles + vectorscale( ( 0, 1, 0 ), 180.0 );
}
if ( !isdefined( level.test_align_struct ) )
{
player = get_players()[0];
pos = player.origin;
offset = anglestoforward( player.angles );
offset = vectornormalize( offset );
level.test_align_struct = spawn( "script_model", pos + 300 * offset );
level.test_align_struct setmodel( "tag_origin" );
level.test_align_struct.angles = player.angles + vectorscale( ( 0, 1, 0 ), 180.0 );
level.test_align_struct thread align_test_struct();
level.test_align_struct.angles = player.angles + vectorscale( ( 0, 1, 0 ), 180.0 );
}
self linkto( level.test_align_struct, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) );
self.fx_field = self.fx_field & ~64;
self.fx_field = self.fx_field & ~128;
self.fx_field = self.fx_field & ~256;
self linkto( level.test_align_struct, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) );
self.fx_field = self.fx_field & ~64;
self.fx_field = self.fx_field & ~128;
self.fx_field = self.fx_field & ~256;
#/
}
align_test_struct()
{
/#
while ( true )
{
pos = level.players[0].origin;
offset = anglestoforward( level.players[0].angles );
offset = vectornormalize( offset );
dist = getdvarint( #"_id_6DCD047E" );
level.test_align_struct.origin = pos + dist * offset;
level.test_align_struct.angles = get_behavior_orient();
wait 0.05;
}
while ( true )
{
pos = level.players[0].origin;
offset = anglestoforward( level.players[0].angles );
offset = vectornormalize( offset );
dist = getdvarint( #"_id_6DCD047E" );
level.test_align_struct.origin = pos + dist * offset;
level.test_align_struct.angles = get_behavior_orient();
wait 0.05;
}
#/
}
scripted_behavior( anim_scripted_name, notify_name )
{
/#
self animscripted( level.test_align_struct.origin, level.test_align_struct.angles, anim_scripted_name );
self maps\mp\animscripts\zm_shared::donotetracks( notify_name );
self animscripted( level.test_align_struct.origin, level.test_align_struct.angles, anim_scripted_name );
self maps\mp\animscripts\zm_shared::donotetracks( notify_name );
#/
}
mechz_force_jump_in()
{
/#
self endon( "kill_force_behavior" );
self setup_force_behavior();
self endon( "kill_force_behavior" );
self setup_force_behavior();
while ( true )
{
self animscripted( self.origin, self.angles, "zm_idle" );
wait 0.2;
self scripted_behavior( "zm_spawn", "jump_anim" );
}
while ( true )
{
self animscripted( self.origin, self.angles, "zm_idle" );
wait 0.2;
self scripted_behavior( "zm_spawn", "jump_anim" );
}
#/
}
mechz_force_jump_out()
{
/#
self endon( "kill_force_behavior" );
self setup_force_behavior();
self endon( "kill_force_behavior" );
self setup_force_behavior();
while ( true )
{
self animscripted( self.origin, self.angles, "zm_idle" );
wait 0.2;
self scripted_behavior( "zm_fly_out", "jump_anim" );
self ghost();
self animscripted( self.origin, self.angles, "zm_fly_hover" );
wait( level.mechz_jump_delay );
self show();
self scripted_behavior( "zm_fly_in", "jump_anim" );
}
while ( true )
{
self animscripted( self.origin, self.angles, "zm_idle" );
wait 0.2;
self scripted_behavior( "zm_fly_out", "jump_anim" );
self ghost();
self animscripted( self.origin, self.angles, "zm_fly_hover" );
wait( level.mechz_jump_delay );
self show();
self scripted_behavior( "zm_fly_in", "jump_anim" );
}
#/
}
@ -317,189 +317,189 @@ mechz_force_jump_out()
mechz_force_flamethrower()
{
/#
self endon( "kill_force_behavior" );
self setup_force_behavior();
curr_aim_anim = 1;
curr_timer = 0;
self animscripted( self.origin, self.angles, "zm_idle" );
wait 0.2;
self scripted_behavior( "zm_flamethrower_aim_start", "flamethrower_anim" );
self endon( "kill_force_behavior" );
self setup_force_behavior();
curr_aim_anim = 1;
curr_timer = 0;
self animscripted( self.origin, self.angles, "zm_idle" );
wait 0.2;
self scripted_behavior( "zm_flamethrower_aim_start", "flamethrower_anim" );
while ( true )
{
if ( curr_timer > 3 )
{
curr_aim_anim++;
curr_timer = 0;
while ( true )
{
if ( curr_timer > 3 )
{
curr_aim_anim++;
curr_timer = 0;
if ( curr_aim_anim < 10 )
iprintln( "Testing aim_" + curr_aim_anim );
}
if ( curr_aim_anim < 10 )
iprintln( "Testing aim_" + curr_aim_anim );
}
if ( curr_aim_anim >= 10 )
{
iprintln( "Testing flamethrower sweep" );
curr_aim_anim = 1;
self scripted_behavior( "zm_flamethrower_sweep", "flamethrower_anim" );
self.fx_field = self.fx_field | 64;
self setclientfield( "mechz_fx", self.fx_field );
}
else
{
length = self getanimlengthfromasd( "zm_flamethrower_aim_" + curr_aim_anim, 0 );
self clearanim( %root, 0 );
self scripted_behavior( "zm_flamethrower_aim_" + curr_aim_anim, "flamethrower_anim" );
curr_timer = curr_timer + length;
}
}
if ( curr_aim_anim >= 10 )
{
iprintln( "Testing flamethrower sweep" );
curr_aim_anim = 1;
self scripted_behavior( "zm_flamethrower_sweep", "flamethrower_anim" );
self.fx_field = self.fx_field | 64;
self setclientfield( "mechz_fx", self.fx_field );
}
else
{
length = self getanimlengthfromasd( "zm_flamethrower_aim_" + curr_aim_anim, 0 );
self clearanim( %root, 0 );
self scripted_behavior( "zm_flamethrower_aim_" + curr_aim_anim, "flamethrower_anim" );
curr_timer = curr_timer + length;
}
}
#/
}
fake_launch_claw()
{
/#
self.launching_claw = 1;
v_claw_origin = self gettagorigin( "tag_claw" );
v_claw_angles = vectortoangles( self.origin - level.players[0].origin );
self.fx_field = self.fx_field | 256;
self setclientfield( "mechz_fx", self.fx_field );
self.m_claw setanim( %ai_zombie_mech_grapple_arm_open_idle, 1, 0, 1 );
self.m_claw unlink();
self.m_claw.fx_ent = spawn( "script_model", self.m_claw gettagorigin( "tag_claw" ) );
self.m_claw.fx_ent.angles = self.m_claw gettagangles( "tag_claw" );
self.m_claw.fx_ent setmodel( "tag_origin" );
self.m_claw.fx_ent linkto( self.m_claw, "tag_claw" );
network_safe_play_fx_on_tag( "mech_claw", 1, level._effect["mechz_claw"], self.m_claw.fx_ent, "tag_origin" );
self.m_claw clearanim( %root, 0.2 );
self.m_claw setanim( %ai_zombie_mech_grapple_arm_open_idle, 1, 0.2, 1 );
offset = anglestoforward( self.angles );
offset = vectornormalize( offset );
target_pos = self.origin + offset * 500 + vectorscale( ( 0, 0, 1 ), 36.0 );
n_time = 0.0833333;
self.m_claw moveto( target_pos, n_time );
self.m_claw waittill( "movedone" );
self.m_claw clearanim( %root, 0.2 );
self.m_claw setanim( %ai_zombie_mech_grapple_arm_closed_idle, 1, 0.2, 1 );
wait 0.5;
self.m_claw moveto( v_claw_origin, 0.5 );
self.m_claw waittill( "movedone" );
self.m_claw.fx_ent delete();
self.fx_field = self.fx_field & ~256;
self setclientfield( "mechz_fx", self.fx_field );
v_claw_origin = self gettagorigin( "tag_claw" );
v_claw_angles = self gettagangles( "tag_claw" );
self.m_claw.origin = v_claw_origin;
self.m_claw.angles = v_claw_angles;
self.m_claw linkto( self, "tag_claw" );
self.launching_claw = 0;
self.launching_claw = 1;
v_claw_origin = self gettagorigin( "tag_claw" );
v_claw_angles = vectortoangles( self.origin - level.players[0].origin );
self.fx_field = self.fx_field | 256;
self setclientfield( "mechz_fx", self.fx_field );
self.m_claw setanim( %ai_zombie_mech_grapple_arm_open_idle, 1, 0, 1 );
self.m_claw unlink();
self.m_claw.fx_ent = spawn( "script_model", self.m_claw gettagorigin( "tag_claw" ) );
self.m_claw.fx_ent.angles = self.m_claw gettagangles( "tag_claw" );
self.m_claw.fx_ent setmodel( "tag_origin" );
self.m_claw.fx_ent linkto( self.m_claw, "tag_claw" );
network_safe_play_fx_on_tag( "mech_claw", 1, level._effect["mechz_claw"], self.m_claw.fx_ent, "tag_origin" );
self.m_claw clearanim( %root, 0.2 );
self.m_claw setanim( %ai_zombie_mech_grapple_arm_open_idle, 1, 0.2, 1 );
offset = anglestoforward( self.angles );
offset = vectornormalize( offset );
target_pos = self.origin + offset * 500 + vectorscale( ( 0, 0, 1 ), 36.0 );
n_time = 0.0833333;
self.m_claw moveto( target_pos, n_time );
self.m_claw waittill( "movedone" );
self.m_claw clearanim( %root, 0.2 );
self.m_claw setanim( %ai_zombie_mech_grapple_arm_closed_idle, 1, 0.2, 1 );
wait 0.5;
self.m_claw moveto( v_claw_origin, 0.5 );
self.m_claw waittill( "movedone" );
self.m_claw.fx_ent delete();
self.fx_field = self.fx_field & ~256;
self setclientfield( "mechz_fx", self.fx_field );
v_claw_origin = self gettagorigin( "tag_claw" );
v_claw_angles = self gettagangles( "tag_claw" );
self.m_claw.origin = v_claw_origin;
self.m_claw.angles = v_claw_angles;
self.m_claw linkto( self, "tag_claw" );
self.launching_claw = 0;
#/
}
mechz_force_claw_attack()
{
/#
self endon( "kill_force_behavior" );
self setup_force_behavior();
self endon( "kill_force_behavior" );
self setup_force_behavior();
while ( true )
{
self animscripted( self.origin, self.angles, "zm_idle" );
wait 0.2;
self scripted_behavior( "zm_grapple_aim_start", "grapple_anim" );
self thread fake_launch_claw();
while ( true )
{
self animscripted( self.origin, self.angles, "zm_idle" );
wait 0.2;
self scripted_behavior( "zm_grapple_aim_start", "grapple_anim" );
self thread fake_launch_claw();
while ( isdefined( self.launching_claw ) && self.launching_claw )
{
self clearanim( %root, 0 );
wait 0.05;
self scripted_behavior( "zm_grapple_aim_5", "grapple_anim" );
}
while ( isdefined( self.launching_claw ) && self.launching_claw )
{
self clearanim( %root, 0 );
wait 0.05;
self scripted_behavior( "zm_grapple_aim_5", "grapple_anim" );
}
self scripted_behavior( "zm_flamethrower_claw_victim", "flamethrower_anim" );
}
self scripted_behavior( "zm_flamethrower_claw_victim", "flamethrower_anim" );
}
#/
}
mechz_force_damage_armor()
{
/#
self endon( "kill_force_behavior" );
self setup_force_behavior();
self endon( "kill_force_behavior" );
self setup_force_behavior();
if ( !isdefined( self.next_armor_piece ) )
self.next_armor_piece = 0;
if ( !isdefined( self.next_armor_piece ) )
self.next_armor_piece = 0;
self thread scripted_behavior( "zm_idle", "idle_anim" );
self thread scripted_behavior( "zm_idle", "idle_anim" );
if ( self.next_armor_piece == self.armor_state.size )
{
self.next_armor_piece = 0;
if ( self.next_armor_piece == self.armor_state.size )
{
self.next_armor_piece = 0;
for ( i = 0; i < self.armor_state.size; i++ )
{
self.fx_field = self.fx_field & ~( 1 << self.armor_state[i].index );
for ( i = 0; i < self.armor_state.size; i++ )
{
self.fx_field = self.fx_field & ~( 1 << self.armor_state[i].index );
if ( isdefined( self.armor_state[i].model ) )
self attach( self.armor_state[i].model, self.armor_state[i].tag );
}
}
else
{
self.fx_field = self.fx_field | 1 << self.armor_state[self.next_armor_piece].index;
if ( isdefined( self.armor_state[i].model ) )
self attach( self.armor_state[i].model, self.armor_state[i].tag );
}
}
else
{
self.fx_field = self.fx_field | 1 << self.armor_state[self.next_armor_piece].index;
if ( isdefined( self.armor_state[self.next_armor_piece].model ) )
self detach( self.armor_state[self.next_armor_piece].model, self.armor_state[self.next_armor_piece].tag );
if ( isdefined( self.armor_state[self.next_armor_piece].model ) )
self detach( self.armor_state[self.next_armor_piece].model, self.armor_state[self.next_armor_piece].tag );
self.next_armor_piece++;
}
self.next_armor_piece++;
}
self setclientfield( "mechz_fx", self.fx_field );
self setclientfield( "mechz_fx", self.fx_field );
while ( true )
self scripted_behavior( "zm_idle", "idle_anim" );
while ( true )
self scripted_behavior( "zm_idle", "idle_anim" );
#/
}
mechz_force_damage_faceplate()
{
/#
self endon( "kill_force_behavior" );
self setup_force_behavior();
self thread scripted_behavior( "zm_idle", "idle_anim" );
self endon( "kill_force_behavior" );
self setup_force_behavior();
self thread scripted_behavior( "zm_idle", "idle_anim" );
if ( isdefined( self.has_helmet ) && self.has_helmet )
{
self.has_helmet = 0;
self detach( "c_zom_mech_faceplate", "J_Helmet" );
self.fx_field = self.fx_field | 1024;
self.fx_field = self.fx_field & ~2048;
}
else
{
self.has_helmet = 1;
self.fx_field = self.fx_field & ~1024;
self.fx_field = self.fx_field | 2048;
self attach( "c_zom_mech_faceplate", "J_Helmet" );
}
if ( isdefined( self.has_helmet ) && self.has_helmet )
{
self.has_helmet = 0;
self detach( "c_zom_mech_faceplate", "J_Helmet" );
self.fx_field = self.fx_field | 1024;
self.fx_field = self.fx_field & ~2048;
}
else
{
self.has_helmet = 1;
self.fx_field = self.fx_field & ~1024;
self.fx_field = self.fx_field | 2048;
self attach( "c_zom_mech_faceplate", "J_Helmet" );
}
self setclientfield( "mechz_fx", self.fx_field );
self setclientfield( "mechz_fx", self.fx_field );
while ( true )
self scripted_behavior( "zm_idle", "idle_anim" );
while ( true )
self scripted_behavior( "zm_idle", "idle_anim" );
#/
}
mechz_force_melee()
{
/#
self endon( "kill_force_behavior" );
self setup_force_behavior();
self endon( "kill_force_behavior" );
self setup_force_behavior();
while ( true )
{
self animscripted( self.origin, self.angles, "zm_idle" );
wait 0.2;
self scripted_behavior( "zm_melee_stand", "melee_anim" );
}
while ( true )
{
self animscripted( self.origin, self.angles, "zm_idle" );
wait 0.2;
self scripted_behavior( "zm_melee_stand", "melee_anim" );
}
#/
}

View File

@ -16,12 +16,12 @@ mechz_init_end()
spawn_start()
{
self.not_interruptable = 1;
self.not_interruptable = 1;
}
spawn_end()
{
self.not_interruptable = 0;
self.not_interruptable = 0;
}
mechz_round_tracker_start()

View File

@ -14,535 +14,544 @@
init_flamethrower_triggers()
{
flag_wait( "initial_players_connected" );
level.flamethrower_trigger_array = getentarray( "flamethrower_trigger", "script_noteworthy" );
assert( isdefined( level.flamethrower_trigger_array ) && level.flamethrower_trigger_array.size >= 4 );
flag_wait( "initial_players_connected" );
level.flamethrower_trigger_array = getentarray( "flamethrower_trigger", "script_noteworthy" );
assert( isdefined( level.flamethrower_trigger_array ) && level.flamethrower_trigger_array.size >= 4 );
for ( i = 0; i < level.flamethrower_trigger_array.size; i++ )
level.flamethrower_trigger_array[i] enablelinkto();
for ( i = 0; i < level.flamethrower_trigger_array.size; i++ )
level.flamethrower_trigger_array[i] enablelinkto();
}
mechz_flamethrower_initial_setup()
{
self endon( "death" );
self endon( "death" );
if ( isdefined( self.flamethrower_trigger ) )
self release_flamethrower_trigger();
if ( isdefined( self.flamethrower_trigger ) )
self release_flamethrower_trigger();
self.flamethrower_trigger = get_flamethrower_trigger();
self.flamethrower_trigger = get_flamethrower_trigger();
if ( !isdefined( self.flamethrower_trigger ) )
{
if ( !isdefined( self.flamethrower_trigger ) )
{
/#
println( "Error: No free flamethrower triggers! Make sure you haven't spawned more than 4 mech zombies" );
println( "Error: No free flamethrower triggers! Make sure you haven't spawned more than 4 mech zombies" );
#/
return;
}
return;
}
self.flamethrower_trigger.origin = self gettagorigin( "tag_flamethrower_FX" );
self.flamethrower_trigger.angles = self gettagangles( "tag_flamethrower_FX" );
self.flamethrower_trigger linkto( self, "tag_flamethrower_FX" );
self thread mechz_watch_for_flamethrower_damage();
self.flamethrower_trigger.origin = self gettagorigin( "tag_flamethrower_FX" );
self.flamethrower_trigger.angles = self gettagangles( "tag_flamethrower_FX" );
self.flamethrower_trigger linkto( self, "tag_flamethrower_FX" );
self thread mechz_watch_for_flamethrower_damage();
}
get_flamethrower_trigger()
{
for ( i = 0; i < level.flamethrower_trigger_array.size; i++ )
{
if ( !( isdefined( level.flamethrower_trigger_array[i].in_use ) && level.flamethrower_trigger_array[i].in_use ) )
{
level.flamethrower_trigger_array[i].in_use = 1;
level.flamethrower_trigger_array[i].original_position = level.flamethrower_trigger_array[i].origin;
return level.flamethrower_trigger_array[i];
}
}
for ( i = 0; i < level.flamethrower_trigger_array.size; i++ )
{
if ( !( isdefined( level.flamethrower_trigger_array[i].in_use ) && level.flamethrower_trigger_array[i].in_use ) )
{
level.flamethrower_trigger_array[i].in_use = 1;
level.flamethrower_trigger_array[i].original_position = level.flamethrower_trigger_array[i].origin;
return level.flamethrower_trigger_array[i];
}
}
return undefined;
return undefined;
}
release_flamethrower_trigger()
{
if ( !isdefined( self.flamethrower_trigger ) )
return;
if ( !isdefined( self.flamethrower_trigger ) )
return;
self.flamethrower_trigger.in_use = 0;
self.flamethrower_trigger unlink();
self.flamethrower_trigger.origin = self.flamethrower_trigger.original_position;
self.flamethrower_linked = 0;
self.flamethrower_trigger = undefined;
self.flamethrower_trigger.in_use = 0;
self.flamethrower_trigger unlink();
self.flamethrower_trigger.origin = self.flamethrower_trigger.original_position;
self.flamethrower_linked = 0;
self.flamethrower_trigger = undefined;
}
mechz_flamethrower_dist_watcher()
{
self endon( "kill_ft" );
wait 0.5;
self endon( "kill_ft" );
wait 0.5;
while ( true )
{
if ( !isdefined( self.favoriteenemy ) || !is_player_valid( self.favoriteenemy, 1, 1 ) || distancesquared( self.origin, self.favoriteenemy.origin ) > 50000 )
{
self notify( "stop_ft" );
return;
}
while ( true )
{
if ( !isdefined( self.favoriteenemy ) || !is_player_valid( self.favoriteenemy, 1, 1 ) || distancesquared( self.origin, self.favoriteenemy.origin ) > 50000 )
{
self notify( "stop_ft" );
return;
}
wait 0.05;
}
wait 0.05;
}
}
mechz_flamethrower_arc_watcher()
{
self endon( "death" );
self endon( "kill_ft" );
self endon( "stop_ft" );
aim_anim = undefined;
self endon( "death" );
self endon( "kill_ft" );
self endon( "stop_ft" );
aim_anim = undefined;
while ( true )
{
old_anim = aim_anim;
aim_anim = mechz_get_aim_anim( "zm_flamethrower", self.favoriteenemy.origin, 26 );
self.curr_aim_anim = aim_anim;
while ( true )
{
old_anim = aim_anim;
aim_anim = mechz_get_aim_anim( "zm_flamethrower", self.favoriteenemy.origin, 26 );
self.curr_aim_anim = aim_anim;
if ( !isdefined( aim_anim ) )
{
self notify( "stop_ft" );
return;
}
if ( !isdefined( aim_anim ) )
{
self notify( "stop_ft" );
return;
}
if ( !isdefined( old_anim ) || old_anim != aim_anim )
self notify( "arc_change" );
if ( !isdefined( old_anim ) || old_anim != aim_anim )
self notify( "arc_change" );
wait 0.05;
}
wait 0.05;
}
}
mechz_play_flamethrower_aim()
{
self endon( "death" );
self endon( "kill_ft" );
self endon( "stop_ft" );
self endon( "arc_change" );
self endon( "death" );
self endon( "kill_ft" );
self endon( "stop_ft" );
self endon( "arc_change" );
if ( isdefined( self.curr_aim_anim ) )
{
self stopanimscripted();
self animscripted( self.origin, self.angles, self.curr_aim_anim );
self maps\mp\animscripts\zm_shared::donotetracks( "flamethrower_anim" );
}
else
wait 0.05;
if ( isdefined( self.curr_aim_anim ) )
{
self stopanimscripted();
self animscripted( self.origin, self.angles, self.curr_aim_anim );
self maps\mp\animscripts\zm_shared::donotetracks( "flamethrower_anim" );
}
else
wait 0.05;
}
mechz_flamethrower_aim()
{
self endon( "death" );
self endon( "kill_ft" );
self endon( "stop_ft" );
self waittillmatch( "flamethrower_anim", "end" );
self thread mechz_flamethrower_dist_watcher();
self thread mechz_flamethrower_arc_watcher();
aim_anim = undefined;
self endon( "death" );
self endon( "kill_ft" );
self endon( "stop_ft" );
self waittillmatch( "flamethrower_anim", "end" );
self thread mechz_flamethrower_dist_watcher();
self thread mechz_flamethrower_arc_watcher();
aim_anim = undefined;
while ( true )
self mechz_play_flamethrower_aim();
while ( true )
self mechz_play_flamethrower_aim();
}
mechz_flamethrower_tank_sweep()
{
self endon( "death" );
self endon( "kill_ft" );
self endon( "stop_ft" );
self endon( "death" );
self endon( "kill_ft" );
self endon( "stop_ft" );
while ( true )
{
self stopanimscripted();
self.angles = vectortoangles( level.vh_tank.origin - self.origin );
self animscripted( self.origin, self.angles, "zm_flamethrower_sweep_up" );
self maps\mp\animscripts\zm_shared::donotetracks( "flamethrower_anim" );
while ( true )
{
self stopanimscripted();
self.angles = vectortoangles( level.vh_tank.origin - self.origin );
self animscripted( self.origin, self.angles, "zm_flamethrower_sweep_up" );
self maps\mp\animscripts\zm_shared::donotetracks( "flamethrower_anim" );
if ( level.vh_tank ent_flag( "tank_moving" ) )
break;
if ( level.vh_tank ent_flag( "tank_moving" ) )
break;
func = getFunction( "maps/mp/zm_tomb_tank", "get_players_on_tank" );
if ( isDefined( func ) )
{
a_players_on_tank = [[ func ]]( 1 );
}
else
{
a_players_on_tank = 0;
}
if ( !a_players_on_tank.size )
break;
}
//a_players_on_tank = get_players_on_tank( 1 );
a_players_on_tank = 0;
if ( !a_players_on_tank.size )
break;
}
self notify( "stop_ft" );
self notify( "stop_ft" );
}
mechz_stop_firing_watcher()
{
self endon( "death" );
self endon( "kill_ft" );
self endon( "flamethrower_complete" );
self waittillmatch( "flamethrower_anim", "stop_ft" );
self.firing = 0;
self endon( "death" );
self endon( "kill_ft" );
self endon( "flamethrower_complete" );
self waittillmatch( "flamethrower_anim", "stop_ft" );
self.firing = 0;
}
mechz_watch_for_flamethrower_damage()
{
self endon( "death" );
self endon( "death" );
while ( true )
{
self waittillmatch( "flamethrower_anim", "start_ft" );
self.firing = 1;
self thread mechz_stop_firing_watcher();
entity_on_tank_func = getFunction( "maps/mp/zm_tomb_tank", "entity_on_tank" );
while ( isdefined( self.firing ) && self.firing )
{
do_tank_sweep_auto_damage = isdefined( self.doing_tank_sweep ) && self.doing_tank_sweep && !level.vh_tank ent_flag( "tank_moving" );
players = getplayers();
while ( true )
{
self waittillmatch( "flamethrower_anim", "start_ft" );
self.firing = 1;
self thread mechz_stop_firing_watcher();
for ( i = 0; i < players.size; i++ )
{
if ( !( isdefined( players[i].is_burning ) && players[i].is_burning ) )
{
// if ( do_tank_sweep_auto_damage && players[i] entity_on_tank() || players[i] istouching( self.flamethrower_trigger ) )
// players[i] thread player_flame_damage();
}
}
while ( isdefined( self.firing ) && self.firing )
{
do_tank_sweep_auto_damage = isdefined( self.doing_tank_sweep ) && self.doing_tank_sweep && !level.vh_tank ent_flag( "tank_moving" );
players = getplayers();
zombies = getaispeciesarray( "axis", "all" );
for ( i = 0; i < players.size; i++ )
{
if ( !( isdefined( players[i].is_burning ) && players[i].is_burning ) )
{
if ( isDefined( entity_on_tank_func ) && do_tank_sweep_auto_damage && players[i] [[ entity_on_tank_func ]]() || players[i] istouching( self.flamethrower_trigger ) )
players[i] thread player_flame_damage();
}
}
for ( i = 0; i < zombies.size; i++ )
{
if ( isdefined( zombies[i].is_mechz ) && zombies[i].is_mechz )
continue;
zombies = getaispeciesarray( "axis", "all" );
if ( isdefined( zombies[i].on_fire ) && zombies[i].on_fire )
continue;
for ( i = 0; i < zombies.size; i++ )
{
if ( isdefined( zombies[i].is_mechz ) && zombies[i].is_mechz )
continue;
// if ( do_tank_sweep_auto_damage && zombies[i] entity_on_tank() || zombies[i] istouching( self.flamethrower_trigger ) )
// {
// zombies[i].on_fire = 1;
// zombies[i] promote_to_explosive();
// }
}
if ( isdefined( zombies[i].on_fire ) && zombies[i].on_fire )
continue;
wait 0.1;
}
}
if ( isDefined( entity_on_tank_func ) && do_tank_sweep_auto_damage && zombies[i] [[ entity_on_tank_func ]]() || zombies[i] istouching( self.flamethrower_trigger ) )
{
zombies[i].on_fire = 1;
zombies[i] promote_to_explosive();
}
}
wait 0.1;
}
}
}
player_flame_damage()
{
self endon( "zombified" );
self endon( "death" );
self endon( "disconnect" );
n_player_dmg = 30;
n_jugga_dmg = 45;
n_burn_time = 1.5;
self endon( "zombified" );
self endon( "death" );
self endon( "disconnect" );
n_player_dmg = 30;
n_jugga_dmg = 45;
n_burn_time = 1.5;
if ( isdefined( self.is_zombie ) && self.is_zombie )
return;
if ( isdefined( self.is_zombie ) && self.is_zombie )
return;
self thread player_stop_burning();
self thread player_stop_burning();
if ( !isdefined( self.is_burning ) && is_player_valid( self, 1, 0 ) )
{
self.is_burning = 1;
maps\mp\_visionset_mgr::vsmgr_activate( "overlay", "zm_transit_burn", self, n_burn_time, level.zm_transit_burn_max_duration );
self notify( "burned" );
if ( !isdefined( self.is_burning ) && is_player_valid( self, 1, 0 ) )
{
self.is_burning = 1;
maps\mp\_visionset_mgr::vsmgr_activate( "overlay", "zm_transit_burn", self, n_burn_time, level.zm_transit_burn_max_duration );
self notify( "burned" );
if ( !self hasperk( "specialty_armorvest" ) )
self dodamage( n_player_dmg, self.origin );
else
self dodamage( n_jugga_dmg, self.origin );
if ( !self hasperk( "specialty_armorvest" ) )
self dodamage( n_player_dmg, self.origin );
else
self dodamage( n_jugga_dmg, self.origin );
wait 0.5;
self.is_burning = undefined;
}
wait 0.5;
self.is_burning = undefined;
}
}
player_stop_burning()
{
self notify( "player_stop_burning" );
self endon( "player_stop_burning" );
self endon( "death_or_disconnect" );
self waittill( "zombified" );
self notify( "stop_flame_damage" );
maps\mp\_visionset_mgr::vsmgr_deactivate( "overlay", "zm_transit_burn", self );
self notify( "player_stop_burning" );
self endon( "player_stop_burning" );
self endon( "death_or_disconnect" );
self waittill( "zombified" );
self notify( "stop_flame_damage" );
maps\mp\_visionset_mgr::vsmgr_deactivate( "overlay", "zm_transit_burn", self );
}
zombie_burning_fx()
{
self endon( "death" );
self endon( "stop_flame_damage" );
self endon( "death" );
self endon( "stop_flame_damage" );
while ( true )
{
if ( isdefined( level._effect ) && isdefined( level._effect["character_fire_death_torso"] ) )
{
if ( !self.isdog )
playfxontag( level._effect["character_fire_death_torso"], self, "J_SpineLower" );
}
while ( true )
{
if ( isdefined( level._effect ) && isdefined( level._effect["character_fire_death_torso"] ) )
{
if ( !self.isdog )
playfxontag( level._effect["character_fire_death_torso"], self, "J_SpineLower" );
}
if ( isdefined( level._effect ) && isdefined( level._effect["character_fire_death_sm"] ) )
{
wait 1;
tagarray = [];
if ( isdefined( level._effect ) && isdefined( level._effect["character_fire_death_sm"] ) )
{
wait 1;
tagarray = [];
if ( randomint( 2 ) == 0 )
{
tagarray[0] = "J_Elbow_LE";
tagarray[1] = "J_Elbow_RI";
tagarray[2] = "J_HEAD";
}
else
{
tagarray[0] = "J_Wrist_RI";
tagarray[1] = "J_Wrist_LE";
tagarray[2] = "J_HEAD";
}
if ( randomint( 2 ) == 0 )
{
tagarray[0] = "J_Elbow_LE";
tagarray[1] = "J_Elbow_RI";
tagarray[2] = "J_HEAD";
}
else
{
tagarray[0] = "J_Wrist_RI";
tagarray[1] = "J_Wrist_LE";
tagarray[2] = "J_HEAD";
}
tagarray = array_randomize( tagarray );
self thread network_safe_play_fx_on_tag( "flamethrower", 2, level._effect["character_fire_death_sm"], self, tagarray[0] );
}
tagarray = array_randomize( tagarray );
self thread network_safe_play_fx_on_tag( "flamethrower", 2, level._effect["character_fire_death_sm"], self, tagarray[0] );
}
wait 12;
}
wait 12;
}
}
zombie_burning_audio()
{
self playloopsound( "zmb_fire_loop" );
self waittill_any( "death", "stop_flame_damage" );
self playloopsound( "zmb_fire_loop" );
self waittill_any( "death", "stop_flame_damage" );
if ( isdefined( self ) && isalive( self ) )
self stoploopsound( 0.25 );
if ( isdefined( self ) && isalive( self ) )
self stoploopsound( 0.25 );
}
zombie_burning_dmg()
{
self endon( "death" );
self endon( "stop_flame_damage" );
damageradius = 25;
damage = 2;
self endon( "death" );
self endon( "stop_flame_damage" );
damageradius = 25;
damage = 2;
while ( true )
{
eyeorigin = self geteye();
players = get_players();
while ( true )
{
eyeorigin = self geteye();
players = get_players();
for ( i = 0; i < players.size; i++ )
{
if ( is_player_valid( players[i], 1, 0 ) )
{
playereye = players[i] geteye();
for ( i = 0; i < players.size; i++ )
{
if ( is_player_valid( players[i], 1, 0 ) )
{
playereye = players[i] geteye();
if ( distancesquared( eyeorigin, playereye ) < damageradius * damageradius )
{
players[i] dodamage( damage, self.origin, self );
players[i] notify( "burned" );
}
}
}
if ( distancesquared( eyeorigin, playereye ) < damageradius * damageradius )
{
players[i] dodamage( damage, self.origin, self );
players[i] notify( "burned" );
}
}
}
wait 1.0;
}
wait 1.0;
}
}
promote_to_explosive()
{
self endon( "death" );
self thread zombie_burning_audio();
self thread zombie_burning_fx();
self thread explode_on_death();
self thread zombie_burning_dmg();
self thread on_fire_timeout();
self endon( "death" );
self thread zombie_burning_audio();
self thread zombie_burning_fx();
self thread explode_on_death();
self thread zombie_burning_dmg();
self thread on_fire_timeout();
}
explode_on_death()
{
self endon( "stop_flame_damage" );
self waittill( "death" );
self endon( "stop_flame_damage" );
self waittill( "death" );
if ( !isdefined( self ) )
return;
if ( !isdefined( self ) )
return;
tag = "J_SpineLower";
tag = "J_SpineLower";
if ( isdefined( self.animname ) && self.animname == "zombie_dog" )
tag = "tag_origin";
if ( isdefined( self.animname ) && self.animname == "zombie_dog" )
tag = "tag_origin";
if ( is_mature() )
{
if ( isdefined( level._effect["zomb_gib"] ) )
playfx( level._effect["zomb_gib"], self gettagorigin( tag ) );
}
else if ( isdefined( level._effect["spawn_cloud"] ) )
playfx( level._effect["spawn_cloud"], self gettagorigin( tag ) );
if ( is_mature() )
{
if ( isdefined( level._effect["zomb_gib"] ) )
playfx( level._effect["zomb_gib"], self gettagorigin( tag ) );
}
else if ( isdefined( level._effect["spawn_cloud"] ) )
playfx( level._effect["spawn_cloud"], self gettagorigin( tag ) );
self radiusdamage( self.origin, 128, 30, 15, undefined, "MOD_EXPLOSIVE" );
self ghost();
self radiusdamage( self.origin, 128, 30, 15, undefined, "MOD_EXPLOSIVE" );
self ghost();
if ( isdefined( self.isdog ) && self.isdog )
self hide();
else
self delay_thread( 1, ::self_delete );
if ( isdefined( self.isdog ) && self.isdog )
self hide();
else
self delay_thread( 1, ::self_delete );
}
on_fire_timeout()
{
self endon( "death" );
wait 12;
self endon( "death" );
wait 12;
if ( isdefined( self ) && isalive( self ) )
{
self.is_on_fire = 0;
self notify( "stop_flame_damage" );
}
if ( isdefined( self ) && isalive( self ) )
{
self.is_on_fire = 0;
self notify( "stop_flame_damage" );
}
}
should_do_flamethrower_attack()
{
assert( isdefined( self.favoriteenemy ) );
assert( isdefined( self.favoriteenemy ) );
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\tMZ: Checking should flame\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\tMZ: Checking should flame\\n" );
#/
if ( isdefined( self.disable_complex_behaviors ) && self.disable_complex_behaviors )
{
if ( isdefined( self.disable_complex_behaviors ) && self.disable_complex_behaviors )
{
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing flamethrower because doing force aggro\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing flamethrower because doing force aggro\\n" );
#/
return false;
}
return false;
}
if ( isdefined( self.not_interruptable ) && self.not_interruptable )
{
if ( isdefined( self.not_interruptable ) && self.not_interruptable )
{
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing flamethrower because another behavior has set not_interruptable\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing flamethrower because another behavior has set not_interruptable\\n" );
#/
return false;
}
return false;
}
if ( !self mechz_check_in_arc( 26 ) )
{
if ( !self mechz_check_in_arc( 26 ) )
{
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing flamethrower because target is not in front arc\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing flamethrower because target is not in front arc\\n" );
#/
return false;
}
return false;
}
if ( isdefined( self.last_flamethrower_time ) && gettime() - self.last_flamethrower_time < level.mechz_flamethrower_cooldown_time )
{
if ( isdefined( self.last_flamethrower_time ) && gettime() - self.last_flamethrower_time < level.mechz_flamethrower_cooldown_time )
{
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing flamethrower because it is still on cooldown\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing flamethrower because it is still on cooldown\\n" );
#/
return false;
}
return false;
}
n_dist_sq = distancesquared( self.origin, self.favoriteenemy.origin );
n_dist_sq = distancesquared( self.origin, self.favoriteenemy.origin );
if ( n_dist_sq < 10000 || n_dist_sq > 50000 )
{
if ( n_dist_sq < 10000 || n_dist_sq > 50000 )
{
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing flamethrower because target is not in range\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing flamethrower because target is not in range\\n" );
#/
return false;
}
return false;
}
b_cansee = bullettracepassed( self.origin + vectorscale( ( 0, 0, 1 ), 36.0 ), self.favoriteenemy.origin + vectorscale( ( 0, 0, 1 ), 36.0 ), 0, undefined );
b_cansee = bullettracepassed( self.origin + vectorscale( ( 0, 0, 1 ), 36.0 ), self.favoriteenemy.origin + vectorscale( ( 0, 0, 1 ), 36.0 ), 0, undefined );
if ( !b_cansee )
{
if ( !b_cansee )
{
/#
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing flamethrower because cannot see target\\n" );
if ( getdvarint( #"_id_E7121222" ) > 1 )
println( "\\n\\t\\tMZ: Not doing flamethrower because cannot see target\\n" );
#/
return false;
}
return false;
}
return true;
return true;
}
#using_animtree("mechz_claw");
mechz_do_flamethrower_attack( tank_sweep )
{
self endon( "death" );
self endon( "kill_ft" );
self endon( "death" );
self endon( "kill_ft" );
/#
if ( getdvarint( #"_id_E7121222" ) > 0 )
println( "\\n\\tMZ: Doing Flamethrower Attack\\n" );
if ( getdvarint( #"_id_E7121222" ) > 0 )
println( "\\n\\tMZ: Doing Flamethrower Attack\\n" );
#/
self thread mechz_stop_basic_find_flesh();
self.ai_state = "flamethrower_attack";
self setgoalpos( self.origin );
self clearanim( %root, 0.2 );
self.last_flamethrower_time = gettime();
self thread mechz_kill_flamethrower_watcher();
self thread mechz_stop_basic_find_flesh();
self.ai_state = "flamethrower_attack";
self setgoalpos( self.origin );
self clearanim( %root, 0.2 );
self.last_flamethrower_time = gettime();
self thread mechz_kill_flamethrower_watcher();
if ( !isdefined( self.flamethrower_trigger ) )
self mechz_flamethrower_initial_setup();
if ( !isdefined( self.flamethrower_trigger ) )
self mechz_flamethrower_initial_setup();
n_nearby_enemies = 0;
a_players = getplayers();
n_nearby_enemies = 0;
a_players = getplayers();
foreach ( player in a_players )
{
if ( distance2dsquared( player.origin, self.favoriteenemy.origin ) < 10000 )
n_nearby_enemies++;
}
foreach ( player in a_players )
{
if ( distance2dsquared( player.origin, self.favoriteenemy.origin ) < 10000 )
n_nearby_enemies++;
}
if ( isdefined( tank_sweep ) && tank_sweep )
{
self.doing_tank_sweep = 1;
self thread mechz_flamethrower_tank_sweep();
}
else if ( randomint( 100 ) < level.mechz_ft_sweep_chance && n_nearby_enemies > 1 )
{
self.doing_ft_sweep = 1;
self animscripted( self.origin, self.angles, "zm_flamethrower_sweep" );
self maps\mp\animscripts\zm_shared::donotetracks( "flamethrower_anim" );
}
else
{
self animscripted( self.origin, self.angles, "zm_flamethrower_aim_start" );
self thread mechz_flamethrower_aim();
self maps\mp\animscripts\zm_shared::donotetracks( "flamethrower_anim" );
}
if ( isdefined( tank_sweep ) && tank_sweep )
{
self.doing_tank_sweep = 1;
self thread mechz_flamethrower_tank_sweep();
}
else if ( randomint( 100 ) < level.mechz_ft_sweep_chance && n_nearby_enemies > 1 )
{
self.doing_ft_sweep = 1;
self animscripted( self.origin, self.angles, "zm_flamethrower_sweep" );
self maps\mp\animscripts\zm_shared::donotetracks( "flamethrower_anim" );
}
else
{
self animscripted( self.origin, self.angles, "zm_flamethrower_aim_start" );
self thread mechz_flamethrower_aim();
self maps\mp\animscripts\zm_shared::donotetracks( "flamethrower_anim" );
}
self orientmode( "face default" );
self orientmode( "face default" );
if ( isdefined( self.doing_ft_sweep ) && self.doing_ft_sweep )
self.doing_ft_sweep = 0;
else
{
self.cant_melee = 1;
self waittill( "stop_ft" );
self mechz_flamethrower_cleanup();
wait 0.5;
self stopanimscripted();
return;
}
if ( isdefined( self.doing_ft_sweep ) && self.doing_ft_sweep )
self.doing_ft_sweep = 0;
else
{
self.cant_melee = 1;
self waittill( "stop_ft" );
self mechz_flamethrower_cleanup();
wait 0.5;
self stopanimscripted();
return;
}
self mechz_flamethrower_cleanup();
self mechz_flamethrower_cleanup();
}
mechz_kill_flamethrower_watcher()
{
self endon( "flamethrower_complete" );
self waittill_either( "kill_ft", "death" );
self mechz_flamethrower_cleanup();
self endon( "flamethrower_complete" );
self waittill_either( "kill_ft", "death" );
self mechz_flamethrower_cleanup();
}
mechz_flamethrower_cleanup()
{
self.fx_field = self.fx_field & ~64;
self setclientfield( "mechz_fx", self.fx_field );
self.firing = 0;
self.doing_tank_sweep = 0;
self.cant_melee = 0;
self notify( "flamethrower_complete" );
self.fx_field = self.fx_field & ~64;
self setclientfield( "mechz_fx", self.fx_field );
self.firing = 0;
self.doing_tank_sweep = 0;
self.cant_melee = 0;
self notify( "flamethrower_complete" );
}