mirror of
https://github.com/JezuzLizard/BO2-Reimagined.git
synced 2025-06-25 14:40:32 -05:00
241 lines
5.5 KiB
Plaintext
241 lines
5.5 KiB
Plaintext
#include maps\mp\_utility;
|
|
#include common_scripts\utility;
|
|
#include maps\mp\zombies\_zm_utility;
|
|
|
|
track_players_intersection_tracker()
|
|
{
|
|
// BO2 has built in push mechanic
|
|
}
|
|
|
|
is_headshot( sweapon, shitloc, smeansofdeath )
|
|
{
|
|
if ( smeansofdeath == "MOD_MELEE" || smeansofdeath == "MOD_BAYONET" || smeansofdeath == "MOD_IMPACT" || smeansofdeath == "MOD_UNKNOWN" || smeansofdeath == "MOD_IMPACT" )
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if ( shitloc == "head" || shitloc == "helmet" || sHitLoc == "neck" )
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
create_zombie_point_of_interest_attractor_positions( num_attract_dists, diff_per_dist, attractor_width )
|
|
{
|
|
self endon( "death" );
|
|
forward = ( 0, 1, 0 );
|
|
if ( !isDefined( self.num_poi_attracts ) || isDefined( self.script_noteworthy ) && self.script_noteworthy != "zombie_poi" )
|
|
{
|
|
return;
|
|
}
|
|
if ( !isDefined( num_attract_dists ) )
|
|
{
|
|
num_attract_dists = 4;
|
|
}
|
|
if ( !isDefined( diff_per_dist ) )
|
|
{
|
|
diff_per_dist = 45;
|
|
}
|
|
if ( !isDefined( attractor_width ) )
|
|
{
|
|
attractor_width = 45;
|
|
}
|
|
self.attract_to_origin = 0;
|
|
self.num_attract_dists = num_attract_dists;
|
|
self.last_index = [];
|
|
for ( i = 0; i < num_attract_dists; i++ )
|
|
{
|
|
self.last_index[ i ] = -1;
|
|
}
|
|
self.attract_dists = [];
|
|
for ( i = 0; i < self.num_attract_dists; i++ )
|
|
{
|
|
self.attract_dists[ i ] = diff_per_dist * ( i + 1 );
|
|
}
|
|
max_positions = [];
|
|
for ( i = 0; i < self.num_attract_dists; i++ )
|
|
{
|
|
max_positions[ i ] = int( ( 6.28 * self.attract_dists[ i ] ) / attractor_width );
|
|
}
|
|
num_attracts_per_dist = self.num_poi_attracts / self.num_attract_dists;
|
|
self.max_attractor_dist = self.attract_dists[ self.attract_dists.size - 1 ] * 1.1;
|
|
diff = 0;
|
|
actual_num_positions = [];
|
|
i = 0;
|
|
while ( i < self.num_attract_dists )
|
|
{
|
|
if ( num_attracts_per_dist > ( max_positions[ i ] + diff ) )
|
|
{
|
|
actual_num_positions[ i ] = max_positions[ i ];
|
|
diff += num_attracts_per_dist - max_positions[ i ];
|
|
i++;
|
|
continue;
|
|
}
|
|
actual_num_positions[ i ] = num_attracts_per_dist + diff;
|
|
diff = 0;
|
|
i++;
|
|
}
|
|
self.attractor_positions = [];
|
|
failed = 0;
|
|
angle_offset = 0;
|
|
prev_last_index = -1;
|
|
for ( j = 0; j < 4; j++)
|
|
{
|
|
if ( ( actual_num_positions[ j ] + failed ) < max_positions[ j ] )
|
|
{
|
|
actual_num_positions[ j ] += failed;
|
|
failed = 0;
|
|
}
|
|
else if ( actual_num_positions[ j ] < max_positions[ j ] )
|
|
{
|
|
actual_num_positions[ j ] = max_positions[ j ];
|
|
failed = max_positions[ j ] - actual_num_positions[ j ];
|
|
}
|
|
failed += self generated_radius_attract_positions( forward, angle_offset, actual_num_positions[ j ], self.attract_dists[ j ] );
|
|
angle_offset += 15;
|
|
self.last_index[ j ] = int( ( actual_num_positions[ j ] - failed ) + prev_last_index );
|
|
prev_last_index = self.last_index[ j ];
|
|
|
|
self notify( "attractor_positions_generated" );
|
|
level notify( "attractor_positions_generated" );
|
|
}
|
|
}
|
|
|
|
spawn_zombie_override( spawner, target_name, spawn_point, round_number )
|
|
{
|
|
if ( !isdefined( spawner ) )
|
|
{
|
|
/#
|
|
println( "ZM >> spawn_zombie - NO SPAWNER DEFINED" );
|
|
#/
|
|
return undefined;
|
|
}
|
|
|
|
while ( getfreeactorcount() < 1 )
|
|
wait 0.05;
|
|
|
|
spawner.script_moveoverride = 1;
|
|
|
|
if ( isdefined( spawner.script_forcespawn ) && spawner.script_forcespawn )
|
|
{
|
|
guy = spawner spawnactor();
|
|
|
|
guy.zombie_can_sidestep = true;
|
|
guy.zombie_can_forwardstep = true;
|
|
guy.shouldsidestepfunc = ::zombie_should_sidestep;
|
|
guy thread speed_up_zombie();
|
|
if ( isdefined( level.giveextrazombies ) )
|
|
guy [[ level.giveextrazombies ]]();
|
|
|
|
guy enableaimassist();
|
|
|
|
if ( isdefined( round_number ) )
|
|
guy._starting_round_number = round_number;
|
|
|
|
guy.aiteam = level.zombie_team;
|
|
guy clearentityowner();
|
|
level.zombiemeleeplayercounter = 0;
|
|
guy thread run_spawn_functions();
|
|
guy forceteleport( spawner.origin );
|
|
guy show();
|
|
}
|
|
|
|
spawner.count = 666;
|
|
|
|
if ( !spawn_failed( guy ) )
|
|
{
|
|
if ( isdefined( target_name ) )
|
|
guy.targetname = target_name;
|
|
|
|
return guy;
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
zombie_should_sidestep()
|
|
{
|
|
if ( maps\mp\animscripts\zm_move::cansidestep() && isplayer( self.enemy ) && self.enemy islookingat( self ) )
|
|
{
|
|
if ( self.zombie_move_speed != "sprint" || randomfloat( 1 ) < 0.7 )
|
|
return "step";
|
|
else
|
|
return "roll";
|
|
}
|
|
|
|
return "none";
|
|
}
|
|
|
|
speed_up_zombie()
|
|
{
|
|
if ( level.scr_zm_ui_gametype_obj != "zmeat" )
|
|
{
|
|
return;
|
|
}
|
|
if ( !isDefined( level.meat_player_tracker_for_zombie_movespeed ) )
|
|
{
|
|
level.meat_player_tracker_for_zombie_movespeed = ::track_meat_player;
|
|
level thread [[ level.meat_player_tracker_for_zombie_movespeed ]]();
|
|
}
|
|
self endon( "death" );
|
|
self waittill( "completed_emerging_into_playable_area" );
|
|
while ( true )
|
|
{
|
|
wait 0.1;
|
|
if ( !is_true( self.has_legs ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( !isDefined( level.meat_player ) )
|
|
{
|
|
if ( self.zombie_move_speed != "sprint" )
|
|
{
|
|
self set_zombie_run_cycle( "sprint" );
|
|
}
|
|
continue;
|
|
}
|
|
|
|
if ( distanceSquared( level.meat_player.origin, self.origin ) < 87381 && distanceSquared( level.meat_player.origin, self.origin ) > 21845 )
|
|
{
|
|
if ( self.zombie_move_speed != "super_sprint" )
|
|
{
|
|
self set_zombie_run_cycle( "super_sprint" );
|
|
}
|
|
}
|
|
else if ( distanceSquared( level.meat_player.origin, self.origin ) > 87381 )
|
|
{
|
|
if ( self.zombie_move_speed != "chase_bus" )
|
|
{
|
|
self set_zombie_run_cycle( "chase_bus" );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( self.zombie_move_speed != "sprint" )
|
|
{
|
|
self set_zombie_run_cycle( "sprint" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
track_meat_player()
|
|
{
|
|
level endon( "end_game" );
|
|
while ( true )
|
|
{
|
|
level.meat_player = undefined;
|
|
foreach (player in level.players)
|
|
{
|
|
if (player hasWeapon("item_meat_zm"))
|
|
{
|
|
level.meat_player = player;
|
|
break;
|
|
}
|
|
}
|
|
wait 0.5;
|
|
}
|
|
} |