This commit is contained in:
ineed bots 2024-01-04 16:02:38 -06:00
parent 18abf5e007
commit dd1ea5ca07
14 changed files with 1051 additions and 1045 deletions

View File

@ -1,21 +1,27 @@
# try to mimic the original gsc provided # try to mimic the original gsc provided
# mode=ghc
mode=c mode=c
style=allman style=allman
indent=tab indent=force-tab=2
lineend=windows lineend=windows
pad-oper pad-oper
pad-paren-in pad-paren-in
pad-header pad-header
# pad-brackets-in
# delete-empty-lines fill-empty-lines
squeeze-lines=2
squeeze-ws
break-one-line-headers
add-braces
remove-comment-prefix
break-blocks break-blocks
# remove-braces
indent-switches indent-switches
indent-cases indent-cases
indent-after-parens indent-after-parens
indent-col1-comments
remove-comment-prefix remove-comment-prefix

View File

@ -4,7 +4,7 @@ root = true
indent_style = tab indent_style = tab
indent_size = 2 indent_size = 2
charset = latin1 charset = latin1
trim_trailing_whitespace = true trim_trailing_whitespace = false
insert_final_newline = true insert_final_newline = true
[*.md] [*.md]

View File

@ -8,135 +8,135 @@
init() init()
{ {
level.bw_version = "z0.1"; level.bw_version = "z0.1";
if ( getdvar( "bots_main" ) == "" ) if ( getdvar( "bots_main" ) == "" )
{ {
setdvar( "bots_main", true ); setdvar( "bots_main", true );
} }
if ( !getdvarint( "bots_main" ) ) if ( !getdvarint( "bots_main" ) )
{ {
return; return;
} }
if ( !wait_for_builtins() ) if ( !wait_for_builtins() )
{ {
println( "FATAL: NO BUILT-INS FOR BOTS" ); println( "FATAL: NO BUILT-INS FOR BOTS" );
} }
thread load_waypoints(); thread load_waypoints();
thread hook_callbacks(); thread hook_callbacks();
if ( getdvar( "bots_main_GUIDs" ) == "" ) if ( getdvar( "bots_main_GUIDs" ) == "" )
{ {
setdvar( "bots_main_GUIDs", "" ); // guids of players who will be given host powers, comma seperated setdvar( "bots_main_GUIDs", "" ); // guids of players who will be given host powers, comma seperated
} }
if ( getdvar( "bots_main_firstIsHost" ) == "" ) if ( getdvar( "bots_main_firstIsHost" ) == "" )
{ {
setdvar( "bots_main_firstIsHost", false ); // first player to connect is a host setdvar( "bots_main_firstIsHost", false ); // first player to connect is a host
} }
if ( getdvar( "bots_main_waitForHostTime" ) == "" ) if ( getdvar( "bots_main_waitForHostTime" ) == "" )
{ {
setdvar( "bots_main_waitForHostTime", 10.0 ); // how long to wait to wait for the host player setdvar( "bots_main_waitForHostTime", 10.0 ); // how long to wait to wait for the host player
} }
if ( getdvar( "bots_main_kickBotsAtEnd" ) == "" ) if ( getdvar( "bots_main_kickBotsAtEnd" ) == "" )
{ {
setdvar( "bots_main_kickBotsAtEnd", false ); // kicks the bots at game end setdvar( "bots_main_kickBotsAtEnd", false ); // kicks the bots at game end
} }
if ( getdvar( "bots_manage_add" ) == "" ) if ( getdvar( "bots_manage_add" ) == "" )
{ {
setdvar( "bots_manage_add", 0 ); // amount of bots to add to the game setdvar( "bots_manage_add", 0 ); // amount of bots to add to the game
} }
if ( getdvar( "bots_manage_fill" ) == "" ) if ( getdvar( "bots_manage_fill" ) == "" )
{ {
setdvar( "bots_manage_fill", 0 ); // amount of bots to maintain setdvar( "bots_manage_fill", 0 ); // amount of bots to maintain
} }
if ( getdvar( "bots_manage_fill_mode" ) == "" ) if ( getdvar( "bots_manage_fill_mode" ) == "" )
{ {
setdvar( "bots_manage_fill_mode", 0 ); // fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 setdvar( "bots_manage_fill_mode", 0 ); // fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1
} }
if ( getdvar( "bots_manage_fill_kick" ) == "" ) if ( getdvar( "bots_manage_fill_kick" ) == "" )
{ {
setdvar( "bots_manage_fill_kick", false ); // kick bots if too many setdvar( "bots_manage_fill_kick", false ); // kick bots if too many
} }
if ( getdvar( "bots_skill" ) == "" ) if ( getdvar( "bots_skill" ) == "" )
{ {
setdvar( "bots_skill", 0 ); // 0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random setdvar( "bots_skill", 0 ); // 0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random
} }
if ( getdvar( "bots_skill_hard" ) == "" ) if ( getdvar( "bots_skill_hard" ) == "" )
{ {
setdvar( "bots_skill_hard", 0 ); // amount of hard bots on axis team setdvar( "bots_skill_hard", 0 ); // amount of hard bots on axis team
} }
if ( getdvar( "bots_skill_med" ) == "" ) if ( getdvar( "bots_skill_med" ) == "" )
{ {
setdvar( "bots_skill_med", 0 ); setdvar( "bots_skill_med", 0 );
} }
if ( getdvar( "bots_loadout_rank" ) == "" ) // what rank the bots should be around, -1 is around the players, 0 is all random if ( getdvar( "bots_loadout_rank" ) == "" ) // what rank the bots should be around, -1 is around the players, 0 is all random
{ {
setdvar( "bots_loadout_rank", -1 ); setdvar( "bots_loadout_rank", -1 );
} }
if ( getdvar( "bots_loadout_prestige" ) == "" ) // what pretige the bots will be, -1 is the players, -2 is random if ( getdvar( "bots_loadout_prestige" ) == "" ) // what pretige the bots will be, -1 is the players, -2 is random
{ {
setdvar( "bots_loadout_prestige", -1 ); setdvar( "bots_loadout_prestige", -1 );
} }
if ( getdvar( "bots_play_move" ) == "" ) // bots move if ( getdvar( "bots_play_move" ) == "" ) // bots move
{ {
setdvar( "bots_play_move", true ); setdvar( "bots_play_move", true );
} }
if ( getdvar( "bots_play_knife" ) == "" ) // bots knife if ( getdvar( "bots_play_knife" ) == "" ) // bots knife
{ {
setdvar( "bots_play_knife", true ); setdvar( "bots_play_knife", true );
} }
if ( getdvar( "bots_play_fire" ) == "" ) // bots fire if ( getdvar( "bots_play_fire" ) == "" ) // bots fire
{ {
setdvar( "bots_play_fire", true ); setdvar( "bots_play_fire", true );
} }
if ( getdvar( "bots_play_nade" ) == "" ) // bots grenade if ( getdvar( "bots_play_nade" ) == "" ) // bots grenade
{ {
setdvar( "bots_play_nade", true ); setdvar( "bots_play_nade", true );
} }
if ( getdvar( "bots_play_ads" ) == "" ) // bot ads if ( getdvar( "bots_play_ads" ) == "" ) // bot ads
{ {
setdvar( "bots_play_ads", true ); setdvar( "bots_play_ads", true );
} }
if ( getdvar( "bots_play_aim" ) == "" ) if ( getdvar( "bots_play_aim" ) == "" )
{ {
setdvar( "bots_play_aim", true ); setdvar( "bots_play_aim", true );
} }
if ( getdvar( "bots_t8_mode" ) == "" ) if ( getdvar( "bots_t8_mode" ) == "" )
{ {
setdvar( "bots_t8_mode", false ); setdvar( "bots_t8_mode", false );
} }
if ( getdvar( "bots_play_opendoors" ) == "" ) if ( getdvar( "bots_play_opendoors" ) == "" )
{ {
setdvar( "bots_play_opendoors", true ); setdvar( "bots_play_opendoors", true );
} }
if ( !isdefined( game[ "botWarfare" ] ) ) if ( !isdefined( game[ "botWarfare" ] ) )
{ {
game[ "botWarfare" ] = true; game[ "botWarfare" ] = true;
} }
level.bots_minsprintdistance = 315; level.bots_minsprintdistance = 315;
level.bots_minsprintdistance *= level.bots_minsprintdistance; level.bots_minsprintdistance *= level.bots_minsprintdistance;
level.bots_mingrenadedistance = 256; level.bots_mingrenadedistance = 256;
@ -151,10 +151,10 @@ init()
level.bots_noadsdistance *= level.bots_noadsdistance; level.bots_noadsdistance *= level.bots_noadsdistance;
level.bots_maxshotgundistance = 500; level.bots_maxshotgundistance = 500;
level.bots_maxshotgundistance *= level.bots_maxshotgundistance; level.bots_maxshotgundistance *= level.bots_maxshotgundistance;
level.players = []; level.players = [];
level.bots = []; level.bots = [];
level.bots_fullautoguns = []; level.bots_fullautoguns = [];
level.bots_fullautoguns[ "thompson" ] = true; level.bots_fullautoguns[ "thompson" ] = true;
level.bots_fullautoguns[ "mp40" ] = true; level.bots_fullautoguns[ "mp40" ] = true;
@ -167,10 +167,10 @@ init()
level.bots_fullautoguns[ "bar" ] = true; level.bots_fullautoguns[ "bar" ] = true;
level.bots_fullautoguns[ "fg42" ] = true; level.bots_fullautoguns[ "fg42" ] = true;
level.bots_fullautoguns[ "type99lmg" ] = true; level.bots_fullautoguns[ "type99lmg" ] = true;
level thread onPlayerConnect(); level thread onPlayerConnect();
level thread handleBots(); level thread handleBots();
level thread maps\bots\_bot_script::bot_script_init(); level thread maps\bots\_bot_script::bot_script_init();
} }
@ -181,21 +181,21 @@ handleBots()
{ {
level thread diffBots(); level thread diffBots();
level addBots(); level addBots();
while ( !isdefined( level.intermission ) || !level.intermission ) while ( !isdefined( level.intermission ) || !level.intermission )
{ {
wait 0.05; wait 0.05;
} }
setdvar( "bots_manage_add", getBotArray().size ); setdvar( "bots_manage_add", getBotArray().size );
if ( !getdvarint( "bots_main_kickBotsAtEnd" ) ) if ( !getdvarint( "bots_main_kickBotsAtEnd" ) )
{ {
return; return;
} }
bots = getBotArray(); bots = getBotArray();
for ( i = 0; i < bots.size; i++ ) for ( i = 0; i < bots.size; i++ )
{ {
BotBuiltinCmdExec( "clientkick " + bots[ i ] getentitynumber() ); BotBuiltinCmdExec( "clientkick " + bots[ i ] getentitynumber() );
@ -218,13 +218,13 @@ onPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon,
iDamage = int( iDamage * 0.1 ); iDamage = int( iDamage * 0.1 );
} }
} }
if ( self is_bot() ) if ( self is_bot() )
{ {
self maps\bots\_bot_internal::onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); self maps\bots\_bot_internal::onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
self maps\bots\_bot_script::onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); self maps\bots\_bot_script::onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
} }
self [[ level.prevcallbackplayerdamage ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); self [[ level.prevcallbackplayerdamage ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
} }
@ -234,7 +234,7 @@ onActorDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon,
{ {
iDamage += int( self.maxhealth * randomfloatrange( 0.25, 1.25 ) ); iDamage += int( self.maxhealth * randomfloatrange( 0.25, 1.25 ) );
} }
self [[ level.prevcallbackactordamage ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, iModelIndex, iTimeOffset ); self [[ level.prevcallbackactordamage ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, iModelIndex, iTimeOffset );
} }
@ -246,7 +246,7 @@ hook_callbacks()
wait 0.05; wait 0.05;
level.prevcallbackplayerdamage = level.callbackplayerdamage; level.prevcallbackplayerdamage = level.callbackplayerdamage;
level.callbackplayerdamage = ::onPlayerDamage; level.callbackplayerdamage = ::onPlayerDamage;
level.prevcallbackactordamage = level.callbackactordamage; level.prevcallbackactordamage = level.callbackactordamage;
level.callbackactordamage = ::onActorDamage; level.callbackactordamage = ::onActorDamage;
} }
@ -259,7 +259,7 @@ onPlayerConnect()
for ( ;; ) for ( ;; )
{ {
level waittill( "connected", player ); level waittill( "connected", player );
player thread connected(); player thread connected();
} }
} }
@ -270,7 +270,7 @@ onPlayerConnect()
onDisconnectAll() onDisconnectAll()
{ {
self waittill( "disconnect" ); self waittill( "disconnect" );
level.players = array_remove( level.players, self ); level.players = array_remove( level.players, self );
} }
@ -280,13 +280,13 @@ onDisconnectAll()
onSpawnedAll() onSpawnedAll()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; ) for ( ;; )
{ {
self waittill( "spawned_player" ); self waittill( "spawned_player" );
self.lastspawntime = gettime(); self.lastspawntime = gettime();
if ( getdvarint( "bots_main_debug" ) ) if ( getdvarint( "bots_main_debug" ) )
{ {
self.score = 100000; self.score = 100000;
@ -300,7 +300,7 @@ onSpawnedAll()
onDisconnect() onDisconnect()
{ {
self waittill( "disconnect" ); self waittill( "disconnect" );
level.bots = array_remove( level.bots, self ); level.bots = array_remove( level.bots, self );
} }
@ -310,42 +310,42 @@ onDisconnect()
connected() connected()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
if ( !isdefined( self.pers[ "bot_host" ] ) ) if ( !isdefined( self.pers[ "bot_host" ] ) )
{ {
self thread doHostCheck(); self thread doHostCheck();
} }
level.players[ level.players.size ] = self; level.players[ level.players.size ] = self;
self thread onDisconnectAll(); self thread onDisconnectAll();
self thread onSpawnedAll(); self thread onSpawnedAll();
if ( !self is_bot() ) if ( !self is_bot() )
{ {
return; return;
} }
if ( !isdefined( self.pers[ "isBot" ] ) ) if ( !isdefined( self.pers[ "isBot" ] ) )
{ {
// fast restart... // fast restart...
self.pers[ "isBot" ] = true; self.pers[ "isBot" ] = true;
} }
if ( !isdefined( self.pers[ "isBotWarfare" ] ) ) if ( !isdefined( self.pers[ "isBotWarfare" ] ) )
{ {
self.pers[ "isBotWarfare" ] = true; self.pers[ "isBotWarfare" ] = true;
self thread added(); self thread added();
} }
self thread maps\bots\_bot_internal::connected(); self thread maps\bots\_bot_internal::connected();
self thread maps\bots\_bot_script::connected(); self thread maps\bots\_bot_script::connected();
level.bots[ level.bots.size ] = self; level.bots[ level.bots.size ] = self;
self thread onDisconnect(); self thread onDisconnect();
level notify( "bot_connected", self ); level notify( "bot_connected", self );
self thread watchBotDebugEvent(); self thread watchBotDebugEvent();
} }
@ -355,50 +355,50 @@ connected()
watchBotDebugEvent() watchBotDebugEvent()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; ) for ( ;; )
{ {
self waittill( "bot_event", msg, str, b, c, d, e, f, g ); self waittill( "bot_event", msg, str, b, c, d, e, f, g );
if ( getdvarint( "bots_main_debug" ) >= 2 ) if ( getdvarint( "bots_main_debug" ) >= 2 )
{ {
big_str = "Bot Warfare debug: " + self.playername + ": " + msg; big_str = "Bot Warfare debug: " + self.playername + ": " + msg;
if ( isdefined( str ) && isstring( str ) ) if ( isdefined( str ) && isstring( str ) )
{ {
big_str += ", " + str; big_str += ", " + str;
} }
if ( isdefined( b ) && isstring( b ) ) if ( isdefined( b ) && isstring( b ) )
{ {
big_str += ", " + b; big_str += ", " + b;
} }
if ( isdefined( c ) && isstring( c ) ) if ( isdefined( c ) && isstring( c ) )
{ {
big_str += ", " + c; big_str += ", " + c;
} }
if ( isdefined( d ) && isstring( d ) ) if ( isdefined( d ) && isstring( d ) )
{ {
big_str += ", " + d; big_str += ", " + d;
} }
if ( isdefined( e ) && isstring( e ) ) if ( isdefined( e ) && isstring( e ) )
{ {
big_str += ", " + e; big_str += ", " + e;
} }
if ( isdefined( f ) && isstring( f ) ) if ( isdefined( f ) && isstring( f ) )
{ {
big_str += ", " + f; big_str += ", " + f;
} }
if ( isdefined( g ) && isstring( g ) ) if ( isdefined( g ) && isstring( g ) )
{ {
big_str += ", " + g; big_str += ", " + g;
} }
BotBuiltinPrintConsole( big_str ); BotBuiltinPrintConsole( big_str );
} }
else if ( msg == "debug" && getdvarint( "bots_main_debug" ) ) else if ( msg == "debug" && getdvarint( "bots_main_debug" ) )
@ -414,7 +414,7 @@ watchBotDebugEvent()
added() added()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self thread maps\bots\_bot_internal::added(); self thread maps\bots\_bot_internal::added();
self thread maps\bots\_bot_script::added(); self thread maps\bots\_bot_script::added();
} }
@ -425,7 +425,7 @@ added()
add_bot() add_bot()
{ {
bot = BotBuiltinAddTestClient(); bot = BotBuiltinAddTestClient();
if ( isdefined( bot ) ) if ( isdefined( bot ) )
{ {
bot.pers[ "isBot" ] = true; bot.pers[ "isBot" ] = true;
@ -442,28 +442,28 @@ diffBots_loop()
var_hard = getdvarint( "bots_skill_hard" ); var_hard = getdvarint( "bots_skill_hard" );
var_med = getdvarint( "bots_skill_med" ); var_med = getdvarint( "bots_skill_med" );
var_skill = getdvarint( "bots_skill" ); var_skill = getdvarint( "bots_skill" );
hard = 0; hard = 0;
med = 0; med = 0;
if ( var_skill == 8 ) if ( var_skill == 8 )
{ {
playercount = level.players.size; playercount = level.players.size;
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[ i ]; player = level.players[ i ];
if ( !isdefined( player.pers[ "team" ] ) ) if ( !isdefined( player.pers[ "team" ] ) )
{ {
continue; continue;
} }
if ( !player is_bot() ) if ( !player is_bot() )
{ {
continue; continue;
} }
if ( hard < var_hard ) if ( hard < var_hard )
{ {
hard++; hard++;
@ -483,16 +483,16 @@ diffBots_loop()
else if ( var_skill != 0 && var_skill != 9 ) else if ( var_skill != 0 && var_skill != 9 )
{ {
playercount = level.players.size; playercount = level.players.size;
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[ i ]; player = level.players[ i ];
if ( !player is_bot() ) if ( !player is_bot() )
{ {
continue; continue;
} }
player.pers[ "bots" ][ "skill" ][ "base" ] = var_skill; player.pers[ "bots" ][ "skill" ][ "base" ] = var_skill;
} }
} }
@ -506,7 +506,7 @@ diffBots()
for ( ;; ) for ( ;; )
{ {
wait 1.5; wait 1.5;
diffBots_loop(); diffBots_loop();
} }
} }
@ -517,41 +517,41 @@ diffBots()
addBots_loop() addBots_loop()
{ {
botsToAdd = getdvarint( "bots_manage_add" ); botsToAdd = getdvarint( "bots_manage_add" );
if ( botsToAdd > 0 ) if ( botsToAdd > 0 )
{ {
setdvar( "bots_manage_add", 0 ); setdvar( "bots_manage_add", 0 );
if ( botsToAdd > 4 ) if ( botsToAdd > 4 )
{ {
botsToAdd = 4; botsToAdd = 4;
} }
for ( ; botsToAdd > 0; botsToAdd-- ) for ( ; botsToAdd > 0; botsToAdd-- )
{ {
level add_bot(); level add_bot();
wait 0.25; wait 0.25;
} }
} }
fillMode = getdvarint( "bots_manage_fill_mode" ); fillMode = getdvarint( "bots_manage_fill_mode" );
if ( fillMode == 2 || fillMode == 3 ) if ( fillMode == 2 || fillMode == 3 )
{ {
setdvar( "bots_manage_fill", getGoodMapAmount() ); setdvar( "bots_manage_fill", getGoodMapAmount() );
} }
fillAmount = getdvarint( "bots_manage_fill" ); fillAmount = getdvarint( "bots_manage_fill" );
players = 0; players = 0;
bots = 0; bots = 0;
playercount = level.players.size; playercount = level.players.size;
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[ i ]; player = level.players[ i ];
if ( player is_bot() ) if ( player is_bot() )
{ {
bots++; bots++;
@ -561,14 +561,14 @@ addBots_loop()
players++; players++;
} }
} }
amount = bots; amount = bots;
if ( fillMode == 0 || fillMode == 2 ) if ( fillMode == 0 || fillMode == 2 )
{ {
amount += players; amount += players;
} }
if ( amount < fillAmount ) if ( amount < fillAmount )
{ {
setdvar( "bots_manage_add", 1 ); setdvar( "bots_manage_add", 1 );
@ -576,7 +576,7 @@ addBots_loop()
else if ( amount > fillAmount && getdvarint( "bots_manage_fill_kick" ) ) else if ( amount > fillAmount && getdvarint( "bots_manage_fill_kick" ) )
{ {
tempBot = getBotToKick(); tempBot = getBotToKick();
if ( isdefined( tempBot ) ) if ( isdefined( tempBot ) )
{ {
BotBuiltinCmdExec( "clientkick " + tempBot getentitynumber() ); BotBuiltinCmdExec( "clientkick " + tempBot getentitynumber() );
@ -590,13 +590,13 @@ addBots_loop()
addBots() addBots()
{ {
level endon( "game_ended" ); level endon( "game_ended" );
bot_wait_for_host(); bot_wait_for_host();
while ( !isdefined( level.intermission ) || !level.intermission ) while ( !isdefined( level.intermission ) || !level.intermission )
{ {
wait 1.5; wait 1.5;
addBots_loop(); addBots_loop();
} }
} }

View File

@ -16,22 +16,22 @@ init()
{ {
setdvar( "bots_main_debug", 0 ); setdvar( "bots_main_debug", 0 );
} }
if ( !getdvarint( "bots_main_debug" ) || !getdvarint( "bots_main_debug_wp_vis" ) ) if ( !getdvarint( "bots_main_debug" ) || !getdvarint( "bots_main_debug_wp_vis" ) )
{ {
return; return;
} }
if ( !getdvarint( "developer" ) ) if ( !getdvarint( "developer" ) )
{ {
setdvar( "developer_script", 1 ); setdvar( "developer_script", 1 );
setdvar( "developer", 2 ); setdvar( "developer", 2 );
setdvar( "sv_mapRotation", "map " + getdvar( "mapname" ) ); setdvar( "sv_mapRotation", "map " + getdvar( "mapname" ) );
exitlevel( false ); exitlevel( false );
return; return;
} }
setdvar( "bots_main", false ); setdvar( "bots_main", false );
setdvar( "bots_main_menu", false ); setdvar( "bots_main_menu", false );
setdvar( "bots_manage_fill_mode", 0 ); setdvar( "bots_manage_fill_mode", 0 );
@ -39,29 +39,29 @@ init()
setdvar( "bots_manage_add", 0 ); setdvar( "bots_manage_add", 0 );
setdvar( "bots_manage_fill_kick", true ); setdvar( "bots_manage_fill_kick", true );
setdvar( "bots_manage_fill_spec", true ); setdvar( "bots_manage_fill_spec", true );
if ( getdvar( "bots_main_debug_distance" ) == "" ) if ( getdvar( "bots_main_debug_distance" ) == "" )
{ {
setdvar( "bots_main_debug_distance", 512.0 ); setdvar( "bots_main_debug_distance", 512.0 );
} }
if ( getdvar( "bots_main_debug_cone" ) == "" ) if ( getdvar( "bots_main_debug_cone" ) == "" )
{ {
setdvar( "bots_main_debug_cone", 0.65 ); setdvar( "bots_main_debug_cone", 0.65 );
} }
if ( getdvar( "bots_main_debug_minDist" ) == "" ) if ( getdvar( "bots_main_debug_minDist" ) == "" )
{ {
setdvar( "bots_main_debug_minDist", 32.0 ); setdvar( "bots_main_debug_minDist", 32.0 );
} }
if ( getdvar( "bots_main_debug_drawThrough" ) == "" ) if ( getdvar( "bots_main_debug_drawThrough" ) == "" )
{ {
setdvar( "bots_main_debug_drawThrough", false ); setdvar( "bots_main_debug_drawThrough", false );
} }
thread load_waypoints(); thread load_waypoints();
level waittill( "connected", player ); level waittill( "connected", player );
player thread onPlayerSpawned(); player thread onPlayerSpawned();
} }
@ -69,7 +69,7 @@ init()
onPlayerSpawned() onPlayerSpawned()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; ) for ( ;; )
{ {
self waittill( "spawned_player" ); self waittill( "spawned_player" );
@ -81,7 +81,7 @@ beginDebug()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
self thread debug(); self thread debug();
self thread watch_for_unlink(); self thread watch_for_unlink();
self thread textScroll( "^1xDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD" ); self thread textScroll( "^1xDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD" );
@ -91,31 +91,31 @@ watch_for_unlink()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
self BotBuiltinNotifyOnPlayerCommand( "+smoke", "toggle_unlink" ); self BotBuiltinNotifyOnPlayerCommand( "+smoke", "toggle_unlink" );
for ( ;; ) for ( ;; )
{ {
self waittill( "toggle_unlink" ); self waittill( "toggle_unlink" );
if ( self.closest == -1 ) if ( self.closest == -1 )
{ {
self iprintln( "not close to node" ); self iprintln( "not close to node" );
continue; continue;
} }
firstwp = level.waypoints[ self.closest ]; firstwp = level.waypoints[ self.closest ];
self iprintln( "wp selected for unlink: " + firstwp BotBuiltinGetNodeNumber() ); self iprintln( "wp selected for unlink: " + firstwp BotBuiltinGetNodeNumber() );
self waittill( "toggle_unlink" ); self waittill( "toggle_unlink" );
if ( self.closest == -1 ) if ( self.closest == -1 )
{ {
self iprintln( "not close to node" ); self iprintln( "not close to node" );
continue; continue;
} }
self toggle_link( firstwp, level.waypoints[ self.closest ] ); self toggle_link( firstwp, level.waypoints[ self.closest ] );
} }
} }
@ -129,7 +129,7 @@ array_contains( arr, it )
return true; return true;
} }
} }
return false; return false;
} }
@ -138,10 +138,10 @@ toggle_link( firstwp, secondwp )
// check if it exists // check if it exists
key = firstwp BotBuiltinGetNodeNumber() + ""; key = firstwp BotBuiltinGetNodeNumber() + "";
secnum = secondwp BotBuiltinGetNodeNumber(); secnum = secondwp BotBuiltinGetNodeNumber();
links = firstwp BotBuiltinGetLinkedNodes(); links = firstwp BotBuiltinGetLinkedNodes();
linked = false; linked = false;
for ( i = 0; i < links.size; i++ ) for ( i = 0; i < links.size; i++ )
{ {
if ( links[ i ] BotBuiltinGetNodeNumber() == secnum ) if ( links[ i ] BotBuiltinGetNodeNumber() == secnum )
@ -150,25 +150,25 @@ toggle_link( firstwp, secondwp )
break; break;
} }
} }
if ( !linked ) if ( !linked )
{ {
self iprintln( "no link: " + key + " " + secnum ); self iprintln( "no link: " + key + " " + secnum );
return; return;
} }
if ( key == secnum + "" ) if ( key == secnum + "" )
{ {
self iprintln( "same unlink: " + key + " " + secnum ); self iprintln( "same unlink: " + key + " " + secnum );
return; return;
} }
if ( isdefined( level.bot_ignore_links[ key ] ) && array_contains( level.bot_ignore_links[ key ], secnum ) ) if ( isdefined( level.bot_ignore_links[ key ] ) && array_contains( level.bot_ignore_links[ key ], secnum ) )
{ {
a = level.bot_ignore_links[ key ]; a = level.bot_ignore_links[ key ];
a = array_remove( a, secnum ); a = array_remove( a, secnum );
if ( a.size <= 0 ) if ( a.size <= 0 )
{ {
level.bot_ignore_links[ key ] = undefined; level.bot_ignore_links[ key ] = undefined;
@ -177,7 +177,7 @@ toggle_link( firstwp, secondwp )
{ {
level.bot_ignore_links[ key ] = a; level.bot_ignore_links[ key ] = a;
} }
self iprintln( "removed unlink: " + key + " " + secnum ); self iprintln( "removed unlink: " + key + " " + secnum );
BotBuiltinPrintConsole( "toggle_link: add: " + key + " " + secnum ); BotBuiltinPrintConsole( "toggle_link: add: " + key + " " + secnum );
} }
@ -187,12 +187,12 @@ toggle_link( firstwp, secondwp )
{ {
level.bot_ignore_links[ key ] = []; level.bot_ignore_links[ key ] = [];
} }
a = level.bot_ignore_links[ key ]; a = level.bot_ignore_links[ key ];
a[ a.size ] = secnum; a[ a.size ] = secnum;
level.bot_ignore_links[ key ] = a; level.bot_ignore_links[ key ] = a;
self iprintln( "added unlink: " + key + " " + secnum ); self iprintln( "added unlink: " + key + " " + secnum );
BotBuiltinPrintConsole( "toggle_link: del: " + key + " " + secnum ); BotBuiltinPrintConsole( "toggle_link: del: " + key + " " + secnum );
} }
@ -202,38 +202,38 @@ debug()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
self.closest = -1; self.closest = -1;
for ( ;; ) for ( ;; )
{ {
wait 0.05; wait 0.05;
closest = -1; closest = -1;
myEye = self gettagorigin( "j_head" ); myEye = self gettagorigin( "j_head" );
myAngles = self getplayerangles(); myAngles = self getplayerangles();
for ( i = 0; i < level.waypointcount; i++ ) for ( i = 0; i < level.waypointcount; i++ )
{ {
if ( closest == -1 || closer( self.origin, level.waypoints[ i ].origin, level.waypoints[ closest ].origin ) ) if ( closest == -1 || closer( self.origin, level.waypoints[ i ].origin, level.waypoints[ closest ].origin ) )
{ {
closest = i; closest = i;
} }
wpOrg = level.waypoints[ i ].origin + ( 0, 0, 25 ); wpOrg = level.waypoints[ i ].origin + ( 0, 0, 25 );
if ( distance( level.waypoints[ i ].origin, self.origin ) < getdvarfloat( "bots_main_debug_distance" ) && ( sighttracepassed( myEye, wpOrg, false, self ) || getdvarint( "bots_main_debug_drawThrough" ) ) && getConeDot( wpOrg, myEye, myAngles ) > getdvarfloat( "bots_main_debug_cone" ) ) if ( distance( level.waypoints[ i ].origin, self.origin ) < getdvarfloat( "bots_main_debug_distance" ) && ( sighttracepassed( myEye, wpOrg, false, self ) || getdvarint( "bots_main_debug_drawThrough" ) ) && getConeDot( wpOrg, myEye, myAngles ) > getdvarfloat( "bots_main_debug_cone" ) )
{ {
linked = level.waypoints[ i ] BotBuiltinGetLinkedNodes(); linked = level.waypoints[ i ] BotBuiltinGetLinkedNodes();
node_num_str = level.waypoints[ i ] BotBuiltinGetNodeNumber() + ""; node_num_str = level.waypoints[ i ] BotBuiltinGetNodeNumber() + "";
for ( h = linked.size - 1; h >= 0; h-- ) for ( h = linked.size - 1; h >= 0; h-- )
{ {
if ( isdefined( level.bot_ignore_links[ node_num_str ] ) ) if ( isdefined( level.bot_ignore_links[ node_num_str ] ) )
{ {
found = false; found = false;
this_node_num = linked[ h ] BotBuiltinGetNodeNumber(); this_node_num = linked[ h ] BotBuiltinGetNodeNumber();
for ( j = 0; j < level.bot_ignore_links[ node_num_str ].size; j++ ) for ( j = 0; j < level.bot_ignore_links[ node_num_str ].size; j++ )
{ {
if ( level.bot_ignore_links[ node_num_str ][ j ] == this_node_num ) if ( level.bot_ignore_links[ node_num_str ][ j ] == this_node_num )
@ -242,18 +242,18 @@ debug()
break; break;
} }
} }
if ( found ) if ( found )
{ {
continue; continue;
} }
} }
line( wpOrg, linked[ h ].origin + ( 0, 0, 25 ), ( 1, 0, 1 ) ); line( wpOrg, linked[ h ].origin + ( 0, 0, 25 ), ( 1, 0, 1 ) );
} }
print3d( wpOrg, node_num_str, ( 1, 0, 0 ), 2 ); print3d( wpOrg, node_num_str, ( 1, 0, 0 ), 2 );
if ( isdefined( level.waypoints[ i ].animscript ) ) if ( isdefined( level.waypoints[ i ].animscript ) )
{ {
line( wpOrg, wpOrg + anglestoforward( level.waypoints[ i ].angles ) * 64, ( 1, 1, 1 ) ); line( wpOrg, wpOrg + anglestoforward( level.waypoints[ i ].angles ) * 64, ( 1, 1, 1 ) );
@ -261,7 +261,7 @@ debug()
} }
} }
} }
if ( distance( self.origin, level.waypoints[ closest ].origin ) < 64 ) if ( distance( self.origin, level.waypoints[ closest ].origin ) < 64 )
{ {
self.closest = closest; self.closest = closest;
@ -285,15 +285,15 @@ textScroll( string )
self endon( "zombified" ); self endon( "zombified" );
self endon( "disconnect" ); self endon( "disconnect" );
// thanks ActionScript // thanks ActionScript
back = createbar( ( 0, 0, 0 ), 1000, 30 ); back = createbar( ( 0, 0, 0 ), 1000, 30 );
back setpoint( "CENTER", undefined, 0, 220 ); back setpoint( "CENTER", undefined, 0, 220 );
self thread destroyOnDeath( back ); self thread destroyOnDeath( back );
text = createfontstring( "default", 1.5 ); text = createfontstring( "default", 1.5 );
text settext( string ); text settext( string );
self thread destroyOnDeath( text ); self thread destroyOnDeath( text );
for ( ;; ) for ( ;; )
{ {
text setpoint( "CENTER", undefined, 1200, 220 ); text setpoint( "CENTER", undefined, 1200, 220 );

File diff suppressed because it is too large Load Diff

View File

@ -16,7 +16,7 @@ bot_script_init()
added() added()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self set_diff(); self set_diff();
} }
@ -26,11 +26,11 @@ added()
connected() connected()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self thread difficulty(); self thread difficulty();
self thread onBotSpawned(); self thread onBotSpawned();
self thread onSpawned(); self thread onSpawned();
self thread maps\bots\objectives\_manager::connected(); self thread maps\bots\objectives\_manager::connected();
} }
@ -43,37 +43,37 @@ onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoin
{ {
return; return;
} }
if ( !isalive( self ) ) if ( !isalive( self ) )
{ {
return; return;
} }
if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" ) if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" )
{ {
return; return;
} }
if ( iDamage <= 0 ) if ( iDamage <= 0 )
{ {
return; return;
} }
if ( !isdefined( eAttacker ) || !isdefined( eAttacker.team ) ) if ( !isdefined( eAttacker ) || !isdefined( eAttacker.team ) )
{ {
return; return;
} }
if ( eAttacker == self ) if ( eAttacker == self )
{ {
return; return;
} }
if ( !isalive( eAttacker ) ) if ( !isalive( eAttacker ) )
{ {
return; return;
} }
self SetAttacker( eAttacker ); self SetAttacker( eAttacker );
} }
@ -83,7 +83,7 @@ onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoin
difficulty() difficulty()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; ) for ( ;; )
{ {
if ( getdvarint( "bots_skill" ) != 9 ) if ( getdvarint( "bots_skill" ) != 9 )
@ -110,7 +110,7 @@ difficulty()
self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_ankle_le,j_ankle_ri"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_ankle_le,j_ankle_ri";
self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 0; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 0;
self.pers[ "bots" ][ "behavior" ][ "nade" ] = 10; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 10;
self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 30; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 30;
@ -120,7 +120,7 @@ difficulty()
self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2; self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2;
self.pers[ "bots" ][ "behavior" ][ "jump" ] = 0; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 0;
break; break;
case 2: case 2:
self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.55; self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.55;
self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 1000; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 1000;
@ -141,7 +141,7 @@ difficulty()
self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_ankle_le,j_ankle_ri,j_head"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_ankle_le,j_ankle_ri,j_head";
self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 10; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 10;
self.pers[ "bots" ][ "behavior" ][ "nade" ] = 15; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 15;
self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 45; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 45;
@ -151,7 +151,7 @@ difficulty()
self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2; self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2;
self.pers[ "bots" ][ "behavior" ][ "jump" ] = 10; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 10;
break; break;
case 3: case 3:
self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.4; self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.4;
self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 750; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 750;
@ -172,7 +172,7 @@ difficulty()
self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_spineupper,j_ankle_le,j_ankle_ri,j_head"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_spineupper,j_ankle_le,j_ankle_ri,j_head";
self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 20; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 20;
self.pers[ "bots" ][ "behavior" ][ "nade" ] = 20; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 20;
self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 50; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 50;
@ -182,7 +182,7 @@ difficulty()
self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2; self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2;
self.pers[ "bots" ][ "behavior" ][ "jump" ] = 25; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 25;
break; break;
case 4: case 4:
self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.3; self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.3;
self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 600; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 600;
@ -203,7 +203,7 @@ difficulty()
self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_spineupper,j_ankle_le,j_ankle_ri,j_head,j_head"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_spineupper,j_ankle_le,j_ankle_ri,j_head,j_head";
self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 30; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 30;
self.pers[ "bots" ][ "behavior" ][ "nade" ] = 25; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 25;
self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 55; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 55;
@ -213,7 +213,7 @@ difficulty()
self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2; self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2;
self.pers[ "bots" ][ "behavior" ][ "jump" ] = 35; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 35;
break; break;
case 5: case 5:
self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.25; self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.25;
self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 500; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 500;
@ -234,7 +234,7 @@ difficulty()
self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_head"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_head";
self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 40; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 40;
self.pers[ "bots" ][ "behavior" ][ "nade" ] = 35; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 35;
self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 60; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 60;
@ -244,7 +244,7 @@ difficulty()
self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2; self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2;
self.pers[ "bots" ][ "behavior" ][ "jump" ] = 50; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 50;
break; break;
case 6: case 6:
self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.2; self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.2;
self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 250; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 250;
@ -265,7 +265,7 @@ difficulty()
self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_head,j_head"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_head,j_head";
self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 50; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 50;
self.pers[ "bots" ][ "behavior" ][ "nade" ] = 45; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 45;
self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 65; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 65;
@ -275,7 +275,7 @@ difficulty()
self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2; self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2;
self.pers[ "bots" ][ "behavior" ][ "jump" ] = 75; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 75;
break; break;
case 7: case 7:
self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.1; self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.1;
self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 100; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 100;
@ -296,7 +296,7 @@ difficulty()
self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_head"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_head";
self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 65; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 65;
self.pers[ "bots" ][ "behavior" ][ "nade" ] = 65; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 65;
self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 70; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 70;
@ -308,7 +308,7 @@ difficulty()
break; break;
} }
} }
wait 5; wait 5;
} }
} }
@ -319,16 +319,16 @@ difficulty()
set_diff() set_diff()
{ {
rankVar = getdvarint( "bots_skill" ); rankVar = getdvarint( "bots_skill" );
switch ( rankVar ) switch ( rankVar )
{ {
case 0: case 0:
self.pers[ "bots" ][ "skill" ][ "base" ] = Round( random_normal_distribution( 3.5, 1.75, 1, 7 ) ); self.pers[ "bots" ][ "skill" ][ "base" ] = Round( random_normal_distribution( 3.5, 1.75, 1, 7 ) );
break; break;
case 8: case 8:
break; break;
case 9: case 9:
self.pers[ "bots" ][ "skill" ][ "base" ] = randomintrange( 1, 7 ); self.pers[ "bots" ][ "skill" ][ "base" ] = randomintrange( 1, 7 );
self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.05 * randomintrange( 1, 20 ); self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.05 * randomintrange( 1, 20 );
@ -338,11 +338,11 @@ set_diff()
self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ] = 50 * randomint( 100 ); self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ] = 50 * randomint( 100 );
self.pers[ "bots" ][ "skill" ][ "remember_time" ] = 50 * randomint( 100 ); self.pers[ "bots" ][ "skill" ][ "remember_time" ] = 50 * randomint( 100 );
self.pers[ "bots" ][ "skill" ][ "fov" ] = randomfloatrange( -1, 1 ); self.pers[ "bots" ][ "skill" ][ "fov" ] = randomfloatrange( -1, 1 );
randomNum = randomintrange( 500, 25000 ); randomNum = randomintrange( 500, 25000 );
self.pers[ "bots" ][ "skill" ][ "dist_start" ] = randomNum; self.pers[ "bots" ][ "skill" ][ "dist_start" ] = randomNum;
self.pers[ "bots" ][ "skill" ][ "dist_max" ] = randomNum * 2; self.pers[ "bots" ][ "skill" ][ "dist_max" ] = randomNum * 2;
self.pers[ "bots" ][ "skill" ][ "spawn_time" ] = 0.05 * randomint( 20 ); self.pers[ "bots" ][ "skill" ][ "spawn_time" ] = 0.05 * randomint( 20 );
self.pers[ "bots" ][ "skill" ][ "help_dist" ] = randomintrange( 500, 25000 ); self.pers[ "bots" ][ "skill" ][ "help_dist" ] = randomintrange( 500, 25000 );
self.pers[ "bots" ][ "skill" ][ "semi_time" ] = randomfloatrange( 0.05, 1 ); self.pers[ "bots" ][ "skill" ][ "semi_time" ] = randomfloatrange( 0.05, 1 );
@ -351,7 +351,7 @@ set_diff()
self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ] = randomfloatrange( 0.05, 1 ); self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ] = randomfloatrange( 0.05, 1 );
self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ] = randomfloatrange( 0.05, 1 ); self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ] = randomfloatrange( 0.05, 1 );
self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_head,j_spineupper,j_ankle_ri,j_ankle_le"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_head,j_spineupper,j_ankle_ri,j_ankle_le";
self.pers[ "bots" ][ "behavior" ][ "strafe" ] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "strafe" ] = randomint( 100 );
self.pers[ "bots" ][ "behavior" ][ "nade" ] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "nade" ] = randomint( 100 );
self.pers[ "bots" ][ "behavior" ][ "sprint" ] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "sprint" ] = randomint( 100 );
@ -361,7 +361,7 @@ set_diff()
self.pers[ "bots" ][ "behavior" ][ "switch" ] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "switch" ] = randomint( 100 );
self.pers[ "bots" ][ "behavior" ][ "jump" ] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "jump" ] = randomint( 100 );
break; break;
default: default:
self.pers[ "bots" ][ "skill" ][ "base" ] = rankVar; self.pers[ "bots" ][ "skill" ][ "base" ] = rankVar;
break; break;
@ -375,11 +375,11 @@ onBotSpawned()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
level endon( "intermission" ); level endon( "intermission" );
for ( ;; ) for ( ;; )
{ {
self waittill( "bot_spawned" ); self waittill( "bot_spawned" );
self thread start_bot_threads(); self thread start_bot_threads();
} }
} }
@ -390,11 +390,11 @@ onBotSpawned()
onSpawned() onSpawned()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; ) for ( ;; )
{ {
self waittill( "spawned_player" ); self waittill( "spawned_player" );
self thread maps\bots\objectives\_manager::spawned(); self thread maps\bots\objectives\_manager::spawned();
} }
} }
@ -407,9 +407,9 @@ start_bot_threads()
self endon( "disconnect" ); self endon( "disconnect" );
level endon( "intermission" ); level endon( "intermission" );
self endon( "zombified" ); self endon( "zombified" );
self thread doReloadCancel(); self thread doReloadCancel();
self thread maps\bots\objectives\_manager::start_bot_threads(); self thread maps\bots\objectives\_manager::start_bot_threads();
} }
@ -421,21 +421,21 @@ changeToWeapon( weap )
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
level endon( "game_ended" ); level endon( "game_ended" );
if ( !self hasweapon( weap ) ) if ( !self hasweapon( weap ) )
{ {
return false; return false;
} }
self switchtoweapon( weap ); self switchtoweapon( weap );
if ( self getcurrentweapon() == weap ) if ( self getcurrentweapon() == weap )
{ {
return true; return true;
} }
self waittill_any_timeout( 5, "weapon_change" ); self waittill_any_timeout( 5, "weapon_change" );
return ( self getcurrentweapon() == weap ); return ( self getcurrentweapon() == weap );
} }
@ -445,29 +445,29 @@ changeToWeapon( weap )
doReloadCancel_loop() doReloadCancel_loop()
{ {
ret = self waittill_any_return( "reload", "weapon_change" ); ret = self waittill_any_return( "reload", "weapon_change" );
if ( self BotIsFrozen() ) if ( self BotIsFrozen() )
{ {
return; return;
} }
if ( self usebuttonpressed() ) if ( self usebuttonpressed() )
{ {
return; return;
} }
if ( self inLastStand() ) if ( self inLastStand() )
{ {
return; return;
} }
curWeap = self getcurrentweapon(); curWeap = self getcurrentweapon();
if ( !self isWeaponPrimary( curWeap ) ) if ( !self isWeaponPrimary( curWeap ) )
{ {
return; return;
} }
if ( ret == "reload" ) if ( ret == "reload" )
{ {
// check single reloads // check single reloads
@ -476,41 +476,41 @@ doReloadCancel_loop()
return; return;
} }
} }
// check difficulty // check difficulty
if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 3 ) if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 3 )
{ {
return; return;
} }
// check if got another weapon // check if got another weapon
weaponslist = self getweaponslistprimaries(); weaponslist = self getweaponslistprimaries();
weap = ""; weap = "";
while ( weaponslist.size ) while ( weaponslist.size )
{ {
weapon = weaponslist[ randomint( weaponslist.size ) ]; weapon = weaponslist[ randomint( weaponslist.size ) ];
weaponslist = array_remove( weaponslist, weapon ); weaponslist = array_remove( weaponslist, weapon );
if ( !self isWeaponPrimary( weapon ) ) if ( !self isWeaponPrimary( weapon ) )
{ {
continue; continue;
} }
if ( curWeap == weapon || weapon == "none" || weapon == "" ) if ( curWeap == weapon || weapon == "none" || weapon == "" )
{ {
continue; continue;
} }
weap = weapon; weap = weapon;
break; break;
} }
if ( weap == "" ) if ( weap == "" )
{ {
return; return;
} }
// do the cancel // do the cancel
wait 0.1; wait 0.1;
self thread changeToWeapon( weap ); self thread changeToWeapon( weap );
@ -526,7 +526,7 @@ doReloadCancel()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
for ( ;; ) for ( ;; )
{ {
self doReloadCancel_loop(); self doReloadCancel_loop();

File diff suppressed because it is too large Load Diff

View File

@ -22,7 +22,7 @@ connected()
spawned() spawned()
{ {
self.bot_current_objective = undefined; self.bot_current_objective = undefined;
self thread clean_objective_on_completion(); self thread clean_objective_on_completion();
self thread watch_for_objective_canceled(); self thread watch_for_objective_canceled();
} }
@ -32,18 +32,18 @@ watch_for_objective_canceled()
self endon( "disconnect" ); self endon( "disconnect" );
level endon( "intermission" ); level endon( "intermission" );
self endon( "zombified" ); self endon( "zombified" );
for ( ;; ) for ( ;; )
{ {
self waittill( "cancel_bot_objective", reason ); self waittill( "cancel_bot_objective", reason );
obj_name = "undefined"; obj_name = "undefined";
if ( isdefined( self.bot_current_objective ) ) if ( isdefined( self.bot_current_objective ) )
{ {
obj_name = self.bot_current_objective.sname; obj_name = self.bot_current_objective.sname;
} }
self BotNotifyBotEvent( "debug", "watch_for_objective_canceled: " + obj_name + ": " + reason ); self BotNotifyBotEvent( "debug", "watch_for_objective_canceled: " + obj_name + ": " + reason );
} }
} }
@ -53,22 +53,22 @@ clean_objective_on_completion()
self endon( "disconnect" ); self endon( "disconnect" );
level endon( "intermission" ); level endon( "intermission" );
self endon( "zombified" ); self endon( "zombified" );
for ( ;; ) for ( ;; )
{ {
self waittill( "completed_bot_objective", successful, reason ); self waittill( "completed_bot_objective", successful, reason );
obj_name = "undefined"; obj_name = "undefined";
if ( isdefined( self.bot_current_objective ) ) if ( isdefined( self.bot_current_objective ) )
{ {
obj_name = self.bot_current_objective.sname; obj_name = self.bot_current_objective.sname;
self.bot_current_objective.eparentobj.abotprocesstimes[ self getentitynumber() + "" ] = gettime(); self.bot_current_objective.eparentobj.abotprocesstimes[ self getentitynumber() + "" ] = gettime();
} }
self BotNotifyBotEvent( "debug", "clean_objective_on_completion: " + obj_name + ": " + successful + ": " + reason ); self BotNotifyBotEvent( "debug", "clean_objective_on_completion: " + obj_name + ": " + successful + ": " + reason );
waittillframeend; waittillframeend;
self.bot_current_objective = undefined; self.bot_current_objective = undefined;
} }
@ -79,7 +79,7 @@ start_bot_threads()
self endon( "disconnect" ); self endon( "disconnect" );
level endon( "intermission" ); level endon( "intermission" );
self endon( "zombified" ); self endon( "zombified" );
self thread bot_objective_think(); self thread bot_objective_think();
} }
@ -88,80 +88,80 @@ bot_objective_think()
self endon( "disconnect" ); self endon( "disconnect" );
level endon( "intermission" ); level endon( "intermission" );
self endon( "zombified" ); self endon( "zombified" );
for ( ;; ) for ( ;; )
{ {
wait 1; wait 1;
// find all avail objectives // find all avail objectives
objectives = []; objectives = [];
now = gettime(); now = gettime();
our_key = self getentitynumber() + ""; our_key = self getentitynumber() + "";
for ( i = 0; i < level.bot_objectives.size; i++ ) for ( i = 0; i < level.bot_objectives.size; i++ )
{ {
objective = level.bot_objectives[ i ]; objective = level.bot_objectives[ i ];
// check the process rate // check the process rate
if ( isdefined( objective.abotprocesstimes[ our_key ] ) && now - objective.abotprocesstimes[ our_key ] < objective.iprocessrate ) if ( isdefined( objective.abotprocesstimes[ our_key ] ) && now - objective.abotprocesstimes[ our_key ] < objective.iprocessrate )
{ {
continue; continue;
} }
objectives = array_merge( objectives, self [[ objective.fpfinder ]]( objective ) ); objectives = array_merge( objectives, self [[ objective.fpfinder ]]( objective ) );
objective.abotprocesstimes[ our_key ] = now; objective.abotprocesstimes[ our_key ] = now;
} }
if ( objectives.size <= 0 ) if ( objectives.size <= 0 )
{ {
continue; continue;
} }
// sort according to priority // sort according to priority
heap = NewHeap( ::HeapPriority ); heap = NewHeap( ::HeapPriority );
for ( i = 0; i < objectives.size; i++ ) for ( i = 0; i < objectives.size; i++ )
{ {
if ( objectives[ i ].fpriority <= -100 ) if ( objectives[ i ].fpriority <= -100 )
{ {
continue; continue;
} }
heap HeapInsert( objectives[ i ] ); heap HeapInsert( objectives[ i ] );
} }
// pop the top! // pop the top!
best_prio = heap.data[ 0 ]; best_prio = heap.data[ 0 ];
if ( !isdefined( best_prio ) ) if ( !isdefined( best_prio ) )
{ {
continue; continue;
} }
// already on a better obj // already on a better obj
if ( isdefined( self.bot_current_objective ) && ( best_prio.guid == self.bot_current_objective.guid || best_prio.fpriority < self [[ self.bot_current_objective.eparentobj.fppriorty ]]( self.bot_current_objective.eparentobj, self.bot_current_objective.eent ) ) ) if ( isdefined( self.bot_current_objective ) && ( best_prio.guid == self.bot_current_objective.guid || best_prio.fpriority < self [[ self.bot_current_objective.eparentobj.fppriorty ]]( self.bot_current_objective.eparentobj, self.bot_current_objective.eent ) ) )
{ {
continue; continue;
} }
// DO THE OBJ // DO THE OBJ
// cancel the old obj // cancel the old obj
if ( isdefined( self.bot_current_objective ) ) if ( isdefined( self.bot_current_objective ) )
{ {
// cancel it // cancel it
self CancelObjective( "new obj: " + best_prio.sname ); self CancelObjective( "new obj: " + best_prio.sname );
// wait for it to clean up // wait for it to clean up
self waittill( "completed_bot_objective" ); self waittill( "completed_bot_objective" );
// redo the loop, should do the obj next iteration // redo the loop, should do the obj next iteration
best_prio.eparentobj.abotprocesstimes[ our_key ] = undefined; best_prio.eparentobj.abotprocesstimes[ our_key ] = undefined;
continue; continue;
} }
// ready to execute // ready to execute
self BotNotifyBotEvent( "debug", "bot_objective_think: " + best_prio.sname ); self BotNotifyBotEvent( "debug", "bot_objective_think: " + best_prio.sname );
self.bot_current_objective = best_prio; self.bot_current_objective = best_prio;
self thread [[ best_prio.eparentobj.fpexecuter ]]( best_prio ); self thread [[ best_prio.eparentobj.fpexecuter ]]( best_prio );
} }

View File

@ -6,17 +6,17 @@
init() init()
{ {
vending_triggers = getentarray( "zombie_vending", "targetname" ); vending_triggers = getentarray( "zombie_vending", "targetname" );
if ( !isdefined( vending_triggers ) || vending_triggers.size < 1 ) if ( !isdefined( vending_triggers ) || vending_triggers.size < 1 )
{ {
vending_triggers = getentarray( "harrybo21_perk_trigger", "targetname" ); vending_triggers = getentarray( "harrybo21_perk_trigger", "targetname" );
if ( !isdefined( vending_triggers ) || vending_triggers.size < 1 ) if ( !isdefined( vending_triggers ) || vending_triggers.size < 1 )
{ {
return; return;
} }
} }
for ( i = 0 ; i < vending_triggers.size; i++ ) for ( i = 0 ; i < vending_triggers.size; i++ )
{ {
vending_triggers[ i ] thread init_vending_trigger(); vending_triggers[ i ] thread init_vending_trigger();
@ -26,22 +26,22 @@ init()
init_vending_trigger() init_vending_trigger()
{ {
self endon( "death" ); self endon( "death" );
if ( self.targetname == "harrybo21_perk_trigger" ) if ( self.targetname == "harrybo21_perk_trigger" )
{ {
machine = self getMachine(); machine = self getMachine();
machine waittill( "activate_machine" ); machine waittill( "activate_machine" );
self.bot_powered_on = true; self.bot_powered_on = true;
} }
else else
{ {
perk = self getVendingPerk(); perk = self getVendingPerk();
notify_name = perk + "_power_on"; notify_name = perk + "_power_on";
level waittill( notify_name ); level waittill( notify_name );
self.bot_powered_on = true; self.bot_powered_on = true;
} }
} }
@ -49,64 +49,64 @@ init_vending_trigger()
Finder( eObj ) Finder( eObj )
{ {
answer = []; answer = [];
if ( self inLastStand() ) if ( self inLastStand() )
{ {
return answer; return answer;
} }
vending_triggers = getentarray( "zombie_vending", "targetname" ); vending_triggers = getentarray( "zombie_vending", "targetname" );
if ( !isdefined( vending_triggers ) || vending_triggers.size < 1 ) if ( !isdefined( vending_triggers ) || vending_triggers.size < 1 )
{ {
vending_triggers = getentarray( "harrybo21_perk_trigger", "targetname" ); vending_triggers = getentarray( "harrybo21_perk_trigger", "targetname" );
if ( !isdefined( vending_triggers ) || vending_triggers.size < 1 ) if ( !isdefined( vending_triggers ) || vending_triggers.size < 1 )
{ {
return answer; return answer;
} }
} }
for ( i = 0 ; i < vending_triggers.size; i++ ) for ( i = 0 ; i < vending_triggers.size; i++ )
{ {
vending = vending_triggers[ i ]; vending = vending_triggers[ i ];
if ( !isdefined( vending.bot_powered_on ) || !vending.bot_powered_on ) if ( !isdefined( vending.bot_powered_on ) || !vending.bot_powered_on )
{ {
continue; continue;
} }
perk = vending getVendingPerk(); perk = vending getVendingPerk();
cost = vending getPerkCost(); cost = vending getPerkCost();
if ( self.score < cost ) if ( self.score < cost )
{ {
continue; continue;
} }
// perk limit?? // perk limit??
if ( self hasperk( perk ) ) if ( self hasperk( perk ) )
{ {
continue; continue;
} }
machine = vending getMachine(); machine = vending getMachine();
if ( !isdefined( machine ) ) if ( !isdefined( machine ) )
{ {
continue; continue;
} }
org = self getOffset( machine ); org = self getOffset( machine );
if ( GetPathIsInaccessible( self.origin, org ) ) if ( GetPathIsInaccessible( self.origin, org ) )
{ {
continue; continue;
} }
answer[ answer.size ] = self CreateFinderObjectiveEZ( eObj, vending ); answer[ answer.size ] = self CreateFinderObjectiveEZ( eObj, vending );
} }
return answer; return answer;
} }
@ -122,7 +122,7 @@ getVendingPerk()
machine = self getMachine(); machine = self getMachine();
return machine.script_string; return machine.script_string;
} }
return self.script_noteworthy; return self.script_noteworthy;
} }
@ -132,39 +132,39 @@ getPerkCost()
{ {
return level.zombie_perks[ self getVendingPerk() ].perk_cost; return level.zombie_perks[ self getVendingPerk() ].perk_cost;
} }
cost = level.zombie_vars[ "zombie_perk_cost" ]; cost = level.zombie_vars[ "zombie_perk_cost" ];
switch ( self getVendingPerk() ) switch ( self getVendingPerk() )
{ {
case "specialty_armorvest": case "specialty_armorvest":
cost = 2500; cost = 2500;
break; break;
case "specialty_quickrevive": case "specialty_quickrevive":
cost = 1500; cost = 1500;
break; break;
case "specialty_fastreload": case "specialty_fastreload":
cost = 3000; cost = 3000;
break; break;
case "specialty_rof": case "specialty_rof":
cost = 2000; cost = 2000;
break; break;
default: default:
cost = 10000; cost = 10000;
break; break;
} }
return cost; return cost;
} }
getOffset( model ) getOffset( model )
{ {
org = model get_angle_offset_node( 40, ( 0, -90, 0 ), ( 0, 0, 1 ) ); org = model get_angle_offset_node( 40, ( 0, -90, 0 ), ( 0, 0, 1 ) );
return org; return org;
} }
@ -173,12 +173,12 @@ Priority( eObj, eEnt )
// TODO rank perks // TODO rank perks
base_priority = 2; base_priority = 2;
base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 500, 1600, 3, 0 ); base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 500, 1600, 3, 0 );
if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt )
{ {
base_priority -= 1; base_priority -= 1;
} }
return base_priority; return base_priority;
} }
@ -186,17 +186,17 @@ Executer( eObj )
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
vending = eObj.eent; vending = eObj.eent;
self thread WatchForCancel( vending ); self thread WatchForCancel( vending );
self GoDoPerkMachine( eObj ); self GoDoPerkMachine( eObj );
self WatchForCancelCleanup(); self WatchForCancelCleanup();
self ClearScriptAimPos(); self ClearScriptAimPos();
self ClearScriptGoal(); self ClearScriptGoal();
self CompletedObjective( eObj.bwassuccessful, eObj.sreason ); self CompletedObjective( eObj.bwassuccessful, eObj.sreason );
} }
@ -210,11 +210,11 @@ WatchForCancel( vending )
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
self endon( "WatchForCancelPerkmachine" ); self endon( "WatchForCancelPerkmachine" );
for ( ;; ) for ( ;; )
{ {
wait 0.05; wait 0.05;
if ( self inLastStand() ) if ( self inLastStand() )
{ {
self CancelObjective( "self inLastStand()" ); self CancelObjective( "self inLastStand()" );
@ -231,11 +231,11 @@ WatchToGoToMachine( vending )
self endon( "goal" ); self endon( "goal" );
self endon( "bad_path" ); self endon( "bad_path" );
self endon( "new_goal" ); self endon( "new_goal" );
for ( ;; ) for ( ;; )
{ {
wait 0.05; wait 0.05;
if ( self istouching( vending ) || vending PointInsideUseTrigger( self.origin ) ) if ( self istouching( vending ) || vending PointInsideUseTrigger( self.origin ) )
{ {
self notify( "goal" ); self notify( "goal" );
@ -247,40 +247,40 @@ WatchToGoToMachine( vending )
GoDoPerkMachine( eObj ) GoDoPerkMachine( eObj )
{ {
self endon( "cancel_bot_objective" ); self endon( "cancel_bot_objective" );
vending = eObj.eent; vending = eObj.eent;
machine = vending getMachine(); machine = vending getMachine();
perk = vending getVendingPerk(); perk = vending getVendingPerk();
org = self getOffset( machine ); org = self getOffset( machine );
// go to machine // go to machine
self thread WatchToGoToMachine( vending ); self thread WatchToGoToMachine( vending );
self SetScriptGoal( org, 32 ); self SetScriptGoal( org, 32 );
result = self waittill_any_return( "goal", "bad_path", "new_goal" ); result = self waittill_any_return( "goal", "bad_path", "new_goal" );
if ( result != "goal" ) if ( result != "goal" )
{ {
eObj.sreason = "didn't go to machine"; eObj.sreason = "didn't go to machine";
return; return;
} }
if ( !self istouching( vending ) && !vending PointInsideUseTrigger( self.origin ) ) if ( !self istouching( vending ) && !vending PointInsideUseTrigger( self.origin ) )
{ {
eObj.sreason = "not touching machine"; eObj.sreason = "not touching machine";
return; return;
} }
// ok we are touching machine, lets look at it // ok we are touching machine, lets look at it
self SetScriptAimPos( vending.origin ); self SetScriptAimPos( vending.origin );
// wait to look at it // wait to look at it
wait 1; wait 1;
// press use // press use
self thread BotPressUse( 0.15 ); self thread BotPressUse( 0.15 );
wait 0.1; wait 0.1;
// ok we pressed use, DONE // ok we pressed use, DONE
eObj.sreason = "completed " + perk; eObj.sreason = "completed " + perk;
eObj.bwassuccessful = true; eObj.bwassuccessful = true;

View File

@ -6,14 +6,14 @@
Finder( eObj ) Finder( eObj )
{ {
answer = []; answer = [];
if ( self inLastStand() ) if ( self inLastStand() )
{ {
return answer; return answer;
} }
ents = getentarray( "script_model", "classname" ); ents = getentarray( "script_model", "classname" );
for ( i = 0; i < ents.size; i++ ) for ( i = 0; i < ents.size; i++ )
{ {
// not a powerup script_model // not a powerup script_model
@ -21,22 +21,22 @@ Finder( eObj )
{ {
continue; continue;
} }
// can we path to it? // can we path to it?
if ( GetPathIsInaccessible( self.origin, ents[ i ].origin ) ) if ( GetPathIsInaccessible( self.origin, ents[ i ].origin ) )
{ {
continue; continue;
} }
// make sure we are the only one going for it // make sure we are the only one going for it
if ( self GetBotsAmountForEntity( ents[ i ] ) >= 1 ) if ( self GetBotsAmountForEntity( ents[ i ] ) >= 1 )
{ {
continue; continue;
} }
answer[ answer.size ] = self CreateFinderObjectiveEZ( eObj, ents[ i ] ); answer[ answer.size ] = self CreateFinderObjectiveEZ( eObj, ents[ i ] );
} }
return answer; return answer;
} }
@ -45,12 +45,12 @@ Priority( eObj, eEnt )
// TODO: check powerup type // TODO: check powerup type
base_priority = 0; base_priority = 0;
base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 300, 700, 2, -2 ); base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 300, 700, 2, -2 );
if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt )
{ {
base_priority -= 1; base_priority -= 1;
} }
return base_priority; return base_priority;
} }
@ -58,25 +58,25 @@ Executer( eObj )
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
powerup = eObj.eent; powerup = eObj.eent;
org = powerup.origin; org = powerup.origin;
self thread IncrementBotsForEntity( powerup ); self thread IncrementBotsForEntity( powerup );
self thread WatchForCancel( powerup ); self thread WatchForCancel( powerup );
self GoDoPowerup( eObj ); self GoDoPowerup( eObj );
self WatchForCancelCleanup(); self WatchForCancelCleanup();
self DecrementBotsForEntity( powerup ); self DecrementBotsForEntity( powerup );
self ClearScriptGoal(); self ClearScriptGoal();
if ( distance( org, self.origin ) <= 64 ) if ( distance( org, self.origin ) <= 64 )
{ {
eObj.sreason = "completed"; eObj.sreason = "completed";
eObj.bwassuccessful = true; eObj.bwassuccessful = true;
} }
self CompletedObjective( eObj.bwassuccessful, eObj.sreason ); self CompletedObjective( eObj.bwassuccessful, eObj.sreason );
} }
@ -90,17 +90,17 @@ WatchForCancel( powerup )
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
self endon( "WatchForCancelPowerup" ); self endon( "WatchForCancelPowerup" );
for ( ;; ) for ( ;; )
{ {
wait 0.05; wait 0.05;
if ( self inLastStand() ) if ( self inLastStand() )
{ {
self CancelObjective( "self inLastStand()" ); self CancelObjective( "self inLastStand()" );
break; break;
} }
if ( !isdefined( powerup ) ) if ( !isdefined( powerup ) )
{ {
self CancelObjective( "!isdefined( powerup )" ); self CancelObjective( "!isdefined( powerup )" );
@ -112,31 +112,31 @@ WatchForCancel( powerup )
GoDoPowerup( eObj ) GoDoPowerup( eObj )
{ {
self endon( "cancel_bot_objective" ); self endon( "cancel_bot_objective" );
powerup = eObj.eent; powerup = eObj.eent;
// go to it // go to it
self SetScriptGoal( powerup.origin, 32 ); self SetScriptGoal( powerup.origin, 32 );
result = self waittill_any_return( "goal", "bad_path", "new_goal" ); result = self waittill_any_return( "goal", "bad_path", "new_goal" );
if ( result != "goal" ) if ( result != "goal" )
{ {
eObj.sreason = "didn't go to powerup"; eObj.sreason = "didn't go to powerup";
return; return;
} }
if ( !isdefined( powerup ) || !isdefined( powerup.origin ) ) if ( !isdefined( powerup ) || !isdefined( powerup.origin ) )
{ {
return; return;
} }
if ( distance( powerup.origin, self.origin ) > 64 ) if ( distance( powerup.origin, self.origin ) > 64 )
{ {
eObj.sreason = "not touching it"; eObj.sreason = "not touching it";
return; return;
} }
eObj.sreason = "completed"; eObj.sreason = "completed";
eObj.bwassuccessful = true; eObj.bwassuccessful = true;
} }

View File

@ -7,49 +7,49 @@ Finder( eObj )
{ {
Players = get_players(); Players = get_players();
Answer = []; Answer = [];
if ( self inLastStand() ) if ( self inLastStand() )
{ {
return Answer; return Answer;
} }
for ( i = 0; i < Players.size; i++ ) for ( i = 0; i < Players.size; i++ )
{ {
Player = Players[ i ]; Player = Players[ i ];
if ( !isdefined( Player ) || !isdefined( Player.team ) ) if ( !isdefined( Player ) || !isdefined( Player.team ) )
{ {
continue; continue;
} }
if ( Player == self ) if ( Player == self )
{ {
continue; continue;
} }
if ( Player.sessionstate != "playing" ) if ( Player.sessionstate != "playing" )
{ {
continue; continue;
} }
if ( !Player inLastStand() || Player.revivetrigger.beingrevived ) if ( !Player inLastStand() || Player.revivetrigger.beingrevived )
{ {
continue; continue;
} }
if ( GetPathIsInaccessible( self.origin, Player.origin ) ) if ( GetPathIsInaccessible( self.origin, Player.origin ) )
{ {
continue; continue;
} }
if ( self GetBotsAmountForEntity( Player ) >= 1 ) if ( self GetBotsAmountForEntity( Player ) >= 1 )
{ {
continue; continue;
} }
Answer[ Answer.size ] = self CreateFinderObjectiveEZ( eObj, Player ); Answer[ Answer.size ] = self CreateFinderObjectiveEZ( eObj, Player );
} }
return Answer; return Answer;
} }
@ -57,12 +57,12 @@ Priority( eObj, eEnt )
{ {
base_priority = 3; base_priority = 3;
base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 500, 1200, 2, 0 ); base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 500, 1200, 2, 0 );
if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt )
{ {
base_priority -= 1; base_priority -= 1;
} }
return base_priority; return base_priority;
} }
@ -70,20 +70,20 @@ Executer( eObj )
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
revivee = eObj.eent; revivee = eObj.eent;
self thread IncrementBotsForEntity( revivee ); self thread IncrementBotsForEntity( revivee );
self thread WatchForCancelRevive( revivee ); self thread WatchForCancelRevive( revivee );
self GoDoRevive( eObj ); self GoDoRevive( eObj );
self WatchForCancelReviveCleanup(); self WatchForCancelReviveCleanup();
self DecrementBotsForEntity( revivee ); self DecrementBotsForEntity( revivee );
self ClearScriptAimPos(); self ClearScriptAimPos();
self ClearScriptGoal(); self ClearScriptGoal();
self ClearPriorityObjective(); self ClearPriorityObjective();
self CompletedObjective( eObj.bwassuccessful, eObj.sreason ); self CompletedObjective( eObj.bwassuccessful, eObj.sreason );
} }
@ -97,31 +97,31 @@ WatchForCancelRevive( revivee )
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
self endon( "WatchForCancelRevive" ); self endon( "WatchForCancelRevive" );
org = revivee.origin; org = revivee.origin;
for ( ;; ) for ( ;; )
{ {
wait 0.05; wait 0.05;
if ( self inLastStand() ) if ( self inLastStand() )
{ {
self CancelObjective( "self inLastStand()" ); self CancelObjective( "self inLastStand()" );
break; break;
} }
if ( !isdefined( revivee ) || !revivee inLastStand() ) if ( !isdefined( revivee ) || !revivee inLastStand() )
{ {
self CancelObjective( "!isdefined( revivee ) || !revivee inLastStand()" ); self CancelObjective( "!isdefined( revivee ) || !revivee inLastStand()" );
break; break;
} }
if ( revivee.revivetrigger.beingrevived && !self isReviving( revivee ) ) if ( revivee.revivetrigger.beingrevived && !self isReviving( revivee ) )
{ {
self CancelObjective( "revivee.revivetrigger.beingrevived && !self isReviving( revivee )" ); self CancelObjective( "revivee.revivetrigger.beingrevived && !self isReviving( revivee )" );
break; break;
} }
if ( distance( revivee.origin, org ) > 16 ) if ( distance( revivee.origin, org ) > 16 )
{ {
self CancelObjective( "distance( revivee.origin, org ) > 16" ); self CancelObjective( "distance( revivee.origin, org ) > 16" );
@ -138,11 +138,11 @@ WatchToGoToGuy( revivee )
self endon( "goal" ); self endon( "goal" );
self endon( "bad_path" ); self endon( "bad_path" );
self endon( "new_goal" ); self endon( "new_goal" );
for ( ;; ) for ( ;; )
{ {
wait 1; wait 1;
if ( self istouching( revivee.revivetrigger ) ) if ( self istouching( revivee.revivetrigger ) )
{ {
self notify( "goal" ); self notify( "goal" );
@ -155,11 +155,11 @@ WatchForSuccessRevive( eObj )
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
revivee = eObj.eent; revivee = eObj.eent;
ret = self waittill_either_return( "cancel_bot_objective", "completed_bot_objective" ); ret = self waittill_either_return( "cancel_bot_objective", "completed_bot_objective" );
if ( ret == "cancel_bot_objective" && isdefined( revivee ) && !revivee inLastStand() ) if ( ret == "cancel_bot_objective" && isdefined( revivee ) && !revivee inLastStand() )
{ {
eObj.bwassuccessful = true; eObj.bwassuccessful = true;
@ -170,40 +170,40 @@ WatchForSuccessRevive( eObj )
GoDoRevive( eObj ) GoDoRevive( eObj )
{ {
self endon( "cancel_bot_objective" ); self endon( "cancel_bot_objective" );
revivee = eObj.eent; revivee = eObj.eent;
// go to guy // go to guy
self thread WatchToGoToGuy( revivee ); self thread WatchToGoToGuy( revivee );
self SetPriorityObjective(); self SetPriorityObjective();
self SetScriptGoal( revivee.origin, 32 ); self SetScriptGoal( revivee.origin, 32 );
result = self waittill_any_return( "goal", "bad_path", "new_goal" ); result = self waittill_any_return( "goal", "bad_path", "new_goal" );
if ( result != "goal" ) if ( result != "goal" )
{ {
eObj.sreason = "didn't go to guy"; eObj.sreason = "didn't go to guy";
return; return;
} }
if ( !self istouching( revivee.revivetrigger ) ) if ( !self istouching( revivee.revivetrigger ) )
{ {
eObj.sreason = "not touching guy"; eObj.sreason = "not touching guy";
return; return;
} }
// ok we are touching guy, lets look at him // ok we are touching guy, lets look at him
self SetScriptAimPos( revivee.origin ); self SetScriptAimPos( revivee.origin );
// now lets hold use until he is up or otherwise // now lets hold use until he is up or otherwise
self thread WatchForSuccessRevive( eObj ); self thread WatchForSuccessRevive( eObj );
while ( self istouching( revivee.revivetrigger ) ) while ( self istouching( revivee.revivetrigger ) )
{ {
self thread BotPressUse( 0.15 ); self thread BotPressUse( 0.15 );
wait 0.1; wait 0.1;
} }
eObj.sreason = "not touching guy"; eObj.sreason = "not touching guy";
} }

View File

@ -6,45 +6,45 @@
Finder( eObj ) Finder( eObj )
{ {
answer = []; answer = [];
if ( self inLastStand() ) if ( self inLastStand() )
{ {
return answer; return answer;
} }
weapons = self getweaponslist(); weapons = self getweaponslist();
// TODO check if need a new weapon, rate weapons too is better then current etc // TODO check if need a new weapon, rate weapons too is better then current etc
chests = level.chests; chests = level.chests;
if ( !isdefined( chests ) ) if ( !isdefined( chests ) )
{ {
chests = getentarray( "treasure_chest_use", "targetname" ); chests = getentarray( "treasure_chest_use", "targetname" );
} }
if ( !isdefined( chests ) || chests.size <= 0 ) if ( !isdefined( chests ) || chests.size <= 0 )
{ {
return answer; return answer;
} }
for ( i = 0; i < chests.size; i ++ ) for ( i = 0; i < chests.size; i ++ )
{ {
chest = chests[ i ]; chest = chests[ i ];
// not active chest // not active chest
if ( isdefined( chest.disabled ) && chest.disabled ) if ( isdefined( chest.disabled ) && chest.disabled )
{ {
continue; continue;
} }
// box is waiting for someone to grab weapon // box is waiting for someone to grab weapon
if ( isdefined( chest.grab_weapon_hint ) && chest.grab_weapon_hint ) if ( isdefined( chest.grab_weapon_hint ) && chest.grab_weapon_hint )
{ {
continue; continue;
} }
cost = 950; cost = 950;
if ( isdefined( level.zombie_treasure_chest_cost ) ) if ( isdefined( level.zombie_treasure_chest_cost ) )
{ {
cost = level.zombie_treasure_chest_cost; cost = level.zombie_treasure_chest_cost;
@ -53,44 +53,44 @@ Finder( eObj )
{ {
cost = chest.zombie_cost; cost = chest.zombie_cost;
} }
// check cost // check cost
if ( self.score < cost ) if ( self.score < cost )
{ {
continue; continue;
} }
lid = getent( chest.target, "targetname" ); lid = getent( chest.target, "targetname" );
if ( !isdefined( lid ) ) if ( !isdefined( lid ) )
{ {
continue; continue;
} }
weapon_spawn_org = getent( lid.target, "targetname" ); weapon_spawn_org = getent( lid.target, "targetname" );
if ( !isdefined( weapon_spawn_org ) ) if ( !isdefined( weapon_spawn_org ) )
{ {
continue; continue;
} }
org = self getOffset( lid ); org = self getOffset( lid );
if ( GetPathIsInaccessible( self.origin, org ) ) if ( GetPathIsInaccessible( self.origin, org ) )
{ {
continue; continue;
} }
answer[ answer.size ] = self CreateFinderObjectiveEZ( eObj, chest ); answer[ answer.size ] = self CreateFinderObjectiveEZ( eObj, chest );
} }
return answer; return answer;
} }
getOffset( model ) getOffset( model )
{ {
org = model get_angle_offset_node( 52, ( 0, 90, 0 ), ( 0, 0, 1 ) ); org = model get_angle_offset_node( 52, ( 0, 90, 0 ), ( 0, 0, 1 ) );
return org; return org;
} }
@ -98,12 +98,12 @@ Priority( eObj, eEnt )
{ {
base_priority = 1; base_priority = 1;
base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 600, 1800, 2, 0 ); base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 600, 1800, 2, 0 );
if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt )
{ {
base_priority -= 1; base_priority -= 1;
} }
return base_priority; return base_priority;
} }
@ -111,18 +111,18 @@ Executer( eObj )
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
chest = eObj.eent; chest = eObj.eent;
self thread WatchForCancel( chest ); self thread WatchForCancel( chest );
self GoDoTreasureChest( eObj ); self GoDoTreasureChest( eObj );
self WatchForCancelCleanup(); self WatchForCancelCleanup();
self ClearScriptAimPos(); self ClearScriptAimPos();
self ClearScriptGoal(); self ClearScriptGoal();
self ClearPriorityObjective(); self ClearPriorityObjective();
self CompletedObjective( eObj.bwassuccessful, eObj.sreason ); self CompletedObjective( eObj.bwassuccessful, eObj.sreason );
} }
@ -136,11 +136,11 @@ WatchForCancel( chest )
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
self endon( "WatchForCancelTreasurechest" ); self endon( "WatchForCancelTreasurechest" );
for ( ;; ) for ( ;; )
{ {
wait 0.05; wait 0.05;
if ( self inLastStand() ) if ( self inLastStand() )
{ {
self CancelObjective( "self inLastStand()" ); self CancelObjective( "self inLastStand()" );
@ -157,17 +157,17 @@ WatchToGoToChest( chest )
self endon( "goal" ); self endon( "goal" );
self endon( "bad_path" ); self endon( "bad_path" );
self endon( "new_goal" ); self endon( "new_goal" );
for ( ;; ) for ( ;; )
{ {
wait 0.05; wait 0.05;
if ( self istouching( chest ) || chest PointInsideUseTrigger( self.origin ) ) if ( self istouching( chest ) || chest PointInsideUseTrigger( self.origin ) )
{ {
self notify( "goal" ); self notify( "goal" );
break; // is this needed? break; // is this needed?
} }
if ( isdefined( chest.disabled ) && chest.disabled ) if ( isdefined( chest.disabled ) && chest.disabled )
{ {
self notify( "bad_path" ); self notify( "bad_path" );
@ -179,105 +179,105 @@ WatchToGoToChest( chest )
GoDoTreasureChest( eObj ) GoDoTreasureChest( eObj )
{ {
self endon( "cancel_bot_objective" ); self endon( "cancel_bot_objective" );
chest = eObj.eent; chest = eObj.eent;
lid = getent( chest.target, "targetname" ); lid = getent( chest.target, "targetname" );
weapon_spawn_org = getent( lid.target, "targetname" ); weapon_spawn_org = getent( lid.target, "targetname" );
org = self getOffset( lid ); org = self getOffset( lid );
weap = self getcurrentweapon(); weap = self getcurrentweapon();
if ( weap == "none" || !self getammocount( weap ) ) if ( weap == "none" || !self getammocount( weap ) )
{ {
self SetPriorityObjective(); self SetPriorityObjective();
} }
// go to box // go to box
self thread WatchToGoToChest( chest ); self thread WatchToGoToChest( chest );
self SetScriptGoal( org, 32 ); self SetScriptGoal( org, 32 );
result = self waittill_any_return( "goal", "bad_path", "new_goal" ); result = self waittill_any_return( "goal", "bad_path", "new_goal" );
if ( result != "goal" ) if ( result != "goal" )
{ {
eObj.sreason = "didn't go to chest"; eObj.sreason = "didn't go to chest";
return; return;
} }
if ( !self istouching( chest ) && !chest PointInsideUseTrigger( self.origin ) ) if ( !self istouching( chest ) && !chest PointInsideUseTrigger( self.origin ) )
{ {
eObj.sreason = "not touching chest"; eObj.sreason = "not touching chest";
return; return;
} }
// ok we are touching weapon, lets look at it // ok we are touching weapon, lets look at it
self SetScriptAimPos( chest.origin ); self SetScriptAimPos( chest.origin );
// wait to look at it // wait to look at it
wait 1; wait 1;
// press use // press use
self thread BotPressUse( 0.15 ); self thread BotPressUse( 0.15 );
wait 0.25; wait 0.25;
// ok we pressed use, wait for randomization to complete // ok we pressed use, wait for randomization to complete
self ClearScriptAimPos(); self ClearScriptAimPos();
self ClearPriorityObjective(); self ClearPriorityObjective();
// randomization isnt happening... // randomization isnt happening...
if ( !isdefined( chest.disabled ) || !chest.disabled ) if ( !isdefined( chest.disabled ) || !chest.disabled )
{ {
eObj.sreason = "chest isnt randomizing"; eObj.sreason = "chest isnt randomizing";
return; return;
} }
ret = weapon_spawn_org waittill_any_timeout( 5, "randomization_done" ); ret = weapon_spawn_org waittill_any_timeout( 5, "randomization_done" );
if (ret == "timeout") if ( ret == "timeout" )
{ {
eObj.sreason = "randomization_done timed out"; eObj.sreason = "randomization_done timed out";
return; return;
} }
if ( isdefined( level.flag[ "moving_chest_now" ] ) && flag( "moving_chest_now" ) ) if ( isdefined( level.flag[ "moving_chest_now" ] ) && flag( "moving_chest_now" ) )
{ {
eObj.sreason = "chest is moving!"; eObj.sreason = "chest is moving!";
return; return;
} }
waittillframeend; waittillframeend;
weap = weapon_spawn_org.weapon_string; weap = weapon_spawn_org.weapon_string;
// weapon is done cooking, grabit! // weapon is done cooking, grabit!
self SetPriorityObjective(); self SetPriorityObjective();
// go to box // go to box
self thread WatchToGoToChest( chest ); self thread WatchToGoToChest( chest );
self SetScriptGoal( org, 32 ); self SetScriptGoal( org, 32 );
result = self waittill_any_return( "goal", "bad_path", "new_goal" ); result = self waittill_any_return( "goal", "bad_path", "new_goal" );
if ( result != "goal" ) if ( result != "goal" )
{ {
eObj.sreason = "didn't go to chest"; eObj.sreason = "didn't go to chest";
return; return;
} }
if ( !self istouching( chest ) && !chest PointInsideUseTrigger( self.origin ) ) if ( !self istouching( chest ) && !chest PointInsideUseTrigger( self.origin ) )
{ {
eObj.sreason = "not touching chest"; eObj.sreason = "not touching chest";
return; return;
} }
// ok we are touching weapon, lets look at it // ok we are touching weapon, lets look at it
self SetScriptAimPos( chest.origin ); self SetScriptAimPos( chest.origin );
// wait to look at it // wait to look at it
wait 1; wait 1;
// press use // press use
self thread BotPressUse( 0.15 ); self thread BotPressUse( 0.15 );
wait 0.1; wait 0.1;
// complete! // complete!
eObj.sreason = "completed " + weap; eObj.sreason = "completed " + weap;
eObj.bwassuccessful = true; eObj.bwassuccessful = true;

View File

@ -5,15 +5,15 @@
CreateObjectiveForManger( sName, fpFinder, fpPriorty, fpExecuter, iProcessRate ) CreateObjectiveForManger( sName, fpFinder, fpPriorty, fpExecuter, iProcessRate )
{ {
Answer = spawnstruct(); Answer = spawnstruct();
Answer.sname = sName; Answer.sname = sName;
Answer.fpfinder = fpFinder; Answer.fpfinder = fpFinder;
Answer.fpexecuter = fpExecuter; Answer.fpexecuter = fpExecuter;
Answer.fppriorty = fpPriorty; Answer.fppriorty = fpPriorty;
Answer.abotprocesstimes = []; Answer.abotprocesstimes = [];
Answer.iprocessrate = iProcessRate; Answer.iprocessrate = iProcessRate;
return Answer; return Answer;
} }
@ -25,16 +25,16 @@ CreateFinderObjectiveEZ( eObj, eEnt )
CreateFinderObjective( eObj, sName, eEnt, fPriority ) CreateFinderObjective( eObj, sName, eEnt, fPriority )
{ {
Answer = spawnstruct(); Answer = spawnstruct();
Answer.eparentobj = eObj; Answer.eparentobj = eObj;
Answer.sname = sName; Answer.sname = sName;
Answer.eent = eEnt; Answer.eent = eEnt;
Answer.fpriority = fPriority; Answer.fpriority = fPriority;
Answer.guid = eEnt getentitynumber(); Answer.guid = eEnt getentitynumber();
Answer.bwassuccessful = false; Answer.bwassuccessful = false;
Answer.sreason = "canceled"; Answer.sreason = "canceled";
return Answer; return Answer;
} }
@ -44,18 +44,18 @@ GetBotsAmountForEntity( eEnt )
{ {
eEnt.bots = 0; eEnt.bots = 0;
} }
return eEnt.bots; return eEnt.bots;
} }
IncrementBotsForEntity( eEnt ) IncrementBotsForEntity( eEnt )
{ {
self endon( "bots_for_entity_cleanup" ); self endon( "bots_for_entity_cleanup" );
eEnt.bots++; eEnt.bots++;
self waittill_either( "disconnect", "zombified" ); self waittill_either( "disconnect", "zombified" );
if ( isdefined( eEnt ) ) if ( isdefined( eEnt ) )
{ {
eEnt.bots--; eEnt.bots--;
@ -65,7 +65,7 @@ IncrementBotsForEntity( eEnt )
DecrementBotsForEntity( eEnt ) DecrementBotsForEntity( eEnt )
{ {
self notify( "bots_for_entity_cleanup" ); self notify( "bots_for_entity_cleanup" );
if ( isdefined( eEnt ) ) if ( isdefined( eEnt ) )
{ {
eEnt.bots--; eEnt.bots--;
@ -93,7 +93,7 @@ GetBotObjectiveEnt()
{ {
return undefined; return undefined;
} }
return self GetBotObjective().eent; return self GetBotObjective().eent;
} }

View File

@ -6,32 +6,32 @@
Finder( eObj ) Finder( eObj )
{ {
answer = []; answer = [];
if ( self inLastStand() ) if ( self inLastStand() )
{ {
return answer; return answer;
} }
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 )
{ {
return answer; return answer;
} }
weapons = self getweaponslist(); weapons = self getweaponslist();
// TODO check if need a new weapon, rate weapons too is better then current etc // TODO check if need a new weapon, rate weapons too is better then current etc
for ( i = 0; i < weapon_spawns.size; i++ ) for ( i = 0; i < weapon_spawns.size; i++ )
{ {
player_has_weapon = false; player_has_weapon = false;
if ( !isdefined( weapon_spawns[ i ].zombie_weapon_upgrade ) ) if ( !isdefined( weapon_spawns[ i ].zombie_weapon_upgrade ) )
{ {
continue; continue;
} }
for ( h = 0; h < weapons.size; h++ ) for ( h = 0; h < weapons.size; h++ )
{ {
if ( weapons[ h ] == weapon_spawns[ i ].zombie_weapon_upgrade ) if ( weapons[ h ] == weapon_spawns[ i ].zombie_weapon_upgrade )
@ -39,13 +39,13 @@ Finder( eObj )
player_has_weapon = true; player_has_weapon = true;
} }
} }
is_grenade = ( weapontype( weapon_spawns[ i ].zombie_weapon_upgrade ) == "grenade" ); is_grenade = ( weapontype( weapon_spawns[ i ].zombie_weapon_upgrade ) == "grenade" );
if ( !player_has_weapon || is_grenade ) if ( !player_has_weapon || is_grenade )
{ {
func = BotBuiltinGetFunction( "maps/_zombiemode_weapons", "get_weapon_cost" ); func = BotBuiltinGetFunction( "maps/_zombiemode_weapons", "get_weapon_cost" );
if ( self.score < [[ func ]]( weapon_spawns[ i ].zombie_weapon_upgrade ) ) if ( self.score < [[ func ]]( weapon_spawns[ i ].zombie_weapon_upgrade ) )
{ {
continue; continue;
@ -54,69 +54,69 @@ Finder( eObj )
else else
{ {
func = BotBuiltinGetFunction( "maps/_zombiemode_weapons", "get_ammo_cost" ); func = BotBuiltinGetFunction( "maps/_zombiemode_weapons", "get_ammo_cost" );
if ( self.score < [[ func ]]( weapon_spawns[ i ].zombie_weapon_upgrade ) ) if ( self.score < [[ func ]]( weapon_spawns[ i ].zombie_weapon_upgrade ) )
{ {
continue; continue;
} }
} }
model = weapon_spawns[ i ]; model = weapon_spawns[ i ];
if ( isdefined( weapon_spawns[ i ].target ) ) if ( isdefined( weapon_spawns[ i ].target ) )
{ {
model = getent( weapon_spawns[ i ].target, "targetname" ); model = getent( weapon_spawns[ i ].target, "targetname" );
} }
if ( !isdefined( model ) ) if ( !isdefined( model ) )
{ {
continue; continue;
} }
org = self getOffset( model, weapon_spawns[ i ] ); org = self getOffset( model, weapon_spawns[ i ] );
if ( GetPathIsInaccessible( self.origin, org ) ) if ( GetPathIsInaccessible( self.origin, org ) )
{ {
continue; continue;
} }
answer[ answer.size ] = self CreateFinderObjectiveEZ( eObj, weapon_spawns[ i ] ); answer[ answer.size ] = self CreateFinderObjectiveEZ( eObj, weapon_spawns[ i ] );
} }
return answer; return answer;
} }
getOffset( model, weapon ) getOffset( model, weapon )
{ {
org = model get_angle_offset_node( 40, ( 0, -90, 0 ), ( 0, 0, 1 ) ); org = model get_angle_offset_node( 40, ( 0, -90, 0 ), ( 0, 0, 1 ) );
test_org = ( org[ 0 ], org[ 1 ], weapon.origin[ 2 ] ); test_org = ( org[ 0 ], org[ 1 ], weapon.origin[ 2 ] );
if ( !weapon PointInsideUseTrigger( test_org ) ) if ( !weapon PointInsideUseTrigger( test_org ) )
{ {
org = model get_angle_offset_node( 40, ( 0, 90, 0 ), ( 0, 0, 1 ) ); org = model get_angle_offset_node( 40, ( 0, 90, 0 ), ( 0, 0, 1 ) );
} }
return org; return org;
} }
Priority( eObj, eEnt ) Priority( eObj, eEnt )
{ {
// TODO: check weallweapon type // TODO: check weallweapon type
base_priority = 0; base_priority = 0;
base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 0, 800, 1, -2 ); base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 0, 800, 1, -2 );
if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt )
{ {
base_priority -= 1; base_priority -= 1;
} }
if ( issubstr( eEnt.zombie_weapon_upgrade, "kar98k" ) || issubstr( eEnt.zombie_weapon_upgrade, "type99" ) ) if ( issubstr( eEnt.zombie_weapon_upgrade, "kar98k" ) || issubstr( eEnt.zombie_weapon_upgrade, "type99" ) )
{ {
base_priority -= 999; base_priority -= 999;
} }
return base_priority; return base_priority;
} }
@ -124,18 +124,18 @@ Executer( eObj )
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
weapon = eObj.eent; weapon = eObj.eent;
self thread WatchForCancel( weapon ); self thread WatchForCancel( weapon );
self GoDoWallweapon( eObj ); self GoDoWallweapon( eObj );
self WatchForCancelCleanup(); self WatchForCancelCleanup();
self ClearScriptAimPos(); self ClearScriptAimPos();
self ClearScriptGoal(); self ClearScriptGoal();
self ClearPriorityObjective(); self ClearPriorityObjective();
self CompletedObjective( eObj.bwassuccessful, eObj.sreason ); self CompletedObjective( eObj.bwassuccessful, eObj.sreason );
} }
@ -149,11 +149,11 @@ WatchForCancel( weapon )
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "zombified" ); self endon( "zombified" );
self endon( "WatchForCancelWallweapon" ); self endon( "WatchForCancelWallweapon" );
for ( ;; ) for ( ;; )
{ {
wait 0.05; wait 0.05;
if ( self inLastStand() ) if ( self inLastStand() )
{ {
self CancelObjective( "self inLastStand()" ); self CancelObjective( "self inLastStand()" );
@ -170,11 +170,11 @@ WatchToGoToWeapon( weapon )
self endon( "goal" ); self endon( "goal" );
self endon( "bad_path" ); self endon( "bad_path" );
self endon( "new_goal" ); self endon( "new_goal" );
for ( ;; ) for ( ;; )
{ {
wait 0.05; wait 0.05;
if ( self istouching( weapon ) || weapon PointInsideUseTrigger( self.origin ) ) if ( self istouching( weapon ) || weapon PointInsideUseTrigger( self.origin ) )
{ {
self notify( "goal" ); self notify( "goal" );
@ -186,52 +186,52 @@ WatchToGoToWeapon( weapon )
GoDoWallweapon( eObj ) GoDoWallweapon( eObj )
{ {
self endon( "cancel_bot_objective" ); self endon( "cancel_bot_objective" );
weapon = eObj.eent; weapon = eObj.eent;
model = weapon; model = weapon;
if ( isdefined( weapon.target ) ) if ( isdefined( weapon.target ) )
{ {
model = getent( weapon.target, "targetname" ); model = getent( weapon.target, "targetname" );
} }
org = self getOffset( model, weapon ); org = self getOffset( model, weapon );
weap = self getcurrentweapon(); weap = self getcurrentweapon();
if ( weap == "none" || !self getammocount( weap ) ) if ( weap == "none" || !self getammocount( weap ) )
{ {
self SetPriorityObjective(); self SetPriorityObjective();
} }
// go to weapon // go to weapon
self thread WatchToGoToWeapon( weapon ); self thread WatchToGoToWeapon( weapon );
self SetScriptGoal( org, 32 ); self SetScriptGoal( org, 32 );
result = self waittill_any_return( "goal", "bad_path", "new_goal" ); result = self waittill_any_return( "goal", "bad_path", "new_goal" );
if ( result != "goal" ) if ( result != "goal" )
{ {
eObj.sreason = "didn't go to weapon"; eObj.sreason = "didn't go to weapon";
return; return;
} }
if ( !self istouching( weapon ) && !weapon PointInsideUseTrigger( self.origin ) ) if ( !self istouching( weapon ) && !weapon PointInsideUseTrigger( self.origin ) )
{ {
eObj.sreason = "not touching weapon"; eObj.sreason = "not touching weapon";
return; return;
} }
// ok we are touching weapon, lets look at it // ok we are touching weapon, lets look at it
self SetScriptAimPos( weapon.origin ); self SetScriptAimPos( weapon.origin );
// wait to look at it // wait to look at it
wait 1; wait 1;
// press use // press use
self thread BotPressUse( 0.15 ); self thread BotPressUse( 0.15 );
wait 0.1; wait 0.1;
eObj.sreason = "completed"; eObj.sreason = "completed";
eObj.bwassuccessful = true; eObj.bwassuccessful = true;
} }