JezuzLizard a209af39b8 Add debug prints. Move objective related code into separate scripts.
Add the ability to prioritize objectives over targets.
2023-05-03 21:42:59 -07:00

349 lines
8.7 KiB
Plaintext

#include common_scripts\utility;
#include maps\_utility;
#include maps\bots\_bot_utility;
#include maps\bots\script_objectives\_obj_common;
bot_grab_powerup()
{
self endon( "disconnect" );
self endon( "powerup_end_think" );
self endon( "bot_in_invalid_state" );
level endon( "end_game" );
if ( !isDefined( self.available_powerups ) || self.available_powerups.size <= 0 )
{
return;
}
powerup_obj = self.available_powerups[ 0 ];
powerup_obj_ent = powerup_obj.target_ent;
set_bot_global_shared_objective_owner_by_ent( "powerup", powerup_obj_ent, self );
self bot_set_objective( "powerup", powerup_obj_ent );
bot_objective_print( "powerup", powerup_obj_ent, "Bot <" + self.playername + "> starts objective" );
while ( isDefined( powerup_obj_ent ) && isDefined( powerup_obj ) && self bot_is_objective_owner( "powerup", powerup_obj_ent ) )
{
wait 1;
self SetPriorityObjective();
self SetScriptGoal( powerup_obj_ent.origin );
result = self waittill_any_return( "goal", "bad_path", "new_goal" );
if ( result != "goal" )
{
bot_objective_print( "powerup", powerup_obj_ent, "Bot <" + self.playername + "> bad path" );
continue;
}
//Wait to see if the bot was able to grab the powerup
wait 0.5;
//Check if powerup still exists
if ( isDefined( powerup_obj_ent ) )
{
height_difference = self.origin[ 2 ] - powerup_obj_ent.origin[ 2 ];
if ( height_difference < 49 )
{
self BotJump();
wait 0.5;
waittillframeend;
//Check if bot was able to grab the powerup by jumping
if ( self bot_has_objective() || isDefined( powerup_obj_ent ) )
{
//Mark objective as bad so bots will ignore it from now on
powerup_obj.bad = true;
}
}
else
{
powerup_obj.bad = true;
}
if ( powerup_obj.bad )
{
bot_objective_print( "powerup", powerup_obj_ent, "Bot <" + self.playername + "> objective was marked as bad" );
break;
}
}
}
}
bot_powerup_process_order()
{
return 0;
}
bot_powerup_init()
{
self.successfully_grabbed_powerup = false;
}
bot_powerup_post_think( state )
{
obj = self bot_get_objective();
powerup_obj_ent = obj.target_ent;
switch ( state )
{
case "completed":
bot_objective_print( "powerup", powerup_obj_ent, "Bot <" + self.playername + "> objective was completed" );
break;
case "postponed":
bot_objective_print( "powerup", powerup_obj_ent, "Bot <" + self.playername + "> objective was postponed Reason: " + self.obj_postponed_reason );
break;
case "canceled":
bot_objective_print( "powerup", powerup_obj_ent, "Bot <" + self.playername + "> objective was canceled Reason: " + self.obj_cancel_reason );
break;
}
self.successfully_grabbed_powerup = false;
self.obj_cancel_reason = "";
self ClearScriptGoal();
self ClearScriptAimPos();
self ClearPriorityObjective();
self clear_objective_for_bot();
}
bot_should_grab_powerup()
{
if ( level.zbot_objective_glob[ "powerup" ].active_objectives.size <= 0 )
{
return false;
}
MAX_DISTANCE_SQ = 10000 * 10000;
BOT_SPEED_WHILE_SPRINTING_SQ = 285 * 285;
self.available_powerups = [];
powerup_objectives = level.zbot_objective_glob[ "powerup" ].active_objectives;
obj_keys = getArrayKeys( powerup_objectives );
for ( i = 0; i < powerup_objectives.size; i++ )
{
obj = powerup_objectives[ obj_keys[ i ] ];
powerup = obj.target_ent;
if ( !isDefined( powerup ) )
{
continue;
}
if ( obj.bad )
{
continue;
}
if ( isDefined( obj.owner ) )
{
continue;
}
time_left = powerup.time_left_until_timeout;
distance_required_to_reach_powerup = distanceSquared( powerup.origin, self.origin );
if ( distance_required_to_reach_powerup > BOT_SPEED_WHILE_SPRINTING_SQ * time_left )
{
continue;
}
if ( distanceSquared( powerup.origin, self.origin ) > MAX_DISTANCE_SQ )
{
continue;
}
if ( !isDefined( generatePath( self.origin, powerup.origin, self.team, level.bot_allowed_negotiation_links ) ) )
{
continue;
}
self.available_powerups[ self.available_powerups.size ] = obj;
}
//TODO: Sort powerups by priority here
return self.available_powerups.size > 0;
}
bot_check_complete_grab_powerup()
{
return self.successfully_grabbed_powerup;
}
bot_powerup_should_cancel()
{
if ( !isDefined( self.available_powerups ) || self.available_powerups.size <= 0 )
{
self.obj_cancel_reason = "No available powerups";
return true;
}
if ( !isDefined( self.available_powerups[ 0 ].target_ent ) )
{
self.obj_cancel_reason = "Powerup doesn't exist";
return true;
}
return false ;
}
bot_powerup_should_postpone()
{
return false;
}
bot_powerup_priority()
{
if ( !isDefined( self.available_powerups ) )
{
return 0;
}
//return self.available_powerups[ 0 ].target_ent.priority;
return 0;
}
//TODO: Possibly add the ability to circle revive?
bot_revive_player()
{
if ( !isDefined( self.available_revives ) || self.available_revives.size <= 0 )
{
return;
}
self endon( "disconnect" );
self endon( "revive_end_think" );
self endon( "bot_in_invalid_state" );
level endon( "end_game" );
player_to_revive_obj = self.available_revives[ 0 ];
player_to_revive = player_to_revive_obj.target_ent;
self bot_set_objective( "revive", player_to_revive );
set_bot_global_shared_objective_owner_by_ent( "revive", player_to_revive, self );
bot_objective_print( "revive", player_to_revive, "Bot <" + self.playername + "> objective started" );
//If player is no longer valid to revive stop trying to revive
//If bot doesn't have an objective anymore or the objective has changed stop trying to revive
while ( isDefined( player_to_revive ) && isDefined( player_to_revive_obj ) && self bot_is_objective_owner( "revive", player_to_revive ) )
{
wait 1;
//Constantly update the goal just in case the player is moving(T5 or higher only)
self ClearScriptAimPos();
self SetPriorityObjective();
self SetScriptGoal( player_to_revive.origin, 32 );
result = self waittill_any_return( "goal", "bad_path", "new_goal" );
//printConsole( result );
if ( result != "goal" )
{
bot_objective_print( "revive", player_to_revive, "Bot <" + self.playername + "> bad path" );
continue;
}
if ( !isDefined( player_to_revive.revivetrigger ) )
{
return;
}
//Check if the bot is reviving the player already and also that the player isn't being revived already
if ( player_to_revive.revivetrigger.beingrevived )
{
continue;
}
self SetScriptAimPos( player_to_revive.origin );
time = 3.2;
if ( self hasPerk( "specialty_quickrevive" ) )
{
time /= 2;
}
self thread BotPressUse( time );
while ( self maps\_laststand::is_reviving( player_to_revive ) )
{
wait 0.05;
}
//Wait to see if we cleared the objective by successfully reviving the player
waittillframeend;
}
}
bot_revive_process_order()
{
return 0;
}
bot_revive_player_init()
{
self.should_cancel_revive_obj = false;
self.successfully_revived_player = false;
}
bot_revive_player_post_think( state )
{
obj = self bot_get_objective();
revive_obj_ent = obj.target_ent;
switch ( state )
{
case "completed":
bot_objective_print( "revive", revive_obj_ent, "Bot <" + self.playername + "> objective was completed" );
break;
case "postponed":
bot_objective_print( "revive", revive_obj_ent, "Bot <" + self.playername + "> objective was postponed Reason: " + self.obj_postponed_reason );
break;
case "canceled":
bot_objective_print( "revive", revive_obj_ent, "Bot <" + self.playername + "> objective was canceled Reason: " + self.obj_cancel_reason );
break;
}
self.should_cancel_revive_obj = false;
self.successfully_revived_player = false;
self.obj_cancel_reason = "";
self ClearScriptGoal();
self ClearScriptAimPos();
self ClearPriorityObjective();
self clear_objective_for_bot();
}
bot_should_revive_player()
{
downed_players_objs = get_all_objectives_for_group( "revive" );
if ( downed_players_objs.size <= 0 )
{
return false;
}
self.available_revives = [];
obj_keys = getArrayKeys( downed_players_objs );
for ( i = 0; i < downed_players_objs.size; i++ )
{
obj = downed_players_objs[ obj_keys[ i ] ];
if ( isDefined( obj.owner ) )
{
continue;
}
if ( obj.bad )
{
continue;
}
self.available_revives[ self.available_revives.size ] = obj;
}
return self.available_revives.size > 0;
}
bot_check_complete_revive_player()
{
return self.successfully_revived_player;
}
bot_revive_player_should_cancel()
{
if ( !isDefined( self.available_revives[ 0 ] ) )
{
self.obj_cancel_reason = "Obj didn't exist";
return true;
}
if ( !isDefined( self.available_revives[ 0 ].target_ent ) )
{
self.obj_cancel_reason = "Entity didn't exist";
return true;
}
if ( !isDefined( self.available_revives[ 0 ].target_ent.revivetrigger ) )
{
self.obj_cancel_reason = "Revive trigger didn't exist";
return true;
}
return false;
}
bot_revive_player_should_postpone()
{
return false;
}
bot_revive_player_priority()
{
return 0;
}