Progress 3.

This commit is contained in:
JezuzLizard 2023-07-11 21:00:28 -07:00
parent 81094096cb
commit 280ec4c318
6 changed files with 315 additions and 33 deletions

View File

@ -1768,8 +1768,13 @@ initAStar( goal )
if ( !isDefined( nodes ) ) if ( !isDefined( nodes ) )
{ {
self.bot.astar = []; //Try again to find a path to the origin using best effort algo
return -1; nodes = generatePath( self.origin, goal, self.team, level.bot_allowed_negotiation_links, 192.0 );
if ( !isDefined( nodes ) )
{
self.bot.astar = [];
return -1;
}
} }
node_indexes = []; node_indexes = [];

View File

@ -316,10 +316,17 @@ ClearPriorityObjective()
/* /*
Checks whether the path generated by the ASTAR path finding is inaccessible 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 ); if ( isDefined( best_effort ) )
return !isDefined( path ) || path.size <= 0; {
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) ;
} }
/* /*

View File

@ -25,6 +25,7 @@ bot_post_think_common( state )
bot_obj_timeout( objective_group, time ) bot_obj_timeout( objective_group, time )
{ {
self endon( objective_group + "_end_think" );
wait time; wait time;
self.obj_cancel_reason = "Obj timeout"; self.obj_cancel_reason = "Obj timeout";
self notify( objective_group + "_cancel" ); self notify( objective_group + "_cancel" );
@ -434,6 +435,11 @@ bot_should_purchase_magicbox()
{ {
obj = magicbox_objs[ magicbox_objs_keys[ i ] ]; obj = magicbox_objs[ magicbox_objs_keys[ i ] ];
magicbox = obj.target_ent; 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 ) 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" ); 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" ); 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; 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" ); 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; 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" ); 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; 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" ); 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; continue;
@ -899,6 +905,11 @@ bot_should_purchase_wallbuy()
obj = wallbuy_objs[ wallbuy_objs_keys[ i ] ]; obj = wallbuy_objs[ wallbuy_objs_keys[ i ] ];
wallbuy_ent = obj.target_ent; wallbuy_ent = obj.target_ent;
weapon = wallbuy_ent.zombie_weapon_upgrade; 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 ) ) 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" ); 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" ); 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; 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 ) ) 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" ); 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; packapunch_ent = obj.target_ent;
if ( self.score < level._custom_packapunch.cost ) 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; 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; continue;
} }
self.available_packapunchs[ self.available_packapunchs.size ] = obj; self.available_packapunchs[ self.available_packapunchs.size ] = obj;
@ -1144,7 +1160,6 @@ bot_packapunch_purchase_should_cancel()
obj = self bot_get_objective(); obj = self bot_get_objective();
goal_canceled = false; goal_canceled = false;
perk = obj.target_ent.script_noteworthy;
if ( isDefined( obj.target_ent.packapunch_weapon_spawn_time ) if ( isDefined( obj.target_ent.packapunch_weapon_spawn_time )
&& isDefined( obj.target_ent.packapunch_user ) && isDefined( obj.target_ent.packapunch_user )
&& obj.target_ent.packapunch_user == self && obj.target_ent.packapunch_user == self
@ -1157,6 +1172,103 @@ bot_packapunch_purchase_should_cancel()
} }
bot_packapunch_purchase_priority() 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; return 0;
} }

View File

@ -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; 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 ]; self.bot_action = possible_actions.data[ 0 ];
printConsole( self.playername + " Picking action " + self.bot_action.action_name + " Priority " + self.bot_action.priority ); printConsole( self.playername + " Picking action " + self.bot_action.action_name + " Priority " + self.bot_action.priority );
return true; return true;
@ -577,13 +598,25 @@ action_should_be_canceled_global( action_name )
return goal_canceled; 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 += angle_offset;
angles = ( 0, AngleClamp180( angles[ 1 ] ), 0 ); node = self.origin + ( AnglesToForward( angles ) * forward_size ) + offset;
node = ent.origin + ( AnglesToForward( angles ) * forward_size ); node = clamp_to_ground( node );
node = clamp_to_ground( node ) + offset;
return node; return node;
} }

View File

@ -7,8 +7,6 @@
init() init()
{ {
//maps\bots\script_objectives\_obj_common;
//maps\bots\script_objectives\_obj_actions;
register_bot_action( "powerup", register_bot_action( "powerup",
::bot_grab_powerup, ::bot_grab_powerup,
::bot_powerup_init, ::bot_powerup_init,
@ -90,6 +88,15 @@ init()
::bot_packapunch_purchase_should_cancel, ::bot_packapunch_purchase_should_cancel,
::bot_packapunch_purchase_priority ); ::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( "magicbox" );
register_bot_objective( "wallbuy" ); register_bot_objective( "wallbuy" );
register_bot_objective( "wallbuyammo" ); register_bot_objective( "wallbuyammo" );
@ -98,12 +105,18 @@ init()
register_bot_objective( "debris" ); register_bot_objective( "debris" );
register_bot_objective( "trap" ); register_bot_objective( "trap" );
register_bot_objective( "packapunch" ); register_bot_objective( "packapunch" );
register_bot_objective( "power" );
register_bot_objective( "revive" ); register_bot_objective( "revive" );
//register_bot_objective( "grabbuildable" ); //register_bot_objective( "grabbuildable" );
//register_bot_objective( "buildbuildable" ); //register_bot_objective( "buildbuildable" );
//register_bot_objective( "part" ); //register_bot_objective( "part" );
register_bot_objective( "powerup" ); register_bot_objective( "powerup" );
if ( getDvar( "bots_obj_buy_blockers" ) == "" )
{
setDvar( "bots_obj_buy_blockers", true );
}
create_static_objectives(); create_static_objectives();
} }
@ -117,6 +130,8 @@ connected()
self.on_perk_purchase_func = ::bot_on_perk_purchase; self.on_perk_purchase_func = ::bot_on_perk_purchase;
self.on_door_purchase_func = ::bot_on_door_purchase_func; self.on_door_purchase_func = ::bot_on_door_purchase_func;
self.on_debris_purchase_func = ::bot_on_debris_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 = ""; self.obj_cancel_reason = "";

View File

@ -13,6 +13,10 @@ create_static_objectives()
{ {
setDvar( "magicbox_node_vertical_offset", 10 ); setDvar( "magicbox_node_vertical_offset", 10 );
} }
if ( getDvar( "magicbox_node_angle" ) == "" )
{
setDvar( "magicbox_node_angle", 90 );
}
if ( getDvar( "perk_node_forward_size" ) == "" ) if ( getDvar( "perk_node_forward_size" ) == "" )
{ {
setDvar( "perk_node_forward_size", 55 ); setDvar( "perk_node_forward_size", 55 );
@ -21,6 +25,46 @@ create_static_objectives()
{ {
setDvar( "perk_node_vertical_offset", 1 ); 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" ); weapon_spawns = GetEntArray( "weapon_upgrade", "targetname" );
if ( isDefined( weapon_spawns ) && weapon_spawns.size > 0 ) 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( "wallbuy", weapon_spawns[ i ], false );
obj = add_possible_bot_objective( "wallbuyammo", weapon_spawns[ i ], false ); obj = add_possible_bot_objective( "wallbuyammo", weapon_spawns[ i ], false );
model = getEnt( weapon_spawns[ i ].target, "targetname" ); 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(); model thread wallbuy_debug();
} }
} }
@ -43,7 +87,7 @@ create_static_objectives()
{ {
obj = add_possible_bot_objective( "perk", vending_triggers[ i ], false ); obj = add_possible_bot_objective( "perk", vending_triggers[ i ], false );
model = getEnt( vending_triggers[ i ].target, "targetname" ); 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(); model thread perk_debug();
} }
} }
@ -82,9 +126,24 @@ create_static_objectives()
for ( i = 0; i < vending_upgrade_trigger.size; i++ ) for ( i = 0; i < vending_upgrade_trigger.size; i++ )
{ {
obj = add_possible_bot_objective( "packapunch", vending_upgrade_trigger[ i ], false ); 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 ) if ( isDefined( level.chests ) && level.chests.size > 0 )
{ {
level thread watch_magicbox_objectives(); level thread watch_magicbox_objectives();
@ -95,6 +154,25 @@ create_static_objectives()
level thread watch_for_downed_players(); 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 ) watch_door_objectives( zombie_doors )
{ {
level endon( "end_game" ); level endon( "end_game" );
@ -189,7 +267,8 @@ watch_magicbox_objectives()
cur_magicbox = maps\so\zm_common\_zm_magicbox::get_active_magicbox(); cur_magicbox = maps\so\zm_common\_zm_magicbox::get_active_magicbox();
add_possible_bot_objective( "magicbox", cur_magicbox, true ); 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(); cur_magicbox thread magicbox_debug();
@ -200,7 +279,8 @@ watch_magicbox_objectives()
free_bot_objective( "magicbox", old_magicbox ); free_bot_objective( "magicbox", old_magicbox );
level waittill( "new_magicbox", new_magicbox ); level waittill( "new_magicbox", new_magicbox );
add_possible_bot_objective( "magicbox", new_magicbox, true ); 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(); new_magicbox thread magicbox_debug();
} }
} }
@ -216,7 +296,8 @@ magicbox_debug()
} }
while ( true ) 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; self.bot_use_node = node;
line( self.origin, node, ( 1.0, 1.0, 1.0 ) ); line( self.origin, node, ( 1.0, 1.0, 1.0 ) );
wait 0.05; wait 0.05;
@ -225,13 +306,13 @@ magicbox_debug()
perk_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; return;
} }
while ( true ) 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; self.bot_use_node = node;
line( self.origin, node, ( 1.0, 1.0, 1.0 ) ); line( self.origin, node, ( 1.0, 1.0, 1.0 ) );
wait 0.05; wait 0.05;
@ -240,19 +321,34 @@ perk_debug()
wallbuy_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; return;
} }
while ( true ) 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; self.bot_use_node = node;
line( self.origin, node, ( 1.0, 1.0, 1.0 ) ); line( self.origin, node, ( 1.0, 1.0, 1.0 ) );
wait 0.05; 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 ) bot_on_powerup_grab( powerup )
{ {
self bot_objective_print( "powerup", powerup getEntityNumber(), "bot_on_powerup_grab", "Bot <" + self.playername + "> grabbed 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 ) 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.successfully_grabbed_magicbox_weapon = true;
self.last_magicbox_purchase_time = getTime();
} }
bot_on_perk_purchase( trigger, perk ) 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; self.successfully_bought_perk = true;
} }
bot_on_door_purchase_func( door ) 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; 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; 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;
} }