mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-10 10:47:58 -05:00
382 lines
8.1 KiB
Plaintext
382 lines
8.1 KiB
Plaintext
#include maps/mp/bots/_bot_combat;
|
|
#include maps/mp/_utility;
|
|
#include common_scripts/utility;
|
|
#include maps/mp/gametypes/dem;
|
|
|
|
bot_dem_think()
|
|
{
|
|
while ( !isDefined( level.bombzones[ 0 ].dem_nodes ) )
|
|
{
|
|
_a11 = level.bombzones;
|
|
_k11 = getFirstArrayKey( _a11 );
|
|
while ( isDefined( _k11 ) )
|
|
{
|
|
zone = _a11[ _k11 ];
|
|
zone.dem_nodes = [];
|
|
zone.dem_nodes = getnodesinradius( zone.trigger.origin, 1024, 64, 128, "Path" );
|
|
_k11 = getNextArrayKey( _a11, _k11 );
|
|
}
|
|
}
|
|
if ( self.team == game[ "attackers" ] )
|
|
{
|
|
bot_dem_attack_think();
|
|
}
|
|
else
|
|
{
|
|
bot_dem_defend_think();
|
|
}
|
|
}
|
|
|
|
bot_dem_attack_think()
|
|
{
|
|
zones = dem_get_alive_zones();
|
|
if ( !zones.size )
|
|
{
|
|
return;
|
|
}
|
|
while ( !isDefined( self.goal_flag ) )
|
|
{
|
|
zones = array_randomize( zones );
|
|
_a42 = zones;
|
|
_k42 = getFirstArrayKey( _a42 );
|
|
while ( isDefined( _k42 ) )
|
|
{
|
|
zone = _a42[ _k42 ];
|
|
if ( zones.size == 1 || is_true( zone.bombplanted ) && !is_true( zone.bombexploded ) )
|
|
{
|
|
self.goal_flag = zone;
|
|
break;
|
|
}
|
|
else if ( randomint( 100 ) < 50 )
|
|
{
|
|
self.goal_flag = zone;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
_k42 = getNextArrayKey( _a42, _k42 );
|
|
}
|
|
}
|
|
}
|
|
if ( isDefined( self.goal_flag ) )
|
|
{
|
|
if ( is_true( self.goal_flag.bombexploded ) )
|
|
{
|
|
self.goal_flag = undefined;
|
|
self cancelgoal( "dem_guard" );
|
|
self cancelgoal( "bomb" );
|
|
return;
|
|
}
|
|
else if ( is_true( self.goal_flag.bombplanted ) )
|
|
{
|
|
self bot_dem_guard( self.goal_flag, self.goal_flag.dem_nodes, self.goal_flag.trigger.origin );
|
|
return;
|
|
}
|
|
else if ( self bot_dem_friend_interacting( self.goal_flag.trigger.origin ) )
|
|
{
|
|
self bot_dem_guard( self.goal_flag, self.goal_flag.dem_nodes, self.goal_flag.trigger.origin );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
self bot_dem_attack( self.goal_flag );
|
|
}
|
|
}
|
|
}
|
|
|
|
bot_dem_defend_think()
|
|
{
|
|
zones = dem_get_alive_zones();
|
|
if ( !zones.size )
|
|
{
|
|
return;
|
|
}
|
|
while ( !isDefined( self.goal_flag ) )
|
|
{
|
|
zones = array_randomize( zones );
|
|
_a95 = zones;
|
|
_k95 = getFirstArrayKey( _a95 );
|
|
while ( isDefined( _k95 ) )
|
|
{
|
|
zone = _a95[ _k95 ];
|
|
if ( zones.size == 1 || is_true( zone.bombplanted ) && !is_true( zone.bombexploded ) )
|
|
{
|
|
self.goal_flag = zone;
|
|
break;
|
|
}
|
|
else if ( randomint( 100 ) < 50 )
|
|
{
|
|
self.goal_flag = zone;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
_k95 = getNextArrayKey( _a95, _k95 );
|
|
}
|
|
}
|
|
}
|
|
if ( isDefined( self.goal_flag ) )
|
|
{
|
|
if ( is_true( self.goal_flag.bombexploded ) )
|
|
{
|
|
self.goal_flag = undefined;
|
|
self cancelgoal( "dem_guard" );
|
|
self cancelgoal( "bomb" );
|
|
return;
|
|
}
|
|
else if ( is_true( self.goal_flag.bombplanted ) && !self bot_dem_friend_interacting( self.goal_flag.trigger.origin ) )
|
|
{
|
|
self bot_dem_defuse( self.goal_flag );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
self bot_dem_guard( self.goal_flag, self.goal_flag.dem_nodes, self.goal_flag.trigger.origin );
|
|
}
|
|
}
|
|
}
|
|
|
|
bot_dem_attack( zone )
|
|
{
|
|
self cancelgoal( "dem_guard" );
|
|
if ( !self hasgoal( "bomb" ) )
|
|
{
|
|
self.bomb_goal = self dem_get_bomb_goal( zone.visuals[ 0 ] );
|
|
if ( isDefined( self.bomb_goal ) )
|
|
{
|
|
self addgoal( self.bomb_goal, 48, 2, "bomb" );
|
|
}
|
|
return;
|
|
}
|
|
if ( !self atgoal( "bomb" ) )
|
|
{
|
|
if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_smoke( self.bomb_goal ) )
|
|
{
|
|
if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( self.bomb_goal ) )
|
|
{
|
|
self maps/mp/bots/_bot_combat::bot_combat_throw_lethal( self.bomb_goal );
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
self addgoal( self.bomb_goal, 48, 4, "bomb" );
|
|
self setstance( "prone" );
|
|
self pressusebutton( level.planttime + 1 );
|
|
wait 0,5;
|
|
if ( is_true( self.isplanting ) )
|
|
{
|
|
wait ( level.planttime + 1 );
|
|
}
|
|
self pressusebutton( 0 );
|
|
defenders = self bot_get_enemies();
|
|
_a172 = defenders;
|
|
_k172 = getFirstArrayKey( _a172 );
|
|
while ( isDefined( _k172 ) )
|
|
{
|
|
defender = _a172[ _k172 ];
|
|
if ( defender is_bot() )
|
|
{
|
|
defender.goal_flag = undefined;
|
|
}
|
|
_k172 = getNextArrayKey( _a172, _k172 );
|
|
}
|
|
self setstance( "crouch" );
|
|
wait 0,25;
|
|
self cancelgoal( "bomb" );
|
|
self setstance( "stand" );
|
|
}
|
|
|
|
bot_dem_guard( zone, nodes, origin )
|
|
{
|
|
self cancelgoal( "bomb" );
|
|
enemy = self bot_dem_enemy_interacting( origin );
|
|
if ( isDefined( enemy ) )
|
|
{
|
|
self maps/mp/bots/_bot_combat::bot_combat_throw_lethal( enemy.origin );
|
|
self addgoal( enemy.origin, 128, 3, "dem_guard" );
|
|
return;
|
|
}
|
|
enemy = self bot_dem_enemy_nearby( origin );
|
|
if ( isDefined( enemy ) )
|
|
{
|
|
self maps/mp/bots/_bot_combat::bot_combat_throw_lethal( enemy.origin );
|
|
self addgoal( enemy.origin, 128, 3, "dem_guard" );
|
|
return;
|
|
}
|
|
if ( self hasgoal( "dem_guard" ) && !self atgoal( "dem_guard" ) )
|
|
{
|
|
self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( origin );
|
|
return;
|
|
}
|
|
node = random( nodes );
|
|
self addgoal( node, 24, 2, "dem_guard" );
|
|
}
|
|
|
|
bot_dem_defuse( zone )
|
|
{
|
|
self cancelgoal( "dem_guard" );
|
|
if ( !self hasgoal( "bomb" ) )
|
|
{
|
|
self.bomb_goal = self dem_get_bomb_goal( zone.visuals[ 0 ] );
|
|
if ( isDefined( self.bomb_goal ) )
|
|
{
|
|
self addgoal( self.bomb_goal, 48, 2, "bomb" );
|
|
}
|
|
return;
|
|
}
|
|
if ( !self atgoal( "bomb" ) )
|
|
{
|
|
if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_smoke( self.bomb_goal ) )
|
|
{
|
|
if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( self.bomb_goal ) )
|
|
{
|
|
self maps/mp/bots/_bot_combat::bot_combat_throw_lethal( self.bomb_goal );
|
|
}
|
|
}
|
|
if ( ( self.goal_flag.detonatetime - getTime() ) < 12000 )
|
|
{
|
|
self addgoal( self.bomb_goal, 48, 4, "bomb" );
|
|
}
|
|
return;
|
|
}
|
|
self addgoal( self.bomb_goal, 48, 4, "bomb" );
|
|
if ( cointoss() )
|
|
{
|
|
self setstance( "crouch" );
|
|
}
|
|
else
|
|
{
|
|
self setstance( "prone" );
|
|
}
|
|
self pressusebutton( level.defusetime + 1 );
|
|
wait 0,5;
|
|
if ( is_true( self.isdefusing ) )
|
|
{
|
|
wait ( level.defusetime + 1 );
|
|
}
|
|
self pressusebutton( 0 );
|
|
self setstance( "crouch" );
|
|
wait 0,25;
|
|
self cancelgoal( "bomb" );
|
|
self setstance( "stand" );
|
|
}
|
|
|
|
bot_dem_enemy_interacting( origin )
|
|
{
|
|
enemies = maps/mp/bots/_bot::bot_get_enemies();
|
|
_a288 = enemies;
|
|
_k288 = getFirstArrayKey( _a288 );
|
|
while ( isDefined( _k288 ) )
|
|
{
|
|
enemy = _a288[ _k288 ];
|
|
if ( distancesquared( enemy.origin, origin ) > 65536 )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
if ( is_true( enemy.isdefusing ) || is_true( enemy.isplanting ) )
|
|
{
|
|
return enemy;
|
|
}
|
|
}
|
|
_k288 = getNextArrayKey( _a288, _k288 );
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
bot_dem_friend_interacting( origin )
|
|
{
|
|
friends = maps/mp/bots/_bot::bot_get_friends();
|
|
_a308 = friends;
|
|
_k308 = getFirstArrayKey( _a308 );
|
|
while ( isDefined( _k308 ) )
|
|
{
|
|
friend = _a308[ _k308 ];
|
|
if ( distancesquared( friend.origin, origin ) > 65536 )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
if ( is_true( friend.isdefusing ) || is_true( friend.isplanting ) )
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
_k308 = getNextArrayKey( _a308, _k308 );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
bot_dem_enemy_nearby( origin )
|
|
{
|
|
enemy = maps/mp/bots/_bot::bot_get_closest_enemy( origin, 1 );
|
|
if ( isDefined( enemy ) )
|
|
{
|
|
if ( distancesquared( enemy.origin, origin ) < 1048576 )
|
|
{
|
|
return enemy;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
dem_get_alive_zones()
|
|
{
|
|
zones = [];
|
|
_a343 = level.bombzones;
|
|
_k343 = getFirstArrayKey( _a343 );
|
|
while ( isDefined( _k343 ) )
|
|
{
|
|
zone = _a343[ _k343 ];
|
|
if ( is_true( zone.bombexploded ) )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
zones[ zones.size ] = zone;
|
|
}
|
|
_k343 = getNextArrayKey( _a343, _k343 );
|
|
}
|
|
return zones;
|
|
}
|
|
|
|
dem_get_bomb_goal( ent )
|
|
{
|
|
while ( !isDefined( ent.bot_goals ) )
|
|
{
|
|
goals = [];
|
|
ent.bot_goals = [];
|
|
dir = anglesToForward( ent.angles );
|
|
dir = vectorScale( dir, 32 );
|
|
goals[ 0 ] = ent.origin + dir;
|
|
goals[ 1 ] = ent.origin - dir;
|
|
dir = anglesToRight( ent.angles );
|
|
dir = vectorScale( dir, 48 );
|
|
goals[ 2 ] = ent.origin + dir;
|
|
goals[ 3 ] = ent.origin - dir;
|
|
_a375 = goals;
|
|
_k375 = getFirstArrayKey( _a375 );
|
|
while ( isDefined( _k375 ) )
|
|
{
|
|
goal = _a375[ _k375 ];
|
|
start = goal + vectorScale( ( 0, 0, 1 ), 128 );
|
|
trace = bullettrace( start, goal, 0, undefined );
|
|
ent.bot_goals[ ent.bot_goals.size ] = trace[ "position" ];
|
|
_k375 = getNextArrayKey( _a375, _k375 );
|
|
}
|
|
}
|
|
goals = array_randomize( ent.bot_goals );
|
|
_a386 = goals;
|
|
_k386 = getFirstArrayKey( _a386 );
|
|
while ( isDefined( _k386 ) )
|
|
{
|
|
goal = _a386[ _k386 ];
|
|
if ( findpath( self.origin, goal, 0 ) )
|
|
{
|
|
return goal;
|
|
}
|
|
_k386 = getNextArrayKey( _a386, _k386 );
|
|
}
|
|
return undefined;
|
|
}
|