From 280ec4c318a655edf03fc2c3f29bba115b20e858 Mon Sep 17 00:00:00 2001 From: JezuzLizard Date: Tue, 11 Jul 2023 21:00:28 -0700 Subject: [PATCH] Progress 3. --- maps/bots/_bot_internal.gsc | 9 +- maps/bots/_bot_utility.gsc | 13 +- maps/bots/script_objectives/_obj_actions.gsc | 124 +++++++++++++++- maps/bots/script_objectives/_obj_common.gsc | 45 +++++- maps/bots/script_objectives/_obj_init.gsc | 19 ++- maps/bots/script_objectives/_obj_trackers.gsc | 138 ++++++++++++++++-- 6 files changed, 315 insertions(+), 33 deletions(-) diff --git a/maps/bots/_bot_internal.gsc b/maps/bots/_bot_internal.gsc index 23c0cab..3347e5e 100644 --- a/maps/bots/_bot_internal.gsc +++ b/maps/bots/_bot_internal.gsc @@ -1768,8 +1768,13 @@ initAStar( goal ) if ( !isDefined( nodes ) ) { - self.bot.astar = []; - return -1; + //Try again to find a path to the origin using best effort algo + nodes = generatePath( self.origin, goal, self.team, level.bot_allowed_negotiation_links, 192.0 ); + if ( !isDefined( nodes ) ) + { + self.bot.astar = []; + return -1; + } } node_indexes = []; diff --git a/maps/bots/_bot_utility.gsc b/maps/bots/_bot_utility.gsc index f246141..d0a8a32 100644 --- a/maps/bots/_bot_utility.gsc +++ b/maps/bots/_bot_utility.gsc @@ -316,10 +316,17 @@ ClearPriorityObjective() /* Checks whether the path generated by the ASTAR path finding is inaccessible */ -GetPathIsInaccessible( to ) +GetPathIsInaccessible( to, best_effort ) { - path = generatePath( self.origin, to, self.team, level.bot_allowed_negotiation_links ); - return !isDefined( path ) || path.size <= 0; + if ( isDefined( best_effort ) ) + { + path = generatePath( self.origin, to, self.team, level.bot_allowed_negotiation_links, best_effort ); + } + else + { + path = generatePath( self.origin, to, self.team, level.bot_allowed_negotiation_links ); + } + return !isDefined( path ) || ( path.size <= 0) ; } /* diff --git a/maps/bots/script_objectives/_obj_actions.gsc b/maps/bots/script_objectives/_obj_actions.gsc index 5cfd169..8f31b75 100644 --- a/maps/bots/script_objectives/_obj_actions.gsc +++ b/maps/bots/script_objectives/_obj_actions.gsc @@ -25,6 +25,7 @@ bot_post_think_common( state ) bot_obj_timeout( objective_group, time ) { + self endon( objective_group + "_end_think" ); wait time; self.obj_cancel_reason = "Obj timeout"; self notify( objective_group + "_cancel" ); @@ -434,6 +435,11 @@ bot_should_purchase_magicbox() { obj = magicbox_objs[ magicbox_objs_keys[ i ] ]; magicbox = obj.target_ent; + if ( isDefined( self.last_magicbox_purchase_time ) && getTime() < ( self.last_magicbox_purchase_time + 60000 ) ) + { + self bot_objective_print( "magicbox", obj.id, "Bot <" + self.playername + "> not purchasing this magicbox box because this action is on cooldown", "bot_should_purchase_magicbox" ); + continue; + } if ( magicbox.hidden ) { self bot_objective_print( "magicbox", obj.id, "Bot <" + self.playername + "> not purchasing this magicbox box because it is hidden", "bot_should_purchase_magicbox" ); @@ -716,7 +722,7 @@ bot_should_purchase_door() self bot_objective_print( "door", obj.id, "Bot <" + self.playername + "> not purchasing <" + door_ent.target + "> because we can't afford it", "bot_should_purchase_door" ); continue; } - if ( self GetPathIsInaccessible( door_ent.origin ) ) + if ( self GetPathIsInaccessible( door_ent.origin, 192.0 ) ) { self bot_objective_print( "door", obj.id, "Bot <" + self.playername + "> not purchasing <" + door_ent.target + "> because it cannot be pathed to", "bot_should_purchase_door" ); continue; @@ -809,7 +815,7 @@ bot_should_purchase_debris() self bot_objective_print( "debris", obj.id, "Bot <" + self.playername + "> not purchasing <" + debris_ent.target + "> because we can't afford it", "bot_should_purchase_debris" ); continue; } - if ( self GetPathIsInaccessible( debris_ent.origin ) ) + if ( self GetPathIsInaccessible( debris_ent.origin, 192.0 ) ) { self bot_objective_print( "debris", obj.id, "Bot <" + self.playername + "> not purchasing <" + debris_ent.target + "> because it cannot be pathed to", "bot_should_purchase_debris" ); continue; @@ -899,6 +905,11 @@ bot_should_purchase_wallbuy() obj = wallbuy_objs[ wallbuy_objs_keys[ i ] ]; wallbuy_ent = obj.target_ent; weapon = wallbuy_ent.zombie_weapon_upgrade; + if ( isDefined( self.last_wallbuy_purchase_time ) && getTime() < ( self.last_wallbuy_purchase_time + 60000 ) ) + { + self bot_objective_print( "wallbuy", obj.id, "Bot <" + self.playername + "> not purchasing <" + weapon + "> because this action is on cooldown", "bot_should_purchase_wallbuy" ); + continue; + } if ( self.score < maps\so\zm_common\_zm_weapons::get_weapon_cost( weapon ) ) { self bot_objective_print( "wallbuy", obj.id, "Bot <" + self.playername + "> not purchasing <" + weapon + "> because we can't afford it", "bot_should_purchase_wallbuy" ); @@ -1004,6 +1015,11 @@ bot_should_purchase_wallbuy_ammo() self bot_objective_print( "wallbuyammo", obj.id, "Bot <" + self.playername + "> not purchasing ammo for <" + weapon + "> because we can't afford it", "bot_should_purchase_wallbuy_ammo" ); continue; } + if ( ( self GetWeaponAmmoStock( weapon ) / WeaponMaxAmmo( weapon ) ) > 0.3 ) + { + self bot_objective_print( "wallbuyammo", obj.id, "Bot <" + self.playername + "> not purchasing ammo for <" + weapon + "> because we don't need ammo", "bot_should_purchase_wallbuy_ammo" ); + continue; + } if ( self GetPathIsInaccessible( wallbuy_ent.bot_use_node ) ) { self bot_objective_print( "wallbuyammo", obj.id, "Bot <" + self.playername + "> not purchasing ammo for <" + weapon + "> because it cannot be pathed to", "bot_should_purchase_wallbuy_ammo" ); @@ -1121,12 +1137,12 @@ bot_should_purchase_packapunch() packapunch_ent = obj.target_ent; if ( self.score < level._custom_packapunch.cost ) { - self bot_objective_print( "packapunch", obj.id, "Bot <" + self.playername + "> not purchasing packapunch because we can't afford it", "bot_should_purchase_wallbuy_ammo" ); + self bot_objective_print( "packapunch", obj.id, "Bot <" + self.playername + "> not purchasing packapunch because we can't afford it", "bot_should_purchase_packapunch" ); continue; } - if ( self GetPathIsInaccessible( wallbuy_ent.bot_use_node ) ) + if ( self GetPathIsInaccessible( packapunch_ent.bot_use_node ) ) { - self bot_objective_print( "packapunch", obj.id, "Bot <" + self.playername + "> not purchasing packapunch because it cannot be pathed to", "bot_should_purchase_wallbuy_ammo" ); + self bot_objective_print( "packapunch", obj.id, "Bot <" + self.playername + "> not purchasing packapunch because it cannot be pathed to", "bot_should_purchase_packapunch" ); continue; } self.available_packapunchs[ self.available_packapunchs.size ] = obj; @@ -1144,7 +1160,6 @@ bot_packapunch_purchase_should_cancel() obj = self bot_get_objective(); goal_canceled = false; - perk = obj.target_ent.script_noteworthy; if ( isDefined( obj.target_ent.packapunch_weapon_spawn_time ) && isDefined( obj.target_ent.packapunch_user ) && obj.target_ent.packapunch_user == self @@ -1157,6 +1172,103 @@ bot_packapunch_purchase_should_cancel() } bot_packapunch_purchase_priority() +{ + return 0; +} + +bot_power_activate() +{ + if ( !isDefined( self.available_powers ) || self.available_powers.size <= 0 ) + { + return; + } + + self endon( "disconnect" ); + self endon( "power_end_think" ); + level endon( "end_game" ); + + power_obj = self.available_powers[ 0 ]; + + power_ent = power_obj.target_ent; + self bot_set_objective( "power", power_ent ); + self bot_objective_print( "power", power_obj.id, "Bot <" + self.playername + "> Attempting to activate power" "bot_power_activate" ); + + lookat_org = power_ent.origin; + goal_org = power_ent.bot_use_node; + + self ClearScriptAimPos(); + self SetScriptGoal( goal_org, 24 ); + + result = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + if ( result != "goal" ) + { + self.obj_cancel_reason = "Bad path/new goal"; + self notify( "power_cancel" ); + return; + } + + self SetScriptAimPos( lookat_org ); + self thread bot_obj_timeout( "power", 2 ); + wait randomFloatRange( 0.5, 1.5 ); + + self thread BotPressUse( 0.2 ); +} + +bot_power_activate_init() +{ + self.successfully_activated_power = false; +} + +bot_power_activate_post_think() +{ + self bot_post_think_common( state ); + self.successfully_activated_power = false; +} + +bot_should_activate_power() +{ + power_objs = get_all_objectives_for_group( "power" ); + if ( power_objs.size <= 0 ) + { + return false; + } + self.available_powers = []; + power_objs_keys = getArrayKeys( power_objs ); + power_objs_keys = array_randomize( power_objs_keys ); + for ( i = 0; i < power_objs.size; i++ ) + { + obj = power_objs[ power_objs_keys[ i ] ]; + power_ent = obj.target_ent; + if ( self GetPathIsInaccessible( power_ent.bot_use_node ) ) + { + self bot_objective_print( "power", obj.id, "Bot <" + self.playername + "> not activating power because it cannot be pathed to", "bot_power_activate" ); + continue; + } + self.available_powers[ self.available_powers.size ] = obj; + } + return self.available_powers.size > 0; +} + +bot_check_complete_power_activate() +{ + return self.successfully_activated_power; +} + +bot_power_activate_should_cancel() +{ + obj = self bot_get_objective(); + + goal_canceled = false; + if ( isDefined( level.flag[ "power_on" ] ) && level.flag[ "power_on" ] ) + { + self.obj_cancel_reason = "Power is already on"; + goal_canceled = true; + } + return goal_canceled; +} + +bot_power_activate_priority() { return 0; } \ No newline at end of file diff --git a/maps/bots/script_objectives/_obj_common.gsc b/maps/bots/script_objectives/_obj_common.gsc index 2839c2e..8b7018d 100644 --- a/maps/bots/script_objectives/_obj_common.gsc +++ b/maps/bots/script_objectives/_obj_common.gsc @@ -408,10 +408,31 @@ bot_pick_action() } } - if ( !isDefined( possible_actions.data ) || possible_actions.data.size <= 0 ) + forced_action = getDvar( "bots_debug_forced_action" ); + + if ( ( !isDefined( possible_actions.data ) || possible_actions.data.size <= 0 ) && forced_action == "" ) { return false; } + if ( forced_action != "" ) + { + entnum_and_forced_action = strTok( forced_action, " " ); + if ( entnum_and_forced_action.size != 2 ) + { + setDvar( "bots_debug_forced_action", "" ); + } + else if ( int( entnum_and_forced_action[ 0 ] ) == self getEntityNumber() && isDefined( level.zbots_actions[ entnum_and_forced_action[ 1 ] ] ) ) + { + possible_action = spawnStruct(); + possible_action.action_name = entnum_and_forced_action[ 1 ]; + possible_action.priority = 999; + self.bot_action = possible_action; + setDvar( "bots_debug_forced_action", "" ); + printConsole( self.playername + " Picking forced action " + self.bot_action.action_name + " Priority " + self.bot_action.priority ); + return true; + } + + } self.bot_action = possible_actions.data[ 0 ]; printConsole( self.playername + " Picking action " + self.bot_action.action_name + " Priority " + self.bot_action.priority ); return true; @@ -577,13 +598,25 @@ action_should_be_canceled_global( action_name ) return goal_canceled; } -get_angle_offset_node( ent, angle_offset, forward_size, offset ) +get_angle_offset_node( forward_size, angle_offset, offset ) { - angles = ent.angles; + if ( !isDefined( forward_size ) ) + { + forward_size = 40; + } + if ( !isDefined( angle_offset ) ) + { + angle_offset = ( 0, 0, 0 ); + } + if ( !isDefined( offset ) ) + { + offset = ( 0, 0, 0 ); + } + + angles = ( 0, self.angles[ 1 ], 0 ); angles += angle_offset; - angles = ( 0, AngleClamp180( angles[ 1 ] ), 0 ); - node = ent.origin + ( AnglesToForward( angles ) * forward_size ); - node = clamp_to_ground( node ) + offset; + node = self.origin + ( AnglesToForward( angles ) * forward_size ) + offset; + node = clamp_to_ground( node ); return node; } diff --git a/maps/bots/script_objectives/_obj_init.gsc b/maps/bots/script_objectives/_obj_init.gsc index 2951d77..d96d4b0 100644 --- a/maps/bots/script_objectives/_obj_init.gsc +++ b/maps/bots/script_objectives/_obj_init.gsc @@ -7,8 +7,6 @@ init() { - //maps\bots\script_objectives\_obj_common; - //maps\bots\script_objectives\_obj_actions; register_bot_action( "powerup", ::bot_grab_powerup, ::bot_powerup_init, @@ -90,6 +88,15 @@ init() ::bot_packapunch_purchase_should_cancel, ::bot_packapunch_purchase_priority ); + register_bot_action( "power", + ::bot_power_activate, + ::bot_power_activate_init, + ::bot_power_activate_post_think, + ::bot_should_activate_power, + ::bot_check_complete_power_activate, + ::bot_power_activate_should_cancel, + ::bot_power_activate_priority ); + register_bot_objective( "magicbox" ); register_bot_objective( "wallbuy" ); register_bot_objective( "wallbuyammo" ); @@ -98,12 +105,18 @@ init() register_bot_objective( "debris" ); register_bot_objective( "trap" ); register_bot_objective( "packapunch" ); + register_bot_objective( "power" ); register_bot_objective( "revive" ); //register_bot_objective( "grabbuildable" ); //register_bot_objective( "buildbuildable" ); //register_bot_objective( "part" ); register_bot_objective( "powerup" ); + if ( getDvar( "bots_obj_buy_blockers" ) == "" ) + { + setDvar( "bots_obj_buy_blockers", true ); + } + create_static_objectives(); } @@ -117,6 +130,8 @@ connected() self.on_perk_purchase_func = ::bot_on_perk_purchase; self.on_door_purchase_func = ::bot_on_door_purchase_func; self.on_debris_purchase_func = ::bot_on_debris_purchase_func; + self.on_wallbuy_purchase_func = ::bot_on_wallbuy_purchase_func; + self.on_wallbuy_ammo_purchase_func = ::bot_on_wallbuy_ammo_purchase_func; self.obj_cancel_reason = ""; diff --git a/maps/bots/script_objectives/_obj_trackers.gsc b/maps/bots/script_objectives/_obj_trackers.gsc index 0f91d45..a12a972 100644 --- a/maps/bots/script_objectives/_obj_trackers.gsc +++ b/maps/bots/script_objectives/_obj_trackers.gsc @@ -13,6 +13,10 @@ create_static_objectives() { setDvar( "magicbox_node_vertical_offset", 10 ); } + if ( getDvar( "magicbox_node_angle" ) == "" ) + { + setDvar( "magicbox_node_angle", 90 ); + } if ( getDvar( "perk_node_forward_size" ) == "" ) { setDvar( "perk_node_forward_size", 55 ); @@ -21,6 +25,46 @@ create_static_objectives() { setDvar( "perk_node_vertical_offset", 1 ); } + if ( getDvar( "perk_node_angle" ) == "" ) + { + setDvar( "perk_node_angle", -90 ); + } + if ( getDvar( "wallbuy_node_forward_size" ) == "" ) + { + setDvar( "wallbuy_node_forward_size", 40 ); + } + if ( getDvar( "wallbuy_node_vertical_offset" ) == "" ) + { + setDvar( "wallbuy_node_vertical_offset", 1 ); + } + if ( getDvar( "wallbuy_node_angle" ) == "" ) + { + setDvar( "wallbuy_node_angle", -90 ); + } + if ( getDvar( "packapunch_node_forward_size" ) == "" ) + { + setDvar( "packapunch_node_forward_size", 55 ); + } + if ( getDvar( "packapunch_node_vertical_offset" ) == "" ) + { + setDvar( "packapunch_node_vertical_offset", 1 ); + } + if ( getDvar( "packapunch_node_angle" ) == "" ) + { + setDvar( "packapunch_node_angle", -90 ); + } + if ( getDvar( "power_node_forward_size" ) == "" ) + { + setDvar( "power_node_forward_size", 55 ); + } + if ( getDvar( "power_node_vertical_offset" ) == "" ) + { + setDvar( "power_node_vertical_offset", 1 ); + } + if ( getDvar( "power_node_angle" ) == "" ) + { + setDvar( "power_node_angle", -90 ); + } weapon_spawns = GetEntArray( "weapon_upgrade", "targetname" ); if ( isDefined( weapon_spawns ) && weapon_spawns.size > 0 ) @@ -30,7 +74,7 @@ create_static_objectives() obj = add_possible_bot_objective( "wallbuy", weapon_spawns[ i ], false ); obj = add_possible_bot_objective( "wallbuyammo", weapon_spawns[ i ], false ); model = getEnt( weapon_spawns[ i ].target, "targetname" ); - weapon_spawns[ i ].bot_use_node = get_angle_offset_node( model, ( 0, model.angles[ 1 ] - 90, 0 ), getDvarInt( "perk_node_forward_size" ), ( 0, 0, getDvarInt( "perk_node_vertical_offset" ) ) ); + weapon_spawns[ i ].bot_use_node = model get_angle_offset_node( getDvarInt( "wallbuy_node_forward_size" ), ( 0, getDvarInt( "wallbuy_node_angle" ), 0 ), ( 0, 0, getDvarInt( "wallbuy_node_vertical_offset" ) ) ); model thread wallbuy_debug(); } } @@ -43,7 +87,7 @@ create_static_objectives() { obj = add_possible_bot_objective( "perk", vending_triggers[ i ], false ); model = getEnt( vending_triggers[ i ].target, "targetname" ); - vending_triggers[ i ].bot_use_node = get_angle_offset_node( model, ( 0, model.angles[ 1 ] - 90, 0 ), getDvarInt( "perk_node_forward_size" ), ( 0, 0, getDvarInt( "perk_node_vertical_offset" ) ) ); + vending_triggers[ i ].bot_use_node = model get_angle_offset_node( getDvarInt( "perk_node_forward_size" ), ( 0, getDvarInt( "perk_node_angle" ), 0 ), ( 0, 0, getDvarInt( "perk_node_vertical_offset" ) ) ); model thread perk_debug(); } } @@ -82,9 +126,24 @@ create_static_objectives() for ( i = 0; i < vending_upgrade_trigger.size; i++ ) { obj = add_possible_bot_objective( "packapunch", vending_upgrade_trigger[ i ], false ); + model = getEnt( vending_triggers[ i ].target, "targetname" ); + vending_upgrade_trigger[ i ].bot_use_node = model get_angle_offset_node( getDvarInt( "packapunch_node_forward_size" ), ( 0, getDvarInt( "packapunch_node_angle" ), 0 ), ( 0, 0, getDvarInt( "packapunch_node_vertical_offset" ) ) ); + model thread packapunch_debug(); } } + master_switch = getent("power_switch","targetname"); + if ( !isDefined( master_switch ) ) + { + master_switch = getent("master_switch","targetname"); + } + if ( isDefined( master_switch ) ) + { + obj = add_possible_bot_objective( "power", master_switch, false ); + master_switch.bot_use_node = master_switch get_angle_offset_node( getDvarInt( "power_node_forward_size" ), ( 0, getDvarInt( "power_node_angle" ), 0 ), ( 0, 0, getDvarInt( "power_node_vertical_offset" ) ) ); + model thread power_debug(); + } + if ( isDefined( level.chests ) && level.chests.size > 0 ) { level thread watch_magicbox_objectives(); @@ -95,6 +154,25 @@ create_static_objectives() level thread watch_for_downed_players(); } +watch_power_objective( power_switch ) +{ + while ( !isDefined( level.flag ) && !isDefined( level.flag[ "power_on" ] ) ) + { + wait 0.05; + } + players = getPlayers(); + for ( i = 0; i < players.size; i++ ) + { + player = players[ i ]; + if ( player bot_get_objective() == "power" ) + { + player.sucessfully_activated_power = true; + } + } + waittillframeend; + free_bot_objective( "power", power_switch ); +} + watch_door_objectives( zombie_doors ) { level endon( "end_game" ); @@ -189,7 +267,8 @@ watch_magicbox_objectives() cur_magicbox = maps\so\zm_common\_zm_magicbox::get_active_magicbox(); add_possible_bot_objective( "magicbox", cur_magicbox, true ); - cur_magicbox.bot_use_node = get_angle_offset_node( cur_magicbox maps\so\zm_common\_zm_magicbox::get_chest_pieces()[ 1 ], ( 0, 90, 0 ), getDvarInt( "magicbox_node_forward_size" ), ( 0, 0, getDvarInt( "magicbox_node_vertical_offset" ) ) ); + lid = cur_magicbox maps\so\zm_common\_zm_magicbox::get_chest_pieces()[ 1 ]; + cur_magicbox.bot_use_node = lid get_angle_offset_node( getDvarInt( "magicbox_node_forward_size" ), ( 0, getDvarInt( "magicbox_node_angle" ), 0 ), ( 0, 0, getDvarInt( "magicbox_node_vertical_offset" ) ) ); cur_magicbox thread magicbox_debug(); @@ -200,7 +279,8 @@ watch_magicbox_objectives() free_bot_objective( "magicbox", old_magicbox ); level waittill( "new_magicbox", new_magicbox ); add_possible_bot_objective( "magicbox", new_magicbox, true ); - new_magicbox.bot_use_node = get_angle_offset_node( new_magicbox maps\so\zm_common\_zm_magicbox::get_chest_pieces()[ 1 ], ( 0, 90, 0 ), getDvarInt( "magicbox_node_forward_size" ), ( 0, 0, getDvarInt( "magicbox_node_vertical_offset" ) ) ); + lid = new_magicbox maps\so\zm_common\_zm_magicbox::get_chest_pieces()[ 1 ]; + new_magicbox.bot_use_node = lid get_angle_offset_node( getDvarInt( "magicbox_node_forward_size" ), ( 0, getDvarInt( "magicbox_node_angle" ), 0 ), ( 0, 0, getDvarInt( "magicbox_node_vertical_offset" ) ) ); new_magicbox thread magicbox_debug(); } } @@ -216,7 +296,8 @@ magicbox_debug() } while ( true ) { - node = get_angle_offset_node( self maps\so\zm_common\_zm_magicbox::get_chest_pieces()[ 1 ], ( 0, 90, 0 ), getDvarInt( "magicbox_node_forward_size" ), ( 0, 0, getDvarInt( "magicbox_node_vertical_offset" ) ) ); + lid = self maps\so\zm_common\_zm_magicbox::get_chest_pieces()[ 1 ]; + node = lid get_angle_offset_node( getDvarInt( "magicbox_node_forward_size" ), ( 0, getDvarInt( "magicbox_node_angle" ), 0 ), ( 0, 0, getDvarInt( "magicbox_node_vertical_offset" ) ) ); self.bot_use_node = node; line( self.origin, node, ( 1.0, 1.0, 1.0 ) ); wait 0.05; @@ -225,13 +306,13 @@ magicbox_debug() perk_debug() { - if ( getDvarInt( "bot_obj_debug_all" ) == 0 && getDvarInt( "bot_obj_debug_magicbox" ) == 0 ) + if ( getDvarInt( "bot_obj_debug_all" ) == 0 && getDvarInt( "bot_obj_debug_perk" ) == 0 ) { return; } while ( true ) { - node = get_angle_offset_node( self, ( 0, getDvarInt( "perk_node_angle" ), 0 ), getDvarInt( "perk_node_forward_size" ), ( 0, 0, getDvarInt( "perk_node_vertical_offset" ) ) ); + node = self get_angle_offset_node( getDvarInt( "perk_node_forward_size" ), ( 0, getDvarInt( "perk_node_angle" ), 0 ), ( 0, 0, getDvarInt( "perk_node_vertical_offset" ) ) ); self.bot_use_node = node; line( self.origin, node, ( 1.0, 1.0, 1.0 ) ); wait 0.05; @@ -240,19 +321,34 @@ perk_debug() wallbuy_debug() { - if ( getDvarInt( "bot_obj_debug_all" ) == 0 && getDvarInt( "bot_obj_debug_magicbox" ) == 0 ) + if ( getDvarInt( "bot_obj_debug_all" ) == 0 && getDvarInt( "bot_obj_debug_wallbuy" ) == 0 ) { return; } while ( true ) { - node = get_angle_offset_node( self, ( 0, self.angles[ 1 ] - getDvarInt( "wallbuy_node_angle" ), 0 ), getDvarInt( "wallbuy_node_forward_size" ), ( 0, 0, getDvarInt( "wallbuy_node_vertical_offset" ) ) ); + node = self get_angle_offset_node( getDvarInt( "wallbuy_node_forward_size" ), ( 0, getDvarInt( "wallbuy_node_angle" ), 0 ), ( 0, 0, getDvarInt( "wallbuy_node_vertical_offset" ) ) ); self.bot_use_node = node; line( self.origin, node, ( 1.0, 1.0, 1.0 ) ); wait 0.05; } } +packapunch_debug() +{ + if ( getDvarInt( "bot_obj_debug_all" ) == 0 && getDvarInt( "bot_obj_debug_packapunch" ) == 0 ) + { + return; + } + while ( true ) + { + node = self get_angle_offset_node( getDvarInt( "packapunch_node_forward_size" ), ( 0, getDvarInt( "packapunch_node_angle" ), 0 ), ( 0, 0, getDvarInt( "packapunch_node_vertical_offset" ) ) ); + self.bot_use_node = node; + line( self.origin, node, ( 1.0, 1.0, 1.0 ) ); + wait 0.05; + } +} + bot_on_powerup_grab( powerup ) { self bot_objective_print( "powerup", powerup getEntityNumber(), "bot_on_powerup_grab", "Bot <" + self.playername + "> grabbed powerup" ); @@ -267,24 +363,38 @@ bot_on_revive_success( revivee ) bot_on_magicbox_weapon_grab( magicbox, weapon ) { - self bot_objective_print( "magicbox", magicbox getEntityNumber(), "bot_on_magicbox_weapon_grab", "Bot <" + self.playername + "> grabbed <" + weapon + "> from the box" ); + self bot_objective_print( "magicbox", magicbox getEntityNumber(), "bot_on_magicbox_weapon_grab", "Bot <" + self.playername + "> grabbed <" + weapon + "> from the box" ); self.successfully_grabbed_magicbox_weapon = true; + self.last_magicbox_purchase_time = getTime(); } bot_on_perk_purchase( trigger, perk ) { - self bot_objective_print( "perk", trigger getEntityNumber(), "bot_on_perk_purchase", "Bot <" + self.playername + "> purchased <" + perk + ">" ); + self bot_objective_print( "perk", trigger getEntityNumber(), "bot_on_perk_purchase", "Bot <" + self.playername + "> purchased <" + perk + ">" ); self.successfully_bought_perk = true; } bot_on_door_purchase_func( door ) { - self bot_objective_print( "door", door getEntityNumber(), "bot_on_door_purchase_func", "Bot <" + self.playername + "> purchased door" ); + self bot_objective_print( "door", door getEntityNumber(), "bot_on_door_purchase_func", "Bot <" + self.playername + "> purchased door" ); self.successfully_bought_door = true; } -bot_on_debris_purchase_func( debris, entnum ) +bot_on_debris_purchase_func( debris ) { - self bot_objective_print( "debris", debris getEntityNumber(), "bot_on_debris_purchase_func", "Bot <" + self.playername + "> purchased debris" ); + self bot_objective_print( "debris", debris getEntityNumber(), "bot_on_debris_purchase_func", "Bot <" + self.playername + "> purchased debris" ); self.successfully_bought_debris = true; +} + +bot_on_wallbuy_purchase_func( trigger, weapon ) +{ + self bot_objective_print( "wallbuy", trigger getEntityNumber(), "bot_on_wallbuy_purchase_func", "Bot <" + self.playername + "> purchased wallbuy <" + weapon + ">" ); + self.successfully_bought_wallbuy = true; + self.last_wallbuy_purchase_time = getTime(); +} + +bot_on_wallbuy_ammo_purchase_func( trigger, weapon ) +{ + self bot_objective_print( "wallbuyammo", trigger getEntityNumber(), "bot_on_wallbuy_ammo_purchase_func", "Bot <" + self.playername + "> purchased wallbuy ammo <" + weapon + ">" ); + self.successfully_bought_wallbuy_ammo = true; } \ No newline at end of file