From dd1ea5ca07306ae7948ce594ea1abdc7c6446734 Mon Sep 17 00:00:00 2001 From: ineed bots Date: Thu, 4 Jan 2024 16:02:38 -0600 Subject: [PATCH] fmt --- .astylerc | 14 +- .editorconfig | 2 +- maps/bots/_bot.gsc | 210 +++---- maps/bots/_bot_debug.gsc | 96 +-- maps/bots/_bot_internal.gsc | 784 ++++++++++++------------ maps/bots/_bot_script.gsc | 116 ++-- maps/bots/_bot_utility.gsc | 352 +++++------ maps/bots/objectives/_manager.gsc | 58 +- maps/bots/objectives/_perkmachine.gsc | 104 ++-- maps/bots/objectives/_powerup.gsc | 50 +- maps/bots/objectives/_revive.gsc | 76 +-- maps/bots/objectives/_treasurechest.gsc | 114 ++-- maps/bots/objectives/_utility.gsc | 24 +- maps/bots/objectives/_wallweapon.gsc | 96 +-- 14 files changed, 1051 insertions(+), 1045 deletions(-) diff --git a/.astylerc b/.astylerc index c0e7be1..4e00611 100644 --- a/.astylerc +++ b/.astylerc @@ -1,21 +1,27 @@ # try to mimic the original gsc provided +# mode=ghc mode=c style=allman -indent=tab +indent=force-tab=2 lineend=windows pad-oper pad-paren-in pad-header - -# delete-empty-lines +# pad-brackets-in +fill-empty-lines +squeeze-lines=2 +squeeze-ws +break-one-line-headers +add-braces +remove-comment-prefix break-blocks -# remove-braces indent-switches indent-cases indent-after-parens +indent-col1-comments remove-comment-prefix diff --git a/.editorconfig b/.editorconfig index bb97c78..be8eb14 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,7 +4,7 @@ root = true indent_style = tab indent_size = 2 charset = latin1 -trim_trailing_whitespace = true +trim_trailing_whitespace = false insert_final_newline = true [*.md] diff --git a/maps/bots/_bot.gsc b/maps/bots/_bot.gsc index c03b1b3..170327f 100644 --- a/maps/bots/_bot.gsc +++ b/maps/bots/_bot.gsc @@ -8,135 +8,135 @@ init() { level.bw_version = "z0.1"; - + if ( getdvar( "bots_main" ) == "" ) { setdvar( "bots_main", true ); } - + if ( !getdvarint( "bots_main" ) ) { return; } - + if ( !wait_for_builtins() ) { println( "FATAL: NO BUILT-INS FOR BOTS" ); } - + thread load_waypoints(); thread hook_callbacks(); - + 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" ) == "" ) { - 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" ) == "" ) { - 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" ) == "" ) { - 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" ) == "" ) { - 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" ) == "" ) { - 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" ) == "" ) { - 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" ) == "" ) { - 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" ) == "" ) { - 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" ) == "" ) { - 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" ) == "" ) { 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 { setdvar( "bots_loadout_rank", -1 ); } - + if ( getdvar( "bots_loadout_prestige" ) == "" ) // what pretige the bots will be, -1 is the players, -2 is random { setdvar( "bots_loadout_prestige", -1 ); } - + if ( getdvar( "bots_play_move" ) == "" ) // bots move { setdvar( "bots_play_move", true ); } - + if ( getdvar( "bots_play_knife" ) == "" ) // bots knife { setdvar( "bots_play_knife", true ); } - + if ( getdvar( "bots_play_fire" ) == "" ) // bots fire { setdvar( "bots_play_fire", true ); } - + if ( getdvar( "bots_play_nade" ) == "" ) // bots grenade { setdvar( "bots_play_nade", true ); } - + if ( getdvar( "bots_play_ads" ) == "" ) // bot ads { setdvar( "bots_play_ads", true ); } - + if ( getdvar( "bots_play_aim" ) == "" ) { setdvar( "bots_play_aim", true ); } - + if ( getdvar( "bots_t8_mode" ) == "" ) { setdvar( "bots_t8_mode", false ); } - + if ( getdvar( "bots_play_opendoors" ) == "" ) { setdvar( "bots_play_opendoors", true ); } - + if ( !isdefined( game[ "botWarfare" ] ) ) { game[ "botWarfare" ] = true; } - + level.bots_minsprintdistance = 315; level.bots_minsprintdistance *= level.bots_minsprintdistance; level.bots_mingrenadedistance = 256; @@ -151,10 +151,10 @@ init() level.bots_noadsdistance *= level.bots_noadsdistance; level.bots_maxshotgundistance = 500; level.bots_maxshotgundistance *= level.bots_maxshotgundistance; - + level.players = []; level.bots = []; - + level.bots_fullautoguns = []; level.bots_fullautoguns[ "thompson" ] = true; level.bots_fullautoguns[ "mp40" ] = true; @@ -167,10 +167,10 @@ init() level.bots_fullautoguns[ "bar" ] = true; level.bots_fullautoguns[ "fg42" ] = true; level.bots_fullautoguns[ "type99lmg" ] = true; - + level thread onPlayerConnect(); level thread handleBots(); - + level thread maps\bots\_bot_script::bot_script_init(); } @@ -181,21 +181,21 @@ handleBots() { level thread diffBots(); level addBots(); - + while ( !isdefined( level.intermission ) || !level.intermission ) { wait 0.05; } - + setdvar( "bots_manage_add", getBotArray().size ); - + if ( !getdvarint( "bots_main_kickBotsAtEnd" ) ) { return; } - + bots = getBotArray(); - + for ( i = 0; i < bots.size; i++ ) { BotBuiltinCmdExec( "clientkick " + bots[ i ] getentitynumber() ); @@ -218,13 +218,13 @@ onPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, iDamage = int( iDamage * 0.1 ); } } - + 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_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 ); } @@ -234,7 +234,7 @@ onActorDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, { iDamage += int( self.maxhealth * randomfloatrange( 0.25, 1.25 ) ); } - + self [[ level.prevcallbackactordamage ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, iModelIndex, iTimeOffset ); } @@ -246,7 +246,7 @@ hook_callbacks() wait 0.05; level.prevcallbackplayerdamage = level.callbackplayerdamage; level.callbackplayerdamage = ::onPlayerDamage; - + level.prevcallbackactordamage = level.callbackactordamage; level.callbackactordamage = ::onActorDamage; } @@ -259,7 +259,7 @@ onPlayerConnect() for ( ;; ) { level waittill( "connected", player ); - + player thread connected(); } } @@ -270,7 +270,7 @@ onPlayerConnect() onDisconnectAll() { self waittill( "disconnect" ); - + level.players = array_remove( level.players, self ); } @@ -280,13 +280,13 @@ onDisconnectAll() onSpawnedAll() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "spawned_player" ); - + self.lastspawntime = gettime(); - + if ( getdvarint( "bots_main_debug" ) ) { self.score = 100000; @@ -300,7 +300,7 @@ onSpawnedAll() onDisconnect() { self waittill( "disconnect" ); - + level.bots = array_remove( level.bots, self ); } @@ -310,42 +310,42 @@ onDisconnect() connected() { self endon( "disconnect" ); - + if ( !isdefined( self.pers[ "bot_host" ] ) ) { self thread doHostCheck(); } - + level.players[ level.players.size ] = self; self thread onDisconnectAll(); - + self thread onSpawnedAll(); - + if ( !self is_bot() ) { return; } - + if ( !isdefined( self.pers[ "isBot" ] ) ) { // fast restart... self.pers[ "isBot" ] = true; } - + if ( !isdefined( self.pers[ "isBotWarfare" ] ) ) { self.pers[ "isBotWarfare" ] = true; self thread added(); } - + self thread maps\bots\_bot_internal::connected(); self thread maps\bots\_bot_script::connected(); - + level.bots[ level.bots.size ] = self; self thread onDisconnect(); - + level notify( "bot_connected", self ); - + self thread watchBotDebugEvent(); } @@ -355,50 +355,50 @@ connected() watchBotDebugEvent() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "bot_event", msg, str, b, c, d, e, f, g ); - + if ( getdvarint( "bots_main_debug" ) >= 2 ) { big_str = "Bot Warfare debug: " + self.playername + ": " + msg; - + if ( isdefined( str ) && isstring( str ) ) { big_str += ", " + str; } - + if ( isdefined( b ) && isstring( b ) ) { big_str += ", " + b; } - + if ( isdefined( c ) && isstring( c ) ) { big_str += ", " + c; } - + if ( isdefined( d ) && isstring( d ) ) { big_str += ", " + d; } - + if ( isdefined( e ) && isstring( e ) ) { big_str += ", " + e; } - + if ( isdefined( f ) && isstring( f ) ) { big_str += ", " + f; } - + if ( isdefined( g ) && isstring( g ) ) { big_str += ", " + g; } - + BotBuiltinPrintConsole( big_str ); } else if ( msg == "debug" && getdvarint( "bots_main_debug" ) ) @@ -414,7 +414,7 @@ watchBotDebugEvent() added() { self endon( "disconnect" ); - + self thread maps\bots\_bot_internal::added(); self thread maps\bots\_bot_script::added(); } @@ -425,7 +425,7 @@ added() add_bot() { bot = BotBuiltinAddTestClient(); - + if ( isdefined( bot ) ) { bot.pers[ "isBot" ] = true; @@ -442,28 +442,28 @@ diffBots_loop() var_hard = getdvarint( "bots_skill_hard" ); var_med = getdvarint( "bots_skill_med" ); var_skill = getdvarint( "bots_skill" ); - + hard = 0; med = 0; - + if ( var_skill == 8 ) { playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { player = level.players[ i ]; - + if ( !isdefined( player.pers[ "team" ] ) ) { continue; } - + if ( !player is_bot() ) { continue; } - + if ( hard < var_hard ) { hard++; @@ -483,16 +483,16 @@ diffBots_loop() else if ( var_skill != 0 && var_skill != 9 ) { playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { player = level.players[ i ]; - + if ( !player is_bot() ) { continue; } - + player.pers[ "bots" ][ "skill" ][ "base" ] = var_skill; } } @@ -506,7 +506,7 @@ diffBots() for ( ;; ) { wait 1.5; - + diffBots_loop(); } } @@ -517,41 +517,41 @@ diffBots() addBots_loop() { botsToAdd = getdvarint( "bots_manage_add" ); - + if ( botsToAdd > 0 ) { setdvar( "bots_manage_add", 0 ); - + if ( botsToAdd > 4 ) { botsToAdd = 4; } - + for ( ; botsToAdd > 0; botsToAdd-- ) { level add_bot(); wait 0.25; } } - + fillMode = getdvarint( "bots_manage_fill_mode" ); - + if ( fillMode == 2 || fillMode == 3 ) { setdvar( "bots_manage_fill", getGoodMapAmount() ); } - + fillAmount = getdvarint( "bots_manage_fill" ); - + players = 0; bots = 0; - + playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { player = level.players[ i ]; - + if ( player is_bot() ) { bots++; @@ -561,14 +561,14 @@ addBots_loop() players++; } } - + amount = bots; - + if ( fillMode == 0 || fillMode == 2 ) { amount += players; } - + if ( amount < fillAmount ) { setdvar( "bots_manage_add", 1 ); @@ -576,7 +576,7 @@ addBots_loop() else if ( amount > fillAmount && getdvarint( "bots_manage_fill_kick" ) ) { tempBot = getBotToKick(); - + if ( isdefined( tempBot ) ) { BotBuiltinCmdExec( "clientkick " + tempBot getentitynumber() ); @@ -590,13 +590,13 @@ addBots_loop() addBots() { level endon( "game_ended" ); - + bot_wait_for_host(); - + while ( !isdefined( level.intermission ) || !level.intermission ) { wait 1.5; - + addBots_loop(); } } diff --git a/maps/bots/_bot_debug.gsc b/maps/bots/_bot_debug.gsc index c69dc7a..5f2f90d 100644 --- a/maps/bots/_bot_debug.gsc +++ b/maps/bots/_bot_debug.gsc @@ -16,22 +16,22 @@ init() { setdvar( "bots_main_debug", 0 ); } - + if ( !getdvarint( "bots_main_debug" ) || !getdvarint( "bots_main_debug_wp_vis" ) ) { return; } - + if ( !getdvarint( "developer" ) ) { setdvar( "developer_script", 1 ); setdvar( "developer", 2 ); - + setdvar( "sv_mapRotation", "map " + getdvar( "mapname" ) ); exitlevel( false ); return; } - + setdvar( "bots_main", false ); setdvar( "bots_main_menu", false ); setdvar( "bots_manage_fill_mode", 0 ); @@ -39,29 +39,29 @@ init() setdvar( "bots_manage_add", 0 ); setdvar( "bots_manage_fill_kick", true ); setdvar( "bots_manage_fill_spec", true ); - + if ( getdvar( "bots_main_debug_distance" ) == "" ) { setdvar( "bots_main_debug_distance", 512.0 ); } - + if ( getdvar( "bots_main_debug_cone" ) == "" ) { setdvar( "bots_main_debug_cone", 0.65 ); } - + if ( getdvar( "bots_main_debug_minDist" ) == "" ) { setdvar( "bots_main_debug_minDist", 32.0 ); } - + if ( getdvar( "bots_main_debug_drawThrough" ) == "" ) { setdvar( "bots_main_debug_drawThrough", false ); } - + thread load_waypoints(); - + level waittill( "connected", player ); player thread onPlayerSpawned(); } @@ -69,7 +69,7 @@ init() onPlayerSpawned() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "spawned_player" ); @@ -81,7 +81,7 @@ beginDebug() { self endon( "disconnect" ); self endon( "zombified" ); - + self thread debug(); self thread watch_for_unlink(); self thread textScroll( "^1xDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD" ); @@ -91,31 +91,31 @@ watch_for_unlink() { self endon( "disconnect" ); self endon( "zombified" ); - + self BotBuiltinNotifyOnPlayerCommand( "+smoke", "toggle_unlink" ); - + for ( ;; ) { self waittill( "toggle_unlink" ); - + if ( self.closest == -1 ) { self iprintln( "not close to node" ); continue; } - + firstwp = level.waypoints[ self.closest ]; - + self iprintln( "wp selected for unlink: " + firstwp BotBuiltinGetNodeNumber() ); - + self waittill( "toggle_unlink" ); - + if ( self.closest == -1 ) { self iprintln( "not close to node" ); continue; } - + self toggle_link( firstwp, level.waypoints[ self.closest ] ); } } @@ -129,7 +129,7 @@ array_contains( arr, it ) return true; } } - + return false; } @@ -138,10 +138,10 @@ toggle_link( firstwp, secondwp ) // check if it exists key = firstwp BotBuiltinGetNodeNumber() + ""; secnum = secondwp BotBuiltinGetNodeNumber(); - + links = firstwp BotBuiltinGetLinkedNodes(); linked = false; - + for ( i = 0; i < links.size; i++ ) { if ( links[ i ] BotBuiltinGetNodeNumber() == secnum ) @@ -150,25 +150,25 @@ toggle_link( firstwp, secondwp ) break; } } - + if ( !linked ) { self iprintln( "no link: " + key + " " + secnum ); return; } - + if ( key == secnum + "" ) { self iprintln( "same unlink: " + key + " " + secnum ); return; } - + if ( isdefined( level.bot_ignore_links[ key ] ) && array_contains( level.bot_ignore_links[ key ], secnum ) ) { a = level.bot_ignore_links[ key ]; - + a = array_remove( a, secnum ); - + if ( a.size <= 0 ) { level.bot_ignore_links[ key ] = undefined; @@ -177,7 +177,7 @@ toggle_link( firstwp, secondwp ) { level.bot_ignore_links[ key ] = a; } - + self iprintln( "removed unlink: " + key + " " + secnum ); BotBuiltinPrintConsole( "toggle_link: add: " + key + " " + secnum ); } @@ -187,12 +187,12 @@ toggle_link( firstwp, secondwp ) { level.bot_ignore_links[ key ] = []; } - + a = level.bot_ignore_links[ key ]; a[ a.size ] = secnum; - + level.bot_ignore_links[ key ] = a; - + self iprintln( "added unlink: " + key + " " + secnum ); BotBuiltinPrintConsole( "toggle_link: del: " + key + " " + secnum ); } @@ -202,38 +202,38 @@ debug() { self endon( "disconnect" ); self endon( "zombified" ); - + self.closest = -1; - + for ( ;; ) { wait 0.05; - + closest = -1; myEye = self gettagorigin( "j_head" ); myAngles = self getplayerangles(); - + for ( i = 0; i < level.waypointcount; i++ ) { if ( closest == -1 || closer( self.origin, level.waypoints[ i ].origin, level.waypoints[ closest ].origin ) ) { closest = i; } - + 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" ) ) { linked = level.waypoints[ i ] BotBuiltinGetLinkedNodes(); node_num_str = level.waypoints[ i ] BotBuiltinGetNodeNumber() + ""; - + for ( h = linked.size - 1; h >= 0; h-- ) { if ( isdefined( level.bot_ignore_links[ node_num_str ] ) ) { found = false; this_node_num = linked[ h ] BotBuiltinGetNodeNumber(); - + 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 ) @@ -242,18 +242,18 @@ debug() break; } } - + if ( found ) { continue; } } - + line( wpOrg, linked[ h ].origin + ( 0, 0, 25 ), ( 1, 0, 1 ) ); } - + print3d( wpOrg, node_num_str, ( 1, 0, 0 ), 2 ); - + if ( isdefined( level.waypoints[ i ].animscript ) ) { 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 ) { self.closest = closest; @@ -285,15 +285,15 @@ textScroll( string ) self endon( "zombified" ); self endon( "disconnect" ); // thanks ActionScript - + back = createbar( ( 0, 0, 0 ), 1000, 30 ); back setpoint( "CENTER", undefined, 0, 220 ); self thread destroyOnDeath( back ); - + text = createfontstring( "default", 1.5 ); text settext( string ); self thread destroyOnDeath( text ); - + for ( ;; ) { text setpoint( "CENTER", undefined, 1200, 220 ); diff --git a/maps/bots/_bot_internal.gsc b/maps/bots/_bot_internal.gsc index 414a657..814c084 100644 --- a/maps/bots/_bot_internal.gsc +++ b/maps/bots/_bot_internal.gsc @@ -9,9 +9,9 @@ added() { self endon( "disconnect" ); - + self.pers[ "bots" ] = []; - + self.pers[ "bots" ][ "skill" ] = []; self.pers[ "bots" ][ "skill" ][ "base" ] = 7; // a base knownledge of the bot self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.05; // how long it takes for a bot to aim to a location @@ -33,7 +33,7 @@ added() self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_head"; // a list of comma seperated bones the bot will aim at self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; // a factor of how much ads to reduce when adsing self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; // a factor of how much more aimspeed delay to add - + self.pers[ "bots" ][ "behavior" ] = []; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 50; // percentage of how often the bot strafes a target self.pers[ "bots" ][ "behavior" ][ "nade" ] = 50; // percentage of how often the bot will grenade @@ -43,7 +43,7 @@ added() self.pers[ "bots" ][ "behavior" ][ "crouch" ] = 10; // percentage of how often the bot will crouch self.pers[ "bots" ][ "behavior" ][ "switch" ] = 1; // percentage of how often the bot will switch weapons self.pers[ "bots" ][ "behavior" ][ "jump" ] = 100; // percentage of how often the bot will jumpshot and dropshot - + self.pers[ "bots" ][ "behavior" ][ "quickscope" ] = false; // is a quickscoper self.pers[ "bots" ][ "behavior" ][ "initswitch" ] = 10; // percentage of how often the bot will switch weapons on spawn } @@ -61,12 +61,12 @@ resetBotVars() self.bot.after_target = undefined; self.bot.after_target_pos = undefined; self.bot.moveto = self.origin; - + self.bot.script_aimpos = undefined; - + self.bot.script_goal = undefined; self.bot.script_goal_dist = 0.0; - + self.bot.next_wp = -1; self.bot.second_next_wp = -1; self.bot.towards_goal = undefined; @@ -76,7 +76,7 @@ resetBotVars() self.bot.wantsprint = false; self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; - + self.bot.isfrozen = false; self.bot.sprintendtime = -1; self.bot.isreloading = false; @@ -88,19 +88,19 @@ resetBotVars() self.bot.isknifing = false; self.bot.isknifingafter = false; self.bot.knifing_target = undefined; - + self.bot.semi_time = false; self.bot.jump_time = undefined; self.bot.last_fire_time = -1; - + self.bot.is_cur_full_auto = false; self.bot.cur_weap_dist_multi = 1; self.bot.is_cur_sniper = false; - + self.bot.prio_objective = false; - + self.bot.rand = randomint( 100 ); - + self BotBuiltinBotStop(); } @@ -118,10 +118,10 @@ onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoin connected() { self endon( "disconnect" ); - + self.bot = spawnstruct(); self resetBotVars(); - + self thread onPlayerSpawned(); } @@ -131,17 +131,17 @@ connected() onPlayerSpawned() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "spawned_player" ); - + self resetBotVars(); self thread onWeaponChange(); - + self thread reload_watch(); self thread sprint_watch(); - + self thread spawned(); } } @@ -155,12 +155,12 @@ IsWeapSniper( weap ) { return false; } - + if ( false /*maps\mp\gametypes\_missions::getWeaponClass( weap ) != "weapon_sniper"*/ ) { return false; } - + return true; } @@ -171,13 +171,13 @@ onWeaponChange() { self endon( "disconnect" ); self endon( "zombified" ); - + first = true; - + for ( ;; ) { newWeapon = undefined; - + if ( first ) { first = false; @@ -187,7 +187,7 @@ onWeaponChange() { self waittill( "weapon_change", newWeapon ); } - + self.bot.is_cur_full_auto = WeaponIsFullAuto( newWeapon ); self.bot.cur_weap_dist_multi = SetWeaponDistMulti( newWeapon ); self.bot.is_cur_sniper = IsWeapSniper( newWeapon ); @@ -203,18 +203,18 @@ SetWeaponDistMulti( weap ) { return 1; } - + switch ( weaponclass( weap ) ) { case "rifle": return 0.9; - + case "smg": return 0.7; - + case "pistol": return 0.5; - + default: return 1; } @@ -227,11 +227,11 @@ reload_watch() { self endon( "disconnect" ); self endon( "zombified" ); - + for ( ;; ) { self waittill( "reload_start" ); - + self reload_watch_loop(); } } @@ -242,29 +242,29 @@ reload_watch() reload_watch_loop() { self.bot.isreloading = true; - + while ( true ) { ret = self waittill_any_timeout( 7.5, "reload" ); - + if ( ret == "timeout" ) { break; } - + weap = self getcurrentweapon(); - + if ( weap == "none" ) { break; } - + if ( self getweaponammoclip( weap ) >= weaponclipsize( weap ) ) { break; } } - + self.bot.isreloading = false; } @@ -275,7 +275,7 @@ sprint_watch() { self endon( "disconnect" ); self endon( "zombified" ); - + for ( ;; ) { self waittill( "sprint_begin" ); @@ -293,9 +293,9 @@ spawned() { self endon( "disconnect" ); self endon( "zombified" ); - + wait self.pers[ "bots" ][ "skill" ][ "spawn_time" ]; - + self thread doBotMovement(); self thread walk(); self thread target(); @@ -306,7 +306,7 @@ spawned() self thread stance(); self thread onNewEnemy(); self thread check_reload(); - + self notify( "bot_spawned" ); } @@ -317,26 +317,26 @@ onNewEnemy() { self endon( "disconnect" ); self endon( "zombified" ); - + for ( ;; ) { self waittill( "new_enemy" ); - + if ( !isdefined( self.bot.target ) ) { continue; } - + if ( !isdefined( self.bot.target.entity ) || !isai( self.bot.target.entity ) ) { continue; } - + if ( self.bot.target.didlook ) { continue; } - + self thread watchToLook(); } } @@ -349,78 +349,78 @@ watchToLook() self endon( "disconnect" ); self endon( "zombified" ); self endon( "new_enemy" ); - + for ( ;; ) { while ( isdefined( self.bot.target ) && self.bot.target.didlook ) { wait 0.05; } - + while ( isdefined( self.bot.target ) && self.bot.target.no_trace_time ) { wait 0.05; } - + if ( !isdefined( self.bot.target ) ) { break; } - + self.bot.target.didlook = true; - + if ( self.bot.isfrozen ) { continue; } - + if ( self.bot.target.dist > level.bots_maxshotgundistance * 2 ) { continue; } - + if ( self.bot.target.dist <= level.bots_maxknifedistance ) { continue; } - + if ( !self canFire( self getcurrentweapon() ) ) { continue; } - + if ( !self isInRange( self.bot.target.dist, self getcurrentweapon() ) ) { continue; } - + if ( self.bot.is_cur_sniper ) { continue; } - + if ( randomint( 100 ) > self.pers[ "bots" ][ "behavior" ][ "jump" ] ) { continue; } - + if ( !getdvarint( "bots_play_jumpdrop" ) ) { continue; } - + if ( isdefined( self.bot.jump_time ) && gettime() - self.bot.jump_time <= 5000 ) { continue; } - + if ( self.bot.target.rand <= self.pers[ "bots" ][ "behavior" ][ "strafe" ] ) { if ( self getstance() != "stand" ) { continue; } - + self.bot.jump_time = gettime(); self jump(); } @@ -430,7 +430,7 @@ watchToLook() { continue; } - + self.bot.jump_time = gettime(); self prone(); self notify( "kill_goal" ); @@ -446,42 +446,42 @@ watchToLook() stance_loop() { self.bot.climbing = false; - + if ( self.bot.isfrozen ) { return; } - + toStance = "stand"; - + if ( self.bot.next_wp != -1 ) { toStance = level.waypoints[ self.bot.next_wp ].type; } - + if ( !isdefined( toStance ) ) { toStance = "stand"; } - + if ( toStance == "stand" && randomint( 100 ) <= self.pers[ "bots" ][ "behavior" ][ "crouch" ] ) { toStance = "crouch"; } - + if ( toStance == "climb" ) { self.bot.climbing = true; toStance = "stand"; } - + if ( toStance != "stand" && toStance != "crouch" && toStance != "prone" ) { toStance = "crouch"; } - + toStance = "stand"; // Hack to make the bots never crouch - + if ( toStance == "stand" ) { self stand(); @@ -494,46 +494,46 @@ stance_loop() { self prone(); } - + curweap = self getcurrentweapon(); time = gettime(); chance = self.pers[ "bots" ][ "behavior" ][ "sprint" ]; - + if ( time - self.lastspawntime < 5000 ) { chance *= 2; } - + if ( isdefined( self.bot.script_goal ) && distancesquared( self.origin, self.bot.script_goal ) > 256 * 256 ) { chance *= 2; } - + if ( toStance != "stand" || self.bot.isreloading || self.bot.issprinting || self.bot.isfraggingafter || self.bot.issmokingafter ) { return; } - + if ( randomint( 100 ) > chance ) { return; } - + if ( isdefined( self.bot.target ) && self canFire( curweap ) && self isInRange( self.bot.target.dist, curweap ) ) { return; } - + if ( self.bot.sprintendtime != -1 && time - self.bot.sprintendtime < 2000 ) { return; } - + if ( !isdefined( self.bot.towards_goal ) || distancesquared( self.origin, physicstrace( self geteye(), self geteye() + anglestoforward( self getplayerangles() ) * 1024, false, undefined ) ) < level.bots_minsprintdistance || getConeDot( self.bot.towards_goal, self.origin, self getplayerangles() ) < 0.75 ) { return; } - + self thread sprint(); self thread setBotWantSprint(); } @@ -545,14 +545,14 @@ setBotWantSprint() { self endon( "disconnect" ); self endon( "zombified" ); - + self notify( "setBotWantSprint" ); self endon( "setBotWantSprint" ); - + self.bot.wantsprint = true; - + self waittill_notify_or_timeout( "kill_goal", 10 ); - + self.bot.wantsprint = false; } @@ -563,11 +563,11 @@ stance() { self endon( "disconnect" ); self endon( "zombified" ); - + for ( ;; ) { self waittill_either( "finished_static_waypoints", "new_static_waypoint" ); - + self stance_loop(); } } @@ -579,7 +579,7 @@ check_reload() { self endon( "disconnect" ); self endon( "zombified" ); - + for ( ;; ) { self waittill_notify_or_timeout( "weapon_fired", 5 ); @@ -595,29 +595,29 @@ reload_thread() self endon( "disconnect" ); self endon( "zombified" ); self endon( "weapon_fired" ); - + wait 2.5; - + if ( isdefined( self.bot.target ) || self.bot.isreloading || self.bot.isfraggingafter || self.bot.issmokingafter || self.bot.isfrozen ) { return; } - + cur = self getcurrentweapon(); - + if ( cur == "" || cur == "none" ) { return; } - + if ( isweaponcliponly( cur ) || !self getweaponammostock( cur ) ) { return; } - + maxsize = weaponclipsize( cur ); cursize = self getweaponammoclip( cur ); - + if ( cursize / maxsize < 0.5 ) { self thread reload(); @@ -628,17 +628,17 @@ target_cleanup() { self endon( "disconnect" ); self endon( "zombified" ); - + while ( true ) { wait 10; curTime = gettime(); targetKeys = getarraykeys( self.bot.targets ); - + for ( i = 0; i < targetKeys.size; i++ ) { obj = self.bot.targets[ targetKeys[ i ] ]; - + if ( ( curTime - obj.time ) > 30000 ) { self.bot.targets[ targetKeys[ i ] ] = undefined; @@ -654,16 +654,16 @@ watchHoldBreath() { self endon( "disconnect" ); self endon( "zombified" ); - + for ( ;; ) { wait 1; - + if ( self.bot.isfrozen ) { continue; } - + self holdbreath( self playerads() > 0 ); } } @@ -675,14 +675,14 @@ doBotMovement() { self endon( "disconnect" ); self endon( "zombified" ); - + data = spawnstruct(); data.wasmantling = false; - + for ( data.i = 0; true; data.i += 0.05 ) { wait 0.05; - + waittillframeend; self doBotMovement_loop( data ); } @@ -696,36 +696,36 @@ doBotMovement_loop( data ) move_To = self.bot.moveto; angles = self getplayerangles(); dir = ( 0, 0, 0 ); - + if ( distancesquared( self.origin, move_To ) >= 49 ) { cosa = cos( 0 - angles[ 1 ] ); sina = sin( 0 - angles[ 1 ] ); - + // get the direction dir = move_To - self.origin; - + // rotate our direction according to our angles dir = ( dir[ 0 ] * cosa - dir[ 1 ] * sina, - dir[ 0 ] * sina + dir[ 1 ] * cosa, - 0 ); - + dir[ 0 ] * sina + dir[ 1 ] * cosa, + 0 ); + // make the length 127 dir = vectornormalize( dir ) * 127; - + // invert the second component as the engine requires this dir = ( dir[ 0 ], 0 - dir[ 1 ], 0 ); } - + startPos = self.origin + ( 0, 0, 50 ); startPosForward = startPos + anglestoforward( ( 0, angles[ 1 ], 0 ) ) * 25; bt = bullettrace( startPos, startPosForward, false, self ); - + if ( bt[ "fraction" ] >= 1 ) { // check if need to jump bt = bullettrace( startPosForward, startPosForward - ( 0, 0, 40 ), false, self ); - + if ( bt[ "fraction" ] < 1 && bt[ "normal" ][ 2 ] > 0.9 && data.i > 1.5 ) { data.i = 0; @@ -749,13 +749,13 @@ doBotMovement_loop( data ) self crouch(); } } - + // move! if ( ( self.bot.wantsprint && self.bot.issprinting ) || isdefined( self.bot.knifing_target ) ) { dir = ( 127, dir[ 1 ], 0 ); } - + self BotBuiltinBotMovement( int( dir[ 0 ] ), int( dir[ 1 ] ) ); } @@ -770,57 +770,57 @@ bot_lookat( pos, time, vel, doAimPredict ) self endon( "zombified" ); self endon( "spawned_player" ); level endon ( "intermission" ); - + if ( ( isdefined( level.intermission ) && level.intermission ) || self.bot.isfrozen || !getdvarint( "bots_play_aim" ) ) { return; } - + if ( !isdefined( pos ) ) { return; } - + if ( !isdefined( doAimPredict ) ) { doAimPredict = false; } - + if ( !isdefined( time ) ) { time = 0.05; } - + if ( !isdefined( vel ) ) { vel = ( 0, 0, 0 ); } - + steps = int( time * 20 ); - + if ( steps < 1 ) { steps = 1; } - + myEye = self geteye(); // get our eye pos - + if ( doAimPredict ) { myEye += ( self getvelocity() * 0.05 ) * ( steps - 1 ); // account for our velocity - + pos += ( vel * 0.05 ) * ( steps - 1 ); // add the velocity vector } - + myAngle = self getplayerangles(); angles = vectortoangles( ( pos - myEye ) - anglestoforward( myAngle ) ); - + X = angleclamp180( angles[ 0 ] - myAngle[ 0 ] ); X = X / steps; - + Y = angleclamp180( angles[ 1 ] - myAngle[ 1 ] ); Y = Y / steps; - + for ( i = 0; i < steps; i++ ) { myAngle = ( angleclamp180( myAngle[ 0 ] + X ), angleclamp180( myAngle[ 1 ] + Y ), 0 ); @@ -838,7 +838,7 @@ canFire( curweap ) { return false; } - + return self getweaponammoclip( curweap ); } @@ -851,19 +851,19 @@ isInRange( dist, curweap ) { return false; } - + weapclass = weaponclass( curweap ); - + if ( weapclass == "spread" && dist > level.bots_maxshotgundistance ) { return false; } - + if ( curweap == "m2_flamethrower_mp" && dist > level.bots_maxshotgundistance ) { return false; } - + return true; } @@ -876,31 +876,31 @@ canAds( dist, curweap ) { return false; } - + if ( !getdvarint( "bots_play_ads" ) ) { return false; } - + far = level.bots_noadsdistance; - + if ( self hasperk( "specialty_bulletaccuracy" ) ) { far *= 1.4; } - + if ( dist < far ) { return false; } - + weapclass = ( weaponclass( curweap ) ); - + if ( weapclass == "spread" || weapclass == "grenade" ) { return false; } - + return true; } @@ -920,56 +920,56 @@ target_loop() hasTarget = isdefined( self.bot.target ); adsAmount = self playerads(); adsFovFact = self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ]; - + if ( hasTarget && !isdefined( self.bot.target.entity ) ) { self.bot.target = undefined; hasTarget = false; } - + // reduce fov if ads'ing if ( adsAmount > 0 ) { myFov *= 1 - adsFovFact * adsAmount; } - + enemies = getaispeciesarray( "axis", "all" ); - + enemycount = enemies.size; - + for ( i = -1; i < enemycount; i++ ) { obj = undefined; - + if ( i == -1 ) { if ( !isdefined( self.bot.script_target ) ) { continue; } - + ent = self.bot.script_target; key = ent getentitynumber() + ""; daDist = distancesquared( self.origin, ent.origin ); obj = self.bot.targets[ key ]; isObjDef = isdefined( obj ); entOrigin = ent.origin; - + if ( isdefined( self.bot.script_target_offset ) ) { entOrigin += self.bot.script_target_offset; } - + if ( bullettracepassed( myEye, entOrigin, false, ent ) ) { if ( !isObjDef ) { obj = self createTargetObj( ent, theTime ); obj.offset = self.bot.script_target_offset; - + self.bot.targets[ key ] = obj; } - + self targetObjUpdateTraced( obj, daDist, ent, theTime, true ); } else @@ -978,9 +978,9 @@ target_loop() { continue; } - + self targetObjUpdateNoTrace( obj ); - + if ( obj.no_trace_time > rememberTime ) { self.bot.targets[ key ] = undefined; @@ -991,16 +991,16 @@ target_loop() else { enemy = enemies[ i ]; - + key = enemy getentitynumber() + ""; obj = self.bot.targets[ key ]; daDist = distancesquared( self.origin, enemy.origin ); isObjDef = isdefined( obj ); - + targetHead = undefined; targetAnkleLeft = undefined; targetAnkleRight = undefined; - + if ( enemy targetIsDog() ) { targetHead = enemy gettagorigin( "j_head" ); @@ -1019,40 +1019,40 @@ target_loop() targetAnkleLeft = enemy gettagorigin( "j_spinelower" ); targetAnkleRight = enemy gettagorigin( "j_spinelower" ); } - + traceHead = bullettrace( myEye, targetHead, false, enemy ); traceAnkleLeft = bullettrace( myEye, targetAnkleLeft, false, enemy ); traceAnkleRight = bullettrace( myEye, targetAnkleRight, false, enemy ); - + canTargetEnemy = ( ( sighttracepassed( myEye, targetHead, false, enemy ) || - sighttracepassed( myEye, targetAnkleLeft, false, enemy ) || - sighttracepassed( myEye, targetAnkleRight, false, enemy ) ) - - && ( ( traceHead[ "fraction" ] >= 1.0 || traceHead[ "surfacetype" ] == "glass" ) || - ( traceAnkleLeft[ "fraction" ] >= 1.0 || traceAnkleLeft[ "surfacetype" ] == "glass" ) || - ( traceAnkleRight[ "fraction" ] >= 1.0 || traceAnkleRight[ "surfacetype" ] == "glass" ) ) - - && ( getConeDot( enemy.origin, self.origin, myAngles ) >= myFov || - ( isObjDef && obj.trace_time ) ) - - && ( !isdefined( enemy.magic_bullet_shield ) || !enemy.magic_bullet_shield ) ); - + sighttracepassed( myEye, targetAnkleLeft, false, enemy ) || + sighttracepassed( myEye, targetAnkleRight, false, enemy ) ) + + && ( ( traceHead[ "fraction" ] >= 1.0 || traceHead[ "surfacetype" ] == "glass" ) || + ( traceAnkleLeft[ "fraction" ] >= 1.0 || traceAnkleLeft[ "surfacetype" ] == "glass" ) || + ( traceAnkleRight[ "fraction" ] >= 1.0 || traceAnkleRight[ "surfacetype" ] == "glass" ) ) + + && ( getConeDot( enemy.origin, self.origin, myAngles ) >= myFov || + ( isObjDef && obj.trace_time ) ) + + && ( !isdefined( enemy.magic_bullet_shield ) || !enemy.magic_bullet_shield ) ); + if ( isdefined( self.bot.target_this_frame ) && self.bot.target_this_frame == enemy ) { self.bot.target_this_frame = undefined; - + canTargetEnemy = true; } - + if ( canTargetEnemy ) { if ( !isObjDef ) { obj = self createTargetObj( enemy, theTime ); - + self.bot.targets[ key ] = obj; } - + self targetObjUpdateTraced( obj, daDist, enemy, theTime, false ); } else @@ -1061,9 +1061,9 @@ target_loop() { continue; } - + self targetObjUpdateNoTrace( obj ); - + if ( obj.no_trace_time > rememberTime ) { self.bot.targets[ key ] = undefined; @@ -1071,67 +1071,67 @@ target_loop() } } } - + if ( !isdefined( obj ) ) { continue; } - + if ( theTime - obj.time < initReactTime ) { continue; } - + timeDiff = theTime - obj.trace_time_time; - + if ( timeDiff < bestTime ) { bestTargets = []; bestTime = timeDiff; } - + if ( timeDiff == bestTime ) { bestTargets[ key ] = obj; } } - + if ( hasTarget && isdefined( bestTargets[ self.bot.target.entity getentitynumber() + "" ] ) ) { return; } - + closest = 2147483647; toBeTarget = undefined; - + bestKeys = getarraykeys( bestTargets ); - + for ( i = bestKeys.size - 1; i >= 0; i-- ) { theDist = bestTargets[ bestKeys[ i ] ].dist; - + if ( theDist > closest ) { continue; } - + closest = theDist; toBeTarget = bestTargets[ bestKeys[ i ] ]; } - + beforeTargetID = -1; newTargetID = -1; - + if ( hasTarget && isdefined( self.bot.target.entity ) ) { beforeTargetID = self.bot.target.entity getentitynumber(); } - + if ( isdefined( toBeTarget ) && isdefined( toBeTarget.entity ) ) { newTargetID = toBeTarget.entity getentitynumber(); } - + if ( beforeTargetID != newTargetID ) { self.bot.target = toBeTarget; @@ -1146,11 +1146,11 @@ target() { self endon( "disconnect" ); self endon( "zombified" ); - + for ( ;; ) { wait 0.05; - + self target_loop(); } } @@ -1182,19 +1182,19 @@ updateBones() { self endon( "disconnect" ); self endon( "zombified" ); - + bones = strtok( self.pers[ "bots" ][ "skill" ][ "bones" ], "," ); waittime = self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ]; - + for ( ;; ) { self waittill_notify_or_timeout( "new_enemy", waittime ); - + if ( !isdefined( self.bot.target ) || !isdefined( self.bot.target.entity ) ) { continue; } - + self.bot.target.bone = selectBoneForTarget( self.bot.target.entity, bones ); } } @@ -1218,7 +1218,7 @@ createTargetObj( ent, theTime ) obj.bone = undefined; obj.aim_offset = undefined; obj.aim_offset_base = undefined; - + return obj; } @@ -1230,22 +1230,22 @@ updateAimOffset( obj ) if ( !isdefined( obj.aim_offset_base ) ) { diffAimAmount = self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ]; - + if ( diffAimAmount > 0 ) { obj.aim_offset_base = ( randomfloatrange( 0 - diffAimAmount, diffAimAmount ), - randomfloatrange( 0 - diffAimAmount, diffAimAmount ), - randomfloatrange( 0 - diffAimAmount, diffAimAmount ) ); + randomfloatrange( 0 - diffAimAmount, diffAimAmount ), + randomfloatrange( 0 - diffAimAmount, diffAimAmount ) ); } else { obj.aim_offset_base = ( 0, 0, 0 ); } } - + aimDiffTime = self.pers[ "bots" ][ "skill" ][ "aim_offset_time" ] * 1000; objCreatedFor = obj.trace_time; - + if ( objCreatedFor >= aimDiffTime ) { offsetScalar = 0; @@ -1254,7 +1254,7 @@ updateAimOffset( obj ) { offsetScalar = 1 - objCreatedFor / aimDiffTime; } - + obj.aim_offset = obj.aim_offset_base * offsetScalar; } @@ -1266,13 +1266,13 @@ targetObjUpdateTraced( obj, daDist, ent, theTime, isScriptObj ) distClose = self.pers[ "bots" ][ "skill" ][ "dist_start" ]; distClose *= self.bot.cur_weap_dist_multi; distClose *= distClose; - + distMax = self.pers[ "bots" ][ "skill" ][ "dist_max" ]; distMax *= self.bot.cur_weap_dist_multi; distMax *= distMax; - + timeMulti = 1; - + if ( !isScriptObj ) { if ( daDist > distMax ) @@ -1284,13 +1284,13 @@ targetObjUpdateTraced( obj, daDist, ent, theTime, isScriptObj ) timeMulti = 1 - ( ( daDist - distClose ) / ( distMax - distClose ) ); } } - + obj.no_trace_time = 0; obj.trace_time += int( 50 * timeMulti ); obj.dist = daDist; obj.last_seen_pos = ent.origin; obj.trace_time_time = theTime; - + self updateAimOffset( obj ); } @@ -1311,15 +1311,15 @@ start_bot_after_target( who ) { self endon( "disconnect" ); self endon( "death" ); - + self.bot.after_target = who; self.bot.after_target_pos = who.origin; - + self notify( "kill_after_target" ); self endon( "kill_after_target" ); - + wait self.pers[ "bots" ][ "skill" ][ "shoot_after_time" ]; - + self.bot.after_target = undefined; } @@ -1338,24 +1338,24 @@ clear_bot_after_target() aim_loop() { aimspeed = self.pers[ "bots" ][ "skill" ][ "aim_time" ]; - + eyePos = self geteye(); curweap = self getcurrentweapon(); angles = self getplayerangles(); adsAmount = self playerads(); adsAimSpeedFact = self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ]; - + // reduce aimspeed if ads'ing if ( adsAmount > 0 ) { aimspeed *= 1 + adsAimSpeedFact * adsAmount; } - + if ( isdefined( self.bot.target ) && isdefined( self.bot.target.entity ) && !( self.bot.prio_objective && isdefined( self.bot.script_aimpos ) ) ) { no_trace_time = self.bot.target.no_trace_time; no_trace_look_time = self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ]; - + if ( no_trace_time <= no_trace_look_time ) { trace_time = self.bot.target.trace_time; @@ -1363,34 +1363,34 @@ aim_loop() target = self.bot.target.entity; conedot = 0; isact = isai( self.bot.target.entity ); - + offset = self.bot.target.offset; - + if ( !isdefined( offset ) ) { offset = ( 0, 0, 0 ); } - + aimoffset = self.bot.target.aim_offset; - + if ( !isdefined( aimoffset ) ) { aimoffset = ( 0, 0, 0 ); } - + dist = self.bot.target.dist; rand = self.bot.target.rand; no_trace_ads_time = self.pers[ "bots" ][ "skill" ][ "no_trace_ads_time" ]; reaction_time = self.pers[ "bots" ][ "skill" ][ "reaction_time" ]; nadeAimOffset = 0; - + bone = self.bot.target.bone; - + if ( !isdefined( bone ) ) { bone = "j_spineupper"; } - + if ( self.bot.isfraggingafter || self.bot.issmokingafter ) { nadeAimOffset = dist / 3000; @@ -1406,7 +1406,7 @@ aim_loop() nadeAimOffset = dist / 3000; } } - + if ( no_trace_time && ( !isdefined( self.bot.after_target ) || self.bot.after_target != target ) ) { if ( no_trace_time > no_trace_ads_time ) @@ -1417,16 +1417,16 @@ aim_loop() if ( !self.bot.isfraggingafter && !self.bot.issmokingafter ) { nade = self getValidGrenade(); - + if ( isdefined( nade ) && rand <= self.pers[ "bots" ][ "behavior" ][ "nade" ] && bullettracepassed( eyePos, eyePos + ( 0, 0, 75 ), false, self ) && bullettracepassed( last_pos, last_pos + ( 0, 0, 100 ), false, target ) && dist > level.bots_mingrenadedistance && dist < level.bots_maxgrenadedistance && getdvarint( "bots_play_nade" ) ) { time = 0.5; - + if ( nade == "stielhandgranate" ) { time = 2; } - + if ( !isSecondaryGrenade( nade ) ) { self thread frag( time ); @@ -1435,7 +1435,7 @@ aim_loop() { self thread smoke( time ); } - + self notify( "kill_goal" ); } } @@ -1451,28 +1451,28 @@ aim_loop() } } } - + self thread bot_lookat( last_pos + ( 0, 0, self getplayerviewheight() + nadeAimOffset ), aimspeed ); return; } - + if ( trace_time ) { if ( isact ) { aimpos = target gettagorigin( bone ); - + if ( !isdefined( aimpos ) ) { return; } - + aimpos += offset; aimpos += aimoffset; aimpos += ( 0, 0, nadeAimOffset ); - + conedot = getConeDot( aimpos, eyePos, angles ); - + if ( isdefined( self.bot.knifing_target ) ) { self thread bot_lookat( target gettagorigin( "j_spine4" ), 0.05 ); @@ -1492,9 +1492,9 @@ aim_loop() aimpos += offset; aimpos += aimoffset; aimpos += ( 0, 0, nadeAimOffset ); - + conedot = getConeDot( aimpos, eyePos, angles ); - + if ( !nadeAimOffset && conedot > 0.999 && lengthsquared( aimoffset ) < 0.05 ) { self thread bot_lookat( aimpos, 0.05 ); @@ -1504,25 +1504,25 @@ aim_loop() self thread bot_lookat( aimpos, aimspeed ); } } - + if ( isact && !self.bot.isknifingafter && conedot > 0.9 && dist < level.bots_maxknifedistance && trace_time > reaction_time && !self.bot.isreloading && getdvarint( "bots_play_knife" ) ) { self clear_bot_after_target(); self thread knife( target ); return; } - + if ( !self canFire( curweap ) || !self isInRange( dist, curweap ) ) { return; } - + canADS = ( self canAds( dist, curweap ) && conedot > 0.75 ); - + if ( canADS ) { stopAdsOverride = false; - + if ( self.bot.is_cur_sniper ) { if ( self.pers[ "bots" ][ "behavior" ][ "quickscope" ] && self.bot.last_fire_time != -1 && gettime() - self.bot.last_fire_time < 1000 ) @@ -1534,37 +1534,37 @@ aim_loop() self notify( "kill_goal" ); } } - + if ( !stopAdsOverride ) { self thread pressADS(); } } - + if ( trace_time > reaction_time ) { if ( ( !canADS || adsAmount >= 1.0 || self inLastStand() || self getstance() == "prone" ) && ( conedot > 0.99 || dist < level.bots_maxknifedistance ) && getdvarint( "bots_play_fire" ) ) { self botFire(); } - + if ( isact ) { self thread start_bot_after_target( target ); } } - + return; } } } - + if ( isdefined( self.bot.after_target ) ) { nadeAimOffset = 0; last_pos = self.bot.after_target_pos; dist = distancesquared( self.origin, last_pos ); - + if ( self.bot.isfraggingafter || self.bot.issmokingafter ) { nadeAimOffset = dist / 3000; @@ -1580,23 +1580,23 @@ aim_loop() nadeAimOffset = dist / 3000; } } - + aimpos = last_pos + ( 0, 0, self getplayerviewheight() + nadeAimOffset ); conedot = getConeDot( aimpos, eyePos, angles ); - + self thread bot_lookat( aimpos, aimspeed ); - + if ( !self canFire( curweap ) || !self isInRange( dist, curweap ) ) { return; } - + canADS = ( self canAds( dist, curweap ) && conedot > 0.75 ); - + if ( canADS ) { stopAdsOverride = false; - + if ( self.bot.is_cur_sniper ) { if ( self.pers[ "bots" ][ "behavior" ][ "quickscope" ] && self.bot.last_fire_time != -1 && gettime() - self.bot.last_fire_time < 1000 ) @@ -1608,25 +1608,25 @@ aim_loop() self notify( "kill_goal" ); } } - + if ( !stopAdsOverride ) { self thread pressADS(); } } - + if ( ( !canADS || adsAmount >= 1.0 || self inLastStand() || self getstance() == "prone" ) && ( conedot > 0.95 || dist < level.bots_maxknifedistance ) && getdvarint( "bots_play_fire" ) ) { self botFire(); } - + return; } - + if ( self.bot.next_wp != -1 && isdefined( level.waypoints[ self.bot.next_wp ].angles ) && false ) { forwardPos = anglestoforward( level.waypoints[ self.bot.next_wp ].angles ) * 1024; - + self thread bot_lookat( eyePos + forwardPos, aimspeed ); } else if ( isdefined( self.bot.script_aimpos ) ) @@ -1636,7 +1636,7 @@ aim_loop() else { lookat = undefined; - + if ( self.bot.second_next_wp != -1 && !self.bot.issprinting && !self.bot.climbing ) { lookat = level.waypoints[ self.bot.second_next_wp ].origin; @@ -1645,7 +1645,7 @@ aim_loop() { lookat = self.bot.towards_goal; } - + if ( isdefined( lookat ) ) { self thread bot_lookat( lookat + ( 0, 0, self getplayerviewheight() ), aimspeed ); @@ -1660,16 +1660,16 @@ aim() { self endon( "disconnect" ); self endon( "zombified" ); - + for ( ;; ) { wait 0.05; - + if ( ( isdefined( level.intermission ) && level.intermission ) || self.bot.isfrozen ) { continue; } - + self aim_loop(); } } @@ -1681,23 +1681,23 @@ walk() { self endon( "disconnect" ); self endon( "zombified" ); - + for ( ;; ) { wait 0.05; - + self botSetMoveTo( self.origin ); - + if ( !getdvarint( "bots_play_move" ) ) { continue; } - + if ( ( isdefined( level.intermission ) && level.intermission ) || self.bot.isfrozen || self.bot.stop_move ) { continue; } - + self walk_loop(); } } @@ -1708,43 +1708,43 @@ walk() walk_loop() { shouldTarget = isdefined( self.bot.target ) && isdefined( self.bot.target.entity ) && !self.bot.prio_objective; - + if ( shouldTarget ) { curweap = self getcurrentweapon(); - + if ( self.bot.isfraggingafter || self.bot.issmokingafter ) { return; } - + if ( isai( self.bot.target.entity ) && self.bot.target.trace_time && self canFire( curweap ) && self isInRange( self.bot.target.dist, curweap ) ) { if ( self inLastStand() || self getstance() == "prone" || ( self.bot.is_cur_sniper && self playerads() > 0 ) ) { return; } - + if ( self.bot.target.rand <= self.pers[ "bots" ][ "behavior" ][ "strafe" ] ) { self strafe( self.bot.target.entity ); } - + return; } } - + dist = 16; - + goal = self getRandomGoal(); - + isScriptGoal = false; - + if ( isdefined( self.bot.script_goal ) && !shouldTarget ) { goal = self.bot.script_goal; dist = self.bot.script_goal_dist; - + isScriptGoal = true; } else @@ -1753,10 +1753,10 @@ walk_loop() { goal = self.bot.target.last_seen_pos; } - + self notify( "new_goal_internal" ); } - + self doWalk( goal, dist, isScriptGoal ); self.bot.towards_goal = undefined; self.bot.next_wp = -1; @@ -1771,33 +1771,33 @@ doWalk( goal, dist, isScriptGoal ) level endon( "intermission" ); self endon( "kill_goal" ); self endon( "goal_internal" ); // so that the watchOnGoal notify can happen same frame, not a frame later - + dist *= dist; - + if ( isScriptGoal ) { self thread doWalkScriptNotify(); } - + self thread killWalkOnEvents(); self thread watchOnGoal( goal, dist ); - + current = self initAStar( goal ); - + path_was_truncated = ( current + 1 ) >= 32; - + if ( current <= -1 ) { self notify( "bad_path_internal" ); return; } - + // skip waypoints we already completed to prevent rubber banding if ( current > 0 && self.bot.astar[ current ] == self.bot.last_next_wp && self.bot.astar[ current - 1 ] == self.bot.last_second_next_wp ) { current = self removeAStar(); } - + if ( current >= 0 ) { // check if a waypoint is closer than the goal @@ -1807,44 +1807,44 @@ doWalk( goal, dist, isScriptGoal ) { self.bot.next_wp = self.bot.astar[ current ]; self.bot.second_next_wp = -1; - + if ( current > 0 ) { self.bot.second_next_wp = self.bot.astar[ current - 1 ]; } - + self notify( "new_static_waypoint" ); - + self movetowards( level.waypoints[ self.bot.next_wp ].origin ); self.bot.last_next_wp = self.bot.next_wp; self.bot.last_second_next_wp = self.bot.second_next_wp; - + current = self removeAStar(); } } } - + if ( path_was_truncated ) { self notify( "kill_goal" ); return; } - + self.bot.next_wp = -1; self.bot.second_next_wp = -1; self notify( "finished_static_waypoints" ); - + if ( distancesquared( self.origin, goal ) > dist ) { self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; self movetowards( goal ); // any better way?? } - + self notify( "finished_goal" ); - + wait 1; - + if ( distancesquared( self.origin, goal ) > dist ) { self notify( "bad_path_internal" ); @@ -1860,14 +1860,14 @@ movetowards( goal ) { return; } - + self.bot.towards_goal = goal; - + lastOri = self.origin; stucks = 0; timeslow = 0; time = 0; - + if ( self.bot.issprinting ) { tempGoalDist = level.bots_goaldistance * 2; @@ -1876,34 +1876,34 @@ movetowards( goal ) { tempGoalDist = level.bots_goaldistance; } - + while ( distancesquared( self.origin, goal ) > tempGoalDist ) { self botSetMoveTo( goal ); - + if ( time > 3000 ) { time = 0; - + if ( distancesquared( self.origin, lastOri ) < 32 * 32 ) { self thread knife(); wait 0.5; - + stucks++; - + randomDir = self getRandomLargestStafe( stucks ); - + self BotNotifyBotEvent( "stuck" ); - + self botSetMoveTo( randomDir ); wait stucks; self stand(); - + self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; } - + lastOri = self.origin; } else if ( timeslow > 0 && ( timeslow % 1000 ) == 0 ) @@ -1928,10 +1928,10 @@ movetowards( goal ) } } } - + wait 0.05; time += 50; - + if ( lengthsquared( self getvelocity() ) < 1000 ) { timeslow += 50; @@ -1940,7 +1940,7 @@ movetowards( goal ) { timeslow = 0; } - + if ( self.bot.issprinting ) { tempGoalDist = level.bots_goaldistance * 2; @@ -1949,13 +1949,13 @@ movetowards( goal ) { tempGoalDist = level.bots_goaldistance; } - + if ( stucks >= 2 ) { self notify( "bad_path_internal" ); } } - + self.bot.towards_goal = undefined; self notify( "completed_move_to" ); } @@ -1967,25 +1967,25 @@ strafe( target ) { self endon( "kill_goal" ); self thread killWalkOnEvents(); - + angles = vectortoangles( vectornormalize( target.origin - self.origin ) ); anglesLeft = ( 0, angles[ 1 ] + 90, 0 ); anglesRight = ( 0, angles[ 1 ] - 90, 0 ); - + myOrg = self.origin + ( 0, 0, 16 ); left = myOrg + anglestoforward( anglesLeft ) * 500; right = myOrg + anglestoforward( anglesRight ) * 500; - + traceLeft = bullettrace( myOrg, left, false, self ); traceRight = bullettrace( myOrg, right, false, self ); - + strafe = traceLeft[ "position" ]; - + if ( traceRight[ "fraction" ] > traceLeft[ "fraction" ] ) { strafe = traceRight[ "position" ]; } - + self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; self botSetMoveTo( strafe ); @@ -2001,7 +2001,7 @@ getRandomLargestStafe( dist ) // find a better algo? traces = NewHeap( ::HeapTraceFraction ); myOrg = self.origin + ( 0, 0, 16 ); - + traces HeapInsert( bullettrace( myOrg, myOrg + ( -100 * dist, 0, 0 ), false, self ) ); traces HeapInsert( bullettrace( myOrg, myOrg + ( 100 * dist, 0, 0 ), false, self ) ); traces HeapInsert( bullettrace( myOrg, myOrg + ( 0, 100 * dist, 0 ), false, self ) ); @@ -2010,19 +2010,19 @@ getRandomLargestStafe( dist ) traces HeapInsert( bullettrace( myOrg, myOrg + ( -100 * dist, 100 * dist, 0 ), false, self ) ); traces HeapInsert( bullettrace( myOrg, myOrg + ( 100 * dist, -100 * dist, 0 ), false, self ) ); traces HeapInsert( bullettrace( myOrg, myOrg + ( 100 * dist, 100 * dist, 0 ), false, self ) ); - + toptraces = []; - + top = traces.data[ 0 ]; toptraces[ toptraces.size ] = top; traces HeapRemove(); - + while ( traces.data.size && top[ "fraction" ] - traces.data[ 0 ][ "fraction" ] < 0.1 ) { toptraces[ toptraces.size ] = traces.data[ 0 ]; traces HeapRemove(); } - + return toptraces[ randomint( toptraces.size ) ][ "position" ]; } @@ -2032,28 +2032,28 @@ getRandomLargestStafe( dist ) initAStar( goal ) { nodes = BotBuiltinGeneratePath( self.origin, goal, self.team ); - + if ( !isdefined( nodes ) || nodes.size <= 0 ) { // Try again to find a path to the origin using best effort algo nodes = BotBuiltinGeneratePath( self.origin, goal, self.team, 192.0 ); - + if ( !isdefined( nodes ) || nodes.size <= 0 ) { self.bot.astar = []; return -1; } } - + node_indexes = []; - + for ( i = nodes.size - 1; i >= 0; i-- ) { node_indexes[ node_indexes.size ] = nodes[ i ] BotBuiltinGetNodeNumber(); } - + self.bot.astar = node_indexes; - + return self.bot.astar.size - 1; } @@ -2063,9 +2063,9 @@ initAStar( goal ) removeAStar() { remove = self.bot.astar.size - 1; - + self.bot.astar[ remove ] = undefined; - + return self.bot.astar.size - 1; } @@ -2077,7 +2077,7 @@ doWalkScriptNotify() self endon( "disconnect" ); self endon( "zombified" ); self endon( "kill_goal" ); - + if ( self waittill_either_return( "goal_internal", "bad_path_internal" ) == "goal_internal" ) { self notify( "goal" ); @@ -2096,11 +2096,11 @@ killWalkOnEvents() self endon( "kill_goal" ); self endon( "disconnect" ); self endon( "zombified" ); - + self waittill_any( "new_enemy", "new_goal_internal", "goal_internal", "bad_path_internal" ); - + waittillframeend; - + self notify( "kill_goal" ); } @@ -2112,12 +2112,12 @@ watchOnGoal( goal, dis ) self endon( "disconnect" ); self endon( "zombified" ); self endon( "kill_goal" ); - + while ( distancesquared( self.origin, goal ) > dis ) { wait 0.05; } - + self notify( "goal_internal" ); } @@ -2138,19 +2138,19 @@ pressADS( time ) self endon( "disconnect" ); self notify( "bot_ads" ); self endon( "bot_ads" ); - + if ( !isdefined( time ) ) { time = 0.05; } - + self BotBuiltinBotAction( "+ads" ); - + if ( time ) { wait time; } - + self BotBuiltinBotAction( "-ads" ); } @@ -2163,24 +2163,24 @@ frag( time ) self endon( "disconnect" ); self notify( "bot_frag" ); self endon( "bot_frag" ); - + if ( !isdefined( time ) ) { time = 0.05; } - + self BotBuiltinBotAction( "+frag" ); self.bot.isfragging = true; self.bot.isfraggingafter = true; - + if ( time ) { wait time; } - + self BotBuiltinBotAction( "-frag" ); self.bot.isfragging = false; - + wait 1.25; self.bot.isfraggingafter = false; } @@ -2209,24 +2209,24 @@ smoke( time ) self endon( "disconnect" ); self notify( "bot_smoke" ); self endon( "bot_smoke" ); - + if ( !isdefined( time ) ) { time = 0.05; } - + self BotBuiltinBotAction( "+smoke" ); self.bot.issmoking = true; self.bot.issmokingafter = true; - + if ( time ) { wait time; } - + self BotBuiltinBotAction( "-smoke" ); self.bot.issmoking = false; - + wait 1.25; self.bot.issmokingafter = false; } @@ -2240,7 +2240,7 @@ doSemiTime() self endon( "disconnect" ); self notify( "bot_semi_time" ); self endon( "bot_semi_time" ); - + self.bot.semi_time = true; wait self.pers[ "bots" ][ "skill" ][ "semi_time" ]; self.bot.semi_time = false; @@ -2252,18 +2252,18 @@ doSemiTime() botFire() { self.bot.last_fire_time = gettime(); - + if ( self.bot.is_cur_full_auto ) { self thread pressFire(); return; } - + if ( self.bot.semi_time ) { return; } - + self thread pressFire(); self thread doSemiTime(); } @@ -2276,11 +2276,11 @@ doMantle() self endon( "disconnect" ); self endon( "zombified" ); self endon( "kill_goal" ); - + self jump(); - + wait 0.35; - + self jump(); } @@ -2293,19 +2293,19 @@ pressFire( time ) self endon( "disconnect" ); self notify( "bot_fire" ); self endon( "bot_fire" ); - + if ( !isdefined( time ) ) { time = 0.05; } - + self BotBuiltinBotAction( "+fire" ); - + if ( time ) { wait time; } - + self BotBuiltinBotAction( "-fire" ); } @@ -2318,7 +2318,7 @@ reload() self endon( "disconnect" ); self notify( "bot_reload" ); self endon( "bot_reload" ); - + self BotBuiltinBotAction( "+reload" ); wait 0.05; self BotBuiltinBotAction( "-reload" ); @@ -2332,48 +2332,48 @@ do_knife_target( target ) self endon( "death" ); self endon( "disconnect" ); self endon( "bot_knife" ); - + // dedi doesnt have this registered if ( getdvar( "aim_automelee_enabled" ) == "" ) { setdvar( "aim_automelee_enabled", 1 ); } - + if ( getdvar( "aim_automelee_range" ) == "" ) { setdvar( "aim_automelee_range", 128 ); } - + if ( !getdvarint( "aim_automelee_enabled" ) || !self isonground() || self getstance() == "prone" || self inLastStand() ) { self.bot.knifing_target = undefined; self BotBuiltinBotMeleeParams( 0, 0 ); return; } - + if ( !isdefined( target ) || ( !isplayer( target ) && !isai( target ) ) ) { self.bot.knifing_target = undefined; self BotBuiltinBotMeleeParams( 0, 0 ); return; } - + dist = distance( target.origin, self.origin ); - + if ( dist > getdvarfloat( "aim_automelee_range" ) ) { self.bot.knifing_target = undefined; self BotBuiltinBotMeleeParams( 0, 0 ); return; } - + self.bot.knifing_target = target; - + angles = vectortoangles( target.origin - self.origin ); self BotBuiltinBotMeleeParams( angles[ 1 ], dist ); - + wait 1; - + self.bot.knifing_target = undefined; self BotBuiltinBotMeleeParams( 0, 0 ); } @@ -2387,20 +2387,20 @@ knife( target ) self endon( "disconnect" ); self notify( "bot_knife" ); self endon( "bot_knife" ); - + self thread do_knife_target( target ); - + self.bot.isknifing = true; self.bot.isknifingafter = true; - + self BotBuiltinBotAction( "+melee" ); wait 0.05; self BotBuiltinBotAction( "-melee" ); - + self.bot.isknifing = false; - + wait 1; - + self.bot.isknifingafter = false; } @@ -2413,19 +2413,19 @@ use( time ) self endon( "disconnect" ); self notify( "bot_use" ); self endon( "bot_use" ); - + if ( !isdefined( time ) ) { time = 0.05; } - + self BotBuiltinBotAction( "+activate" ); - + if ( time ) { wait time; } - + self BotBuiltinBotAction( "-activate" ); } @@ -2438,13 +2438,13 @@ jump() self endon( "disconnect" ); self notify( "bot_jump" ); self endon( "bot_jump" ); - + if ( self getstance() != "stand" ) { self stand(); wait 1; } - + self BotBuiltinBotAction( "+gostand" ); wait 0.05; self BotBuiltinBotAction( "-gostand" ); @@ -2486,7 +2486,7 @@ sprint() self endon( "disconnect" ); self notify( "bot_sprint" ); self endon( "bot_sprint" ); - + self BotBuiltinBotAction( "+sprint" ); wait 0.05; self BotBuiltinBotAction( "-sprint" ); diff --git a/maps/bots/_bot_script.gsc b/maps/bots/_bot_script.gsc index 7852271..da8add0 100644 --- a/maps/bots/_bot_script.gsc +++ b/maps/bots/_bot_script.gsc @@ -16,7 +16,7 @@ bot_script_init() added() { self endon( "disconnect" ); - + self set_diff(); } @@ -26,11 +26,11 @@ added() connected() { self endon( "disconnect" ); - + self thread difficulty(); self thread onBotSpawned(); self thread onSpawned(); - + self thread maps\bots\objectives\_manager::connected(); } @@ -43,37 +43,37 @@ onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoin { return; } - + if ( !isalive( self ) ) { return; } - + if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" ) { return; } - + if ( iDamage <= 0 ) { return; } - + if ( !isdefined( eAttacker ) || !isdefined( eAttacker.team ) ) { return; } - + if ( eAttacker == self ) { return; } - + if ( !isalive( eAttacker ) ) { return; } - + self SetAttacker( eAttacker ); } @@ -83,7 +83,7 @@ onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoin difficulty() { self endon( "disconnect" ); - + for ( ;; ) { 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" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 0; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 10; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 30; @@ -120,7 +120,7 @@ difficulty() self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 0; break; - + case 2: self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.55; 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" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 10; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 15; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 45; @@ -151,7 +151,7 @@ difficulty() self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 10; break; - + case 3: self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.4; 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" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 20; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 20; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 50; @@ -182,7 +182,7 @@ difficulty() self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 25; break; - + case 4: self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.3; 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" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 30; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 25; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 55; @@ -213,7 +213,7 @@ difficulty() self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 35; break; - + case 5: self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.25; 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" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 40; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 35; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 60; @@ -244,7 +244,7 @@ difficulty() self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 50; break; - + case 6: self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.2; 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" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 50; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 45; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 65; @@ -275,7 +275,7 @@ difficulty() self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 75; break; - + case 7: self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.1; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 100; @@ -296,7 +296,7 @@ difficulty() self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_head"; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 65; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 65; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 70; @@ -308,7 +308,7 @@ difficulty() break; } } - + wait 5; } } @@ -319,16 +319,16 @@ difficulty() set_diff() { rankVar = getdvarint( "bots_skill" ); - + switch ( rankVar ) { case 0: self.pers[ "bots" ][ "skill" ][ "base" ] = Round( random_normal_distribution( 3.5, 1.75, 1, 7 ) ); break; - + case 8: break; - + case 9: self.pers[ "bots" ][ "skill" ][ "base" ] = randomintrange( 1, 7 ); 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" ][ "remember_time" ] = 50 * randomint( 100 ); self.pers[ "bots" ][ "skill" ][ "fov" ] = randomfloatrange( -1, 1 ); - + randomNum = randomintrange( 500, 25000 ); self.pers[ "bots" ][ "skill" ][ "dist_start" ] = randomNum; self.pers[ "bots" ][ "skill" ][ "dist_max" ] = randomNum * 2; - + self.pers[ "bots" ][ "skill" ][ "spawn_time" ] = 0.05 * randomint( 20 ); self.pers[ "bots" ][ "skill" ][ "help_dist" ] = randomintrange( 500, 25000 ); 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" ][ "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" ][ "behavior" ][ "strafe" ] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "nade" ] = 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" ][ "jump" ] = randomint( 100 ); break; - + default: self.pers[ "bots" ][ "skill" ][ "base" ] = rankVar; break; @@ -375,11 +375,11 @@ onBotSpawned() { self endon( "disconnect" ); level endon( "intermission" ); - + for ( ;; ) { self waittill( "bot_spawned" ); - + self thread start_bot_threads(); } } @@ -390,11 +390,11 @@ onBotSpawned() onSpawned() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "spawned_player" ); - + self thread maps\bots\objectives\_manager::spawned(); } } @@ -407,9 +407,9 @@ start_bot_threads() self endon( "disconnect" ); level endon( "intermission" ); self endon( "zombified" ); - + self thread doReloadCancel(); - + self thread maps\bots\objectives\_manager::start_bot_threads(); } @@ -421,21 +421,21 @@ changeToWeapon( weap ) self endon( "disconnect" ); self endon( "zombified" ); level endon( "game_ended" ); - + if ( !self hasweapon( weap ) ) { return false; } - + self switchtoweapon( weap ); - + if ( self getcurrentweapon() == weap ) { return true; } - + self waittill_any_timeout( 5, "weapon_change" ); - + return ( self getcurrentweapon() == weap ); } @@ -445,29 +445,29 @@ changeToWeapon( weap ) doReloadCancel_loop() { ret = self waittill_any_return( "reload", "weapon_change" ); - + if ( self BotIsFrozen() ) { return; } - + if ( self usebuttonpressed() ) { return; } - + if ( self inLastStand() ) { return; } - + curWeap = self getcurrentweapon(); - + if ( !self isWeaponPrimary( curWeap ) ) { return; } - + if ( ret == "reload" ) { // check single reloads @@ -476,41 +476,41 @@ doReloadCancel_loop() return; } } - + // check difficulty if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 3 ) { return; } - + // check if got another weapon weaponslist = self getweaponslistprimaries(); weap = ""; - + while ( weaponslist.size ) { weapon = weaponslist[ randomint( weaponslist.size ) ]; weaponslist = array_remove( weaponslist, weapon ); - + if ( !self isWeaponPrimary( weapon ) ) { continue; } - + if ( curWeap == weapon || weapon == "none" || weapon == "" ) { continue; } - + weap = weapon; break; } - + if ( weap == "" ) { return; } - + // do the cancel wait 0.1; self thread changeToWeapon( weap ); @@ -526,7 +526,7 @@ doReloadCancel() { self endon( "disconnect" ); self endon( "zombified" ); - + for ( ;; ) { self doReloadCancel_loop(); diff --git a/maps/bots/_bot_utility.gsc b/maps/bots/_bot_utility.gsc index 6334013..e81a62f 100644 --- a/maps/bots/_bot_utility.gsc +++ b/maps/bots/_bot_utility.gsc @@ -12,7 +12,7 @@ wait_for_builtins() { return true; } - + if ( i < 18 ) { waittillframeend; @@ -22,7 +22,7 @@ wait_for_builtins() wait 0.05; } } - + return false; } @@ -94,7 +94,7 @@ BotBuiltinIsBot() { return self [[ level.bot_builtins[ "isbot" ] ]](); } - + return false; } @@ -107,7 +107,7 @@ BotBuiltinGeneratePath( from, to, team, best_effort ) { return [[ level.bot_builtins[ "generatepath" ] ]]( from, to, team, best_effort ); } - + return []; } @@ -120,7 +120,7 @@ BotBuiltinGetFunction( file, threadname ) { return [[ level.bot_builtins[ "getfunction" ] ]]( file, threadname ); } - + return undefined; } @@ -133,7 +133,7 @@ BotBuiltinGetMins() { return self [[ level.bot_builtins[ "getmins" ] ]](); } - + return ( 0, 0, 0 ); } @@ -146,7 +146,7 @@ BotBuiltinGetMaxs() { return self [[ level.bot_builtins[ "getmaxs" ] ]](); } - + return ( 0, 0, 0 ); } @@ -159,7 +159,7 @@ BotBuiltinGetGuid() { return self [[ level.bot_builtins[ "getguid" ] ]](); } - + return 0; } @@ -191,7 +191,7 @@ BotBuiltinGetNodeNumber() { return self [[ level.bot_builtins[ "getnodenumber" ] ]](); } - + return 0; } @@ -203,7 +203,7 @@ BotBuiltinGetLinkedNodes() { return self [[ level.bot_builtins[ "getlinkednodes" ] ]](); } - + return []; } @@ -215,7 +215,7 @@ BotBuiltinAddTestClient() { return [[ level.bot_builtins[ "addtestclient" ] ]](); } - + return undefined; } @@ -248,7 +248,7 @@ BotBuiltinIsHost() { return self [[ level.bot_builtins[ "ishost" ] ]](); } - + return false; } @@ -266,35 +266,35 @@ is_host() doHostCheck() { self.pers[ "bot_host" ] = false; - + if ( self is_bot() ) { return; } - + result = false; - + if ( getdvar( "bots_main_firstIsHost" ) != "0" ) { BotBuiltinPrintConsole( "WARNING: bots_main_firstIsHost is enabled" ); - + if ( getdvar( "bots_main_firstIsHost" ) == "1" ) { setdvar( "bots_main_firstIsHost", self BotBuiltinGetGuid() ); } - + if ( getdvar( "bots_main_firstIsHost" ) == self BotBuiltinGetGuid() + "" ) { result = true; } } - + DvarGUID = getdvar( "bots_main_GUIDs" ); - + if ( DvarGUID != "" ) { guids = strtok( DvarGUID, "," ); - + for ( i = 0; i < guids.size; i++ ) { if ( self BotBuiltinGetGuid() + "" == guids[ i ] ) @@ -303,12 +303,12 @@ doHostCheck() } } } - + if ( !self BotBuiltinIsHost() && !result ) { return; } - + self.pers[ "bot_host" ] = true; } @@ -330,11 +330,11 @@ BotSetStance( stance ) case "stand": self maps\bots\_bot_internal::stand(); break; - + case "crouch": self maps\bots\_bot_internal::crouch(); break; - + case "prone": self maps\bots\_bot_internal::prone(); break; @@ -406,7 +406,7 @@ BotGetTargetRandom() { return undefined; } - + return self.bot.target.rand; } @@ -456,7 +456,7 @@ IsBotKnifing() BotFreezeControls( what ) { self.bot.isfrozen = what; - + if ( what ) { self notify( "kill_goal" ); @@ -477,7 +477,7 @@ BotIsFrozen() BotStopMoving( what ) { self.bot.stop_move = what; - + if ( what ) { self notify( "kill_goal" ); @@ -526,7 +526,7 @@ SetScriptGoal( goal, dist ) { dist = 16; } - + self.bot.script_goal = goal; self.bot.script_goal_dist = dist; waittillframeend; @@ -634,7 +634,7 @@ GetThreat() { return undefined; } - + return self.bot.target.entity; } @@ -660,22 +660,22 @@ HasThreat() getValidTube() { weaps = self getweaponslist(); - + for ( i = 0; i < weaps.size; i++ ) { weap = weaps[ i ]; - + if ( !self getammocount( weap ) ) { continue; } - + if ( issubstr( weap, "gl_" ) && !issubstr( weap, "_gl_" ) ) { return weap; } } - + return undefined; } @@ -686,24 +686,24 @@ getValidGrenade() { grenadeTypes = []; grenadeTypes[ grenadeTypes.size ] = "stielhandgranate"; - + possibles = []; - + for ( i = 0; i < grenadeTypes.size; i++ ) { if ( !self hasweapon( grenadeTypes[ i ] ) ) { continue; } - + if ( !self getammocount( grenadeTypes[ i ] ) ) { continue; } - + possibles[ possibles.size ] = grenadeTypes[ i ]; } - + return PickRandom( possibles ); } @@ -716,7 +716,7 @@ PickRandom( arr ) { return undefined; } - + return arr[ randomint( arr.size ) ]; } @@ -742,7 +742,7 @@ getBaseWeaponName( weap ) WeaponIsFullAuto( weap ) { weaptoks = strtok( weap, "_" ); - + return isdefined( weaptoks[ 0 ] ) && isstring( weaptoks[ 0 ] ) && isdefined( level.bots_fullautoguns[ weaptoks[ 0 ]] ); } @@ -765,7 +765,7 @@ waittill_either_return( str1, str2 ) { return str1; } - + return str2; } @@ -778,36 +778,36 @@ waittill_any_timeout( timeOut, string1, string2, string3, string4, string5 ) { self endon( "death" ); } - + ent = spawnstruct(); - + if ( isdefined( string1 ) ) { self thread waittill_string( string1, ent ); } - + if ( isdefined( string2 ) ) { self thread waittill_string( string2, ent ); } - + if ( isdefined( string3 ) ) { self thread waittill_string( string3, ent ); } - + if ( isdefined( string4 ) ) { self thread waittill_string( string4, ent ); } - + if ( isdefined( string5 ) ) { self thread waittill_string( string5, ent ); } - + ent thread _timeout( timeOut ); - + ent waittill( "returned", msg ); ent notify( "die" ); return msg; @@ -819,7 +819,7 @@ waittill_any_timeout( timeOut, string1, string2, string3, string4, string5 ) _timeout( delay ) { self endon( "die" ); - + wait( delay ); self notify( "returned", "timeout" ); } @@ -832,15 +832,15 @@ GetHostPlayer() for ( i = 0; i < level.players.size; i++ ) { player = level.players[ i ]; - + if ( !player is_host() ) { continue; } - + return player; } - + return undefined; } @@ -850,51 +850,51 @@ GetHostPlayer() bot_wait_for_host() { host = undefined; - + while ( !isdefined( level ) || !isdefined( level.players ) ) { wait 0.05; } - + for ( i = getdvarfloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) { host = GetHostPlayer(); - + if ( isdefined( host ) ) { break; } - + wait 0.05; } - + if ( !isdefined( host ) ) { return; } - + for ( i = getdvarfloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) { if ( isdefined( host.pers[ "team" ] ) ) { break; } - + wait 0.05; } - + if ( !isdefined( host.pers[ "team" ] ) ) { return; } - + for ( i = getdvarfloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) { if ( host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis" ) { break; } - + wait 0.05; } } @@ -916,7 +916,7 @@ distancesquared2D( to, from ) { to = ( to[ 0 ], to[ 1 ], 0 ); from = ( from[ 0 ], from[ 1 ], 0 ); - + return distancesquared( to, from ); } @@ -928,7 +928,7 @@ Rectdistancesquared( origin ) dx = 0; dy = 0; dz = 0; - + if ( origin[ 0 ] < self.x0 ) { dx = origin[ 0 ] - self.x0; @@ -937,7 +937,7 @@ Rectdistancesquared( origin ) { dx = origin[ 0 ] - self.x1; } - + if ( origin[ 1 ] < self.y0 ) { dy = origin[ 1 ] - self.y0; @@ -946,8 +946,8 @@ Rectdistancesquared( origin ) { dy = origin[ 1 ] - self.y1; } - - + + if ( origin[ 2 ] < self.z0 ) { dz = origin[ 2 ] - self.z0; @@ -956,7 +956,7 @@ Rectdistancesquared( origin ) { dz = origin[ 2 ] - self.z1; } - + return dx * dx + dy * dy + dz * dz; } @@ -966,7 +966,7 @@ Rectdistancesquared( origin ) Round( x ) { y = int( x ); - + if ( abs( x ) - abs( y ) > 0.5 ) { if ( x < 0 ) @@ -990,7 +990,7 @@ Round( x ) RoundUp( floatVal ) { i = int( floatVal ); - + if ( i != floatVal ) { return i + 1; @@ -1015,7 +1015,7 @@ Clamp( a, minv, maxv ) float( num ) { setdvar( "temp_dvar_bot_util", num ); - + return getdvarfloat( "temp_dvar_bot_util" ); } @@ -1026,22 +1026,22 @@ get_nodes_in_playable_area() { total_nodes = getallnodes(); filtered_nodes = []; - + for ( i = 0; i < total_nodes.size; i++ ) { if ( !is_point_in_playable_area( total_nodes[ i ].origin ) ) { continue; } - + filtered_nodes[ filtered_nodes.size ] = total_nodes[ i ]; - + if ( ( i % 10 ) == 0 ) { wait 0.05; } } - + return filtered_nodes; } @@ -1051,16 +1051,16 @@ get_nodes_in_playable_area() is_point_in_playable_area( point ) { playable_area = getentarray( "playable_area", "targetname" ); - + in_playable_area = false; - + if ( !isdefined( playable_area ) || playable_area.size < 1 ) { in_playable_area = true; } - + temp_ent = spawn( "script_origin", point ); - + if ( !in_playable_area ) { for ( p = 0; p < playable_area.size; p++ ) @@ -1072,9 +1072,9 @@ is_point_in_playable_area( point ) } } } - + temp_ent delete (); - + return in_playable_area; } @@ -1090,9 +1090,9 @@ load_waypoints() bot_allowed_negotiation_links[ bot_allowed_negotiation_links.size ] = "zombie_jump_down_127"; bot_allowed_negotiation_links[ bot_allowed_negotiation_links.size ] = "zombie_jump_down_184"; bot_allowed_negotiation_links[ bot_allowed_negotiation_links.size ] = "zombie_jump_down_190"; - + bot_ignore_links = []; - + switch ( level.script ) { case "nazi_zombie_sumpf": @@ -1104,33 +1104,33 @@ load_waypoints() a[ a.size ] = 1833; a[ a.size ] = 1837; bot_ignore_links[ 1603 + "" ] = a; - + a = []; a[ a.size ] = 1829; bot_ignore_links[ 1604 + "" ] = a; - + a = []; a[ a.size ] = 1904; bot_ignore_links[ 1823 + "" ] = a; - + a = []; a[ a.size ] = 1603; a[ a.size ] = 1903; a[ a.size ] = 1904; a[ a.size ] = 1906; bot_ignore_links[ 1825 + "" ] = a; - + a = []; a[ a.size ] = 1603; a[ a.size ] = 1903; a[ a.size ] = 1904; a[ a.size ] = 1907; bot_ignore_links[ 1826 + "" ] = a; - + a = []; a[ a.size ] = 1904; bot_ignore_links[ 1827 + "" ] = a; - + a = []; a[ a.size ] = 1603; a[ a.size ] = 1604; @@ -1139,19 +1139,19 @@ load_waypoints() a[ a.size ] = 1906; a[ a.size ] = 1907; bot_ignore_links[ 1829 + "" ] = a; - - + + a = []; a[ a.size ] = 1603; a[ a.size ] = 1903; a[ a.size ] = 1904; a[ a.size ] = 1907; bot_ignore_links[ 1830 + "" ] = a; - + a = []; a[ a.size ] = 1904; bot_ignore_links[ 1831 + "" ] = a; - + a = []; a[ a.size ] = 1603; a[ a.size ] = 1903; @@ -1159,12 +1159,12 @@ load_waypoints() a[ a.size ] = 1906; a[ a.size ] = 1907; bot_ignore_links[ 1833 + "" ] = a; - + a = []; a[ a.size ] = 1903; a[ a.size ] = 1904; bot_ignore_links[ 1834 + "" ] = a; - + a = []; a[ a.size ] = 1603; a[ a.size ] = 1903; @@ -1172,12 +1172,12 @@ load_waypoints() a[ a.size ] = 1906; a[ a.size ] = 1907; bot_ignore_links[ 1837 + "" ] = a; - + a = []; a[ a.size ] = 1903; a[ a.size ] = 1904; bot_ignore_links[ 1838 + "" ] = a; - + a = []; a[ a.size ] = 1825; a[ a.size ] = 1826; @@ -1188,7 +1188,7 @@ load_waypoints() a[ a.size ] = 1837; a[ a.size ] = 1838; bot_ignore_links[ 1903 + "" ] = a; - + a = []; a[ a.size ] = 1823; a[ a.size ] = 1825; @@ -1202,14 +1202,14 @@ load_waypoints() a[ a.size ] = 1837; a[ a.size ] = 1838; bot_ignore_links[ 1904 + "" ] = a; - + a = []; a[ a.size ] = 1825; a[ a.size ] = 1829; a[ a.size ] = 1833; a[ a.size ] = 1837; bot_ignore_links[ 1906 + "" ] = a; - + a = []; a[ a.size ] = 1826; a[ a.size ] = 1829; @@ -1219,15 +1219,15 @@ load_waypoints() bot_ignore_links[ 1907 + "" ] = a; break; } - + // arrays are passed by value in gsc... hope this isnt gunna run out of vars BotBuiltinSetAllowedTraversals( bot_allowed_negotiation_links ); BotBuiltinSetIgnoredLinks( bot_ignore_links ); level.bot_ignore_links = bot_ignore_links; - + level.waypoints = getallnodes(); level.waypointcount = level.waypoints.size; - + level.waypointsinplayablearea = []; level.waypointsinplayablearea = get_nodes_in_playable_area(); } @@ -1254,37 +1254,37 @@ getMapName( map ) getBotToKick() { bots = getBotArray(); - + if ( !isdefined( bots ) || !isdefined( bots.size ) || bots.size <= 0 || !isdefined( bots[ 0 ] ) ) { return undefined; } - + tokick = undefined; - + // just kick lowest skill for ( i = 0; i < bots.size; i++ ) { bot = bots[ i ]; - + if ( !isdefined( bot ) ) { continue; } - + if ( !isdefined( bot.pers ) || !isdefined( bot.pers[ "bots" ] ) || !isdefined( bot.pers[ "bots" ][ "skill" ] ) || !isdefined( bot.pers[ "bots" ][ "skill" ][ "base" ] ) ) { continue; } - + if ( isdefined( tokick ) && bot.pers[ "bots" ][ "skill" ][ "base" ] > tokick.pers[ "bots" ][ "skill" ][ "base" ] ) { continue; } - + tokick = bot; } - + return tokick; } @@ -1295,19 +1295,19 @@ getBotArray() { result = []; playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { player = level.players[ i ]; - + if ( !player is_bot() ) { continue; } - + result[ result.size ] = player; } - + return result; } @@ -1348,7 +1348,7 @@ NewHeap( compare ) heap_node = spawnstruct(); heap_node.data = []; heap_node.compare = compare; - + return heap_node; } @@ -1359,19 +1359,19 @@ HeapInsert( item ) { insert = self.data.size; self.data[ insert ] = item; - + current = insert + 1; - + while ( current > 1 ) { last = current; current = int( current / 2 ); - + if ( ![[ self.compare ]]( item, self.data[ current - 1 ] ) ) { break; } - + self.data[ last - 1 ] = self.data[ current - 1 ]; self.data[ current - 1 ] = item; } @@ -1384,17 +1384,17 @@ _HeapNextChild( node, hsize ) { left = node * 2; right = left + 1; - + if ( left > hsize ) { return -1; } - + if ( right > hsize ) { return left; } - + if ( [[ self.compare ]]( self.data[ left - 1 ], self.data[ right - 1 ] ) ) { return left; @@ -1411,39 +1411,39 @@ _HeapNextChild( node, hsize ) HeapRemove() { remove = self.data.size; - + if ( !remove ) { return remove; } - + move = self.data[ remove - 1 ]; self.data[ 0 ] = move; self.data[ remove - 1 ] = undefined; remove--; - + if ( !remove ) { return remove; } - + last = 1; next = self _HeapNextChild( 1, remove ); - + while ( next != -1 ) { if ( [[ self.compare ]]( move, self.data[ next - 1 ] ) ) { break; } - + self.data[ last - 1 ] = self.data[ next - 1 ]; self.data[ next - 1 ] = move; - + last = next; next = self _HeapNextChild( next, remove ); } - + return remove; } @@ -1458,7 +1458,7 @@ Log( x ) denom = 1.0; frac = xmlxpl; sum = frac; - + while ( sum != old_sum ) { old_sum = sum; @@ -1466,7 +1466,7 @@ Log( x ) frac *= xmlxpl_2; sum += frac / denom; } - + answer = 2.0 * sum; return answer; } @@ -1479,12 +1479,12 @@ array_average( array ) { assert( array.size > 0 ); total = 0; - + for ( i = 0; i < array.size; i++ ) { total += array[ i ]; } - + return ( total / array.size ); } @@ -1496,19 +1496,19 @@ array_std_deviation( array, mean ) { assert( array.size > 0 ); tmp = []; - + for ( i = 0; i < array.size; i++ ) { tmp[ i ] = ( array[ i ] - mean ) * ( array[ i ] - mean ); } - + total = 0; - + for ( i = 0; i < tmp.size; i++ ) { total = total + tmp[ i ]; } - + return sqrt( total / array.size ); } @@ -1522,28 +1522,28 @@ random_normal_distribution( mean, std_deviation, lower_bound, upper_bound ) x2 = 0; w = 1; y1 = 0; - + while ( w >= 1 ) { x1 = 2 * randomfloatrange( 0, 1 ) - 1; x2 = 2 * randomfloatrange( 0, 1 ) - 1; w = x1 * x1 + x2 * x2; } - + w = sqrt( ( -2.0 * Log( w ) ) / w ); y1 = x1 * w; number = mean + y1 * std_deviation; - + if ( isdefined( lower_bound ) && number < lower_bound ) { number = lower_bound; } - + if ( isdefined( upper_bound ) && number > upper_bound ) { number = upper_bound; } - + return ( number ); } @@ -1553,7 +1553,7 @@ random_normal_distribution( mean, std_deviation, lower_bound, upper_bound ) inLastStand() { func = BotBuiltinGetFunction( "maps/_laststand", "player_is_in_laststand" ); - + return self [[ func ]](); } @@ -1563,7 +1563,7 @@ inLastStand() isReviving( revivee ) { func = BotBuiltinGetFunction( "maps/_laststand", "is_reviving" ); - + return self [[ func ]]( revivee ); } @@ -1576,7 +1576,7 @@ getRandomGoal() { return self.origin; } - + return PickRandom( level.waypointsinplayablearea ).origin; } @@ -1602,7 +1602,7 @@ targetIsGibbed() isWeaponPrimary( weap ) { weaps = self getweaponslistprimaries(); - + for ( i = 0; i < weaps.size; i++ ) { if ( weap == weaps[ i ] ) @@ -1610,7 +1610,7 @@ isWeaponPrimary( weap ) return true; } } - + return false; } @@ -1629,15 +1629,15 @@ GetPathIsInaccessible( from, to, team, best_effort ) get_path_dist( start, end, team ) { path = BotBuiltinGeneratePath( start, end, team, 192.0 ); - + if ( !isdefined( path ) || path.size <= 0 ) { return 999999999; } - + dist = 0; prev_node = undefined; - + for ( i = 0; i < path.size; i++ ) { if ( i == 0 ) @@ -1645,11 +1645,11 @@ get_path_dist( start, end, team ) prev_node = path[ i ]; continue; } - + dist += distance( prev_node.origin, path[ i ].origin ); prev_node = path[ i ]; } - + return dist; } @@ -1659,7 +1659,7 @@ get_path_dist( start, end, team ) ClampLerp( dist, min_dist, max_dist, max_bonus, min_bonus ) { answer = 0; - + if ( dist <= min_dist ) { answer += max_bonus; @@ -1673,7 +1673,7 @@ ClampLerp( dist, min_dist, max_dist, max_bonus, min_bonus ) dist_multi = 1 - ( ( dist - min_dist ) / ( max_dist - min_dist ) ); answer += min_bonus + ( ( max_bonus - min_bonus ) * dist_multi ); } - + return answer; } @@ -1686,27 +1686,27 @@ get_angle_offset_node( forward_size, angle_offset, offset ) { 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; node = self.origin + ( anglestoforward( angles ) * forward_size ) + offset; node = clamp_to_ground( node ); - + if ( getdvarint( "bots_main_debug" ) ) { self thread debug_offset_line( node ); } - + return node; } @@ -1718,7 +1718,7 @@ debug_offset_line( node ) self endon( "death" ); self notify( "debug_offset_line" ); self endon( "debug_offset_line" ); - + while ( isdefined( self ) ) { line( self.origin, node ); @@ -1735,10 +1735,10 @@ PointInsideUseTrigger( point ) { self thread debug_bounding_box_for_ent(); } - + mins = self BotBuiltinGetMins(); maxs = self BotBuiltinGetMaxs(); - + box = spawnstruct(); box.x0 = self.origin[ 0 ] + mins[ 0 ]; box.x1 = self.origin[ 0 ] + maxs[ 0 ]; @@ -1746,17 +1746,17 @@ PointInsideUseTrigger( point ) box.y1 = self.origin[ 1 ] + maxs[ 1 ]; box.z0 = self.origin[ 2 ] + mins[ 2 ]; box.z1 = self.origin[ 2 ] + maxs[ 2 ]; - + if ( box Rectdistancesquared( self.origin ) > 72 * 72 ) { return false; } - + if ( !sighttracepassed( point, self.origin, false, undefined ) ) { return false; } - + return true; } @@ -1768,34 +1768,34 @@ debug_bounding_box_for_ent( color ) self endon( "death" ); self notify( "debug_bounding_box_for_ent" ); self endon( "debug_bounding_box_for_ent" ); - + if ( !isdefined( color ) ) { color = ( randomfloatrange( 0, 1 ), randomfloatrange( 0, 1 ), randomfloatrange( 0, 1 ) ); } - + while ( isdefined( self ) ) { mins = self BotBuiltinGetMins(); maxs = self BotBuiltinGetMaxs(); - + line( self.origin + ( mins[ 0 ], mins[ 1 ], mins[ 2 ] ), self.origin + ( mins[ 0 ], mins[ 1 ], maxs[ 2 ] ), color ); line( self.origin + ( mins[ 0 ], mins[ 1 ], mins[ 2 ] ), self.origin + ( mins[ 0 ], maxs[ 1 ], mins[ 2 ] ), color ); line( self.origin + ( mins[ 0 ], mins[ 1 ], mins[ 2 ] ), self.origin + ( maxs[ 0 ], mins[ 1 ], mins[ 2 ] ), color ); - + line( self.origin + ( maxs[ 0 ], maxs[ 1 ], maxs[ 2 ] ), self.origin + ( maxs[ 0 ], maxs[ 1 ], mins[ 2 ] ), color ); line( self.origin + ( maxs[ 0 ], maxs[ 1 ], maxs[ 2 ] ), self.origin + ( maxs[ 0 ], mins[ 1 ], maxs[ 2 ] ), color ); line( self.origin + ( maxs[ 0 ], maxs[ 1 ], maxs[ 2 ] ), self.origin + ( mins[ 0 ], maxs[ 1 ], maxs[ 2 ] ), color ); - + line( self.origin + ( maxs[ 0 ], mins[ 1 ], mins[ 2 ] ), self.origin + ( maxs[ 0 ], maxs[ 1 ], mins[ 2 ] ), color ); line( self.origin + ( maxs[ 0 ], mins[ 1 ], mins[ 2 ] ), self.origin + ( maxs[ 0 ], mins[ 1 ], maxs[ 2 ] ), color ); - + line( self.origin + ( mins[ 0 ], mins[ 1 ], maxs[ 2 ] ), self.origin + ( maxs[ 0 ], mins[ 1 ], maxs[ 2 ] ), color ); line( self.origin + ( mins[ 0 ], mins[ 1 ], maxs[ 2 ] ), self.origin + ( mins[ 0 ], maxs[ 1 ], maxs[ 2 ] ), color ); - + line( self.origin + ( mins[ 0 ], maxs[ 1 ], mins[ 2 ] ), self.origin + ( maxs[ 0 ], maxs[ 1 ], mins[ 2 ] ), color ); line( self.origin + ( mins[ 0 ], maxs[ 1 ], mins[ 2 ] ), self.origin + ( mins[ 0 ], maxs[ 1 ], maxs[ 2 ] ), color ); - + wait 0.05; } } diff --git a/maps/bots/objectives/_manager.gsc b/maps/bots/objectives/_manager.gsc index 7cba6ca..fbd5111 100644 --- a/maps/bots/objectives/_manager.gsc +++ b/maps/bots/objectives/_manager.gsc @@ -22,7 +22,7 @@ connected() spawned() { self.bot_current_objective = undefined; - + self thread clean_objective_on_completion(); self thread watch_for_objective_canceled(); } @@ -32,18 +32,18 @@ watch_for_objective_canceled() self endon( "disconnect" ); level endon( "intermission" ); self endon( "zombified" ); - + for ( ;; ) { self waittill( "cancel_bot_objective", reason ); - + obj_name = "undefined"; - + if ( isdefined( self.bot_current_objective ) ) { obj_name = self.bot_current_objective.sname; } - + self BotNotifyBotEvent( "debug", "watch_for_objective_canceled: " + obj_name + ": " + reason ); } } @@ -53,22 +53,22 @@ clean_objective_on_completion() self endon( "disconnect" ); level endon( "intermission" ); self endon( "zombified" ); - + for ( ;; ) { self waittill( "completed_bot_objective", successful, reason ); - + obj_name = "undefined"; - + if ( isdefined( self.bot_current_objective ) ) { obj_name = self.bot_current_objective.sname; - + self.bot_current_objective.eparentobj.abotprocesstimes[ self getentitynumber() + "" ] = gettime(); } - + self BotNotifyBotEvent( "debug", "clean_objective_on_completion: " + obj_name + ": " + successful + ": " + reason ); - + waittillframeend; self.bot_current_objective = undefined; } @@ -79,7 +79,7 @@ start_bot_threads() self endon( "disconnect" ); level endon( "intermission" ); self endon( "zombified" ); - + self thread bot_objective_think(); } @@ -88,80 +88,80 @@ bot_objective_think() self endon( "disconnect" ); level endon( "intermission" ); self endon( "zombified" ); - + for ( ;; ) { wait 1; - + // find all avail objectives objectives = []; now = gettime(); our_key = self getentitynumber() + ""; - + for ( i = 0; i < level.bot_objectives.size; i++ ) { objective = level.bot_objectives[ i ]; - + // check the process rate if ( isdefined( objective.abotprocesstimes[ our_key ] ) && now - objective.abotprocesstimes[ our_key ] < objective.iprocessrate ) { continue; } - + objectives = array_merge( objectives, self [[ objective.fpfinder ]]( objective ) ); objective.abotprocesstimes[ our_key ] = now; } - + if ( objectives.size <= 0 ) { continue; } - + // sort according to priority heap = NewHeap( ::HeapPriority ); - + for ( i = 0; i < objectives.size; i++ ) { if ( objectives[ i ].fpriority <= -100 ) { continue; } - + heap HeapInsert( objectives[ i ] ); } - + // pop the top! best_prio = heap.data[ 0 ]; - + if ( !isdefined( best_prio ) ) { continue; } - + // 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 ) ) ) { continue; } - + // DO THE OBJ // cancel the old obj if ( isdefined( self.bot_current_objective ) ) { // cancel it self CancelObjective( "new obj: " + best_prio.sname ); - + // wait for it to clean up self waittill( "completed_bot_objective" ); - + // redo the loop, should do the obj next iteration best_prio.eparentobj.abotprocesstimes[ our_key ] = undefined; continue; } - + // ready to execute self BotNotifyBotEvent( "debug", "bot_objective_think: " + best_prio.sname ); - + self.bot_current_objective = best_prio; self thread [[ best_prio.eparentobj.fpexecuter ]]( best_prio ); } diff --git a/maps/bots/objectives/_perkmachine.gsc b/maps/bots/objectives/_perkmachine.gsc index c8d1b42..8b16698 100644 --- a/maps/bots/objectives/_perkmachine.gsc +++ b/maps/bots/objectives/_perkmachine.gsc @@ -6,17 +6,17 @@ init() { vending_triggers = getentarray( "zombie_vending", "targetname" ); - + if ( !isdefined( vending_triggers ) || vending_triggers.size < 1 ) { vending_triggers = getentarray( "harrybo21_perk_trigger", "targetname" ); - + if ( !isdefined( vending_triggers ) || vending_triggers.size < 1 ) { return; } } - + for ( i = 0 ; i < vending_triggers.size; i++ ) { vending_triggers[ i ] thread init_vending_trigger(); @@ -26,22 +26,22 @@ init() init_vending_trigger() { self endon( "death" ); - + if ( self.targetname == "harrybo21_perk_trigger" ) { machine = self getMachine(); - + machine waittill( "activate_machine" ); - + self.bot_powered_on = true; } else { perk = self getVendingPerk(); notify_name = perk + "_power_on"; - + level waittill( notify_name ); - + self.bot_powered_on = true; } } @@ -49,64 +49,64 @@ init_vending_trigger() Finder( eObj ) { answer = []; - + if ( self inLastStand() ) { return answer; } - + vending_triggers = getentarray( "zombie_vending", "targetname" ); - + if ( !isdefined( vending_triggers ) || vending_triggers.size < 1 ) { vending_triggers = getentarray( "harrybo21_perk_trigger", "targetname" ); - + if ( !isdefined( vending_triggers ) || vending_triggers.size < 1 ) { return answer; } } - + for ( i = 0 ; i < vending_triggers.size; i++ ) { vending = vending_triggers[ i ]; - + if ( !isdefined( vending.bot_powered_on ) || !vending.bot_powered_on ) { continue; } - + perk = vending getVendingPerk(); cost = vending getPerkCost(); - + if ( self.score < cost ) { continue; } - + // perk limit?? if ( self hasperk( perk ) ) { continue; } - + machine = vending getMachine(); - + if ( !isdefined( machine ) ) { continue; } - + org = self getOffset( machine ); - + if ( GetPathIsInaccessible( self.origin, org ) ) { continue; } - + answer[ answer.size ] = self CreateFinderObjectiveEZ( eObj, vending ); } - + return answer; } @@ -122,7 +122,7 @@ getVendingPerk() machine = self getMachine(); return machine.script_string; } - + return self.script_noteworthy; } @@ -132,39 +132,39 @@ getPerkCost() { return level.zombie_perks[ self getVendingPerk() ].perk_cost; } - + cost = level.zombie_vars[ "zombie_perk_cost" ]; - + switch ( self getVendingPerk() ) { case "specialty_armorvest": cost = 2500; break; - + case "specialty_quickrevive": cost = 1500; break; - + case "specialty_fastreload": cost = 3000; break; - + case "specialty_rof": cost = 2000; break; - + default: cost = 10000; break; } - + return cost; } getOffset( model ) { org = model get_angle_offset_node( 40, ( 0, -90, 0 ), ( 0, 0, 1 ) ); - + return org; } @@ -173,12 +173,12 @@ Priority( eObj, eEnt ) // TODO rank perks base_priority = 2; base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 500, 1600, 3, 0 ); - + if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) { base_priority -= 1; } - + return base_priority; } @@ -186,17 +186,17 @@ Executer( eObj ) { self endon( "disconnect" ); self endon( "zombified" ); - + vending = eObj.eent; - + self thread WatchForCancel( vending ); - + self GoDoPerkMachine( eObj ); - + self WatchForCancelCleanup(); self ClearScriptAimPos(); self ClearScriptGoal(); - + self CompletedObjective( eObj.bwassuccessful, eObj.sreason ); } @@ -210,11 +210,11 @@ WatchForCancel( vending ) self endon( "disconnect" ); self endon( "zombified" ); self endon( "WatchForCancelPerkmachine" ); - + for ( ;; ) { wait 0.05; - + if ( self inLastStand() ) { self CancelObjective( "self inLastStand()" ); @@ -231,11 +231,11 @@ WatchToGoToMachine( vending ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { wait 0.05; - + if ( self istouching( vending ) || vending PointInsideUseTrigger( self.origin ) ) { self notify( "goal" ); @@ -247,40 +247,40 @@ WatchToGoToMachine( vending ) GoDoPerkMachine( eObj ) { self endon( "cancel_bot_objective" ); - + vending = eObj.eent; machine = vending getMachine(); perk = vending getVendingPerk(); org = self getOffset( machine ); - + // go to machine self thread WatchToGoToMachine( vending ); self SetScriptGoal( org, 32 ); - + result = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + if ( result != "goal" ) { eObj.sreason = "didn't go to machine"; return; } - + if ( !self istouching( vending ) && !vending PointInsideUseTrigger( self.origin ) ) { eObj.sreason = "not touching machine"; return; } - + // ok we are touching machine, lets look at it self SetScriptAimPos( vending.origin ); - + // wait to look at it wait 1; - + // press use self thread BotPressUse( 0.15 ); wait 0.1; - + // ok we pressed use, DONE eObj.sreason = "completed " + perk; eObj.bwassuccessful = true; diff --git a/maps/bots/objectives/_powerup.gsc b/maps/bots/objectives/_powerup.gsc index 5042269..b0884c3 100644 --- a/maps/bots/objectives/_powerup.gsc +++ b/maps/bots/objectives/_powerup.gsc @@ -6,14 +6,14 @@ Finder( eObj ) { answer = []; - + if ( self inLastStand() ) { return answer; } - + ents = getentarray( "script_model", "classname" ); - + for ( i = 0; i < ents.size; i++ ) { // not a powerup script_model @@ -21,22 +21,22 @@ Finder( eObj ) { continue; } - + // can we path to it? if ( GetPathIsInaccessible( self.origin, ents[ i ].origin ) ) { continue; } - + // make sure we are the only one going for it if ( self GetBotsAmountForEntity( ents[ i ] ) >= 1 ) { continue; } - + answer[ answer.size ] = self CreateFinderObjectiveEZ( eObj, ents[ i ] ); } - + return answer; } @@ -45,12 +45,12 @@ Priority( eObj, eEnt ) // TODO: check powerup type base_priority = 0; base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 300, 700, 2, -2 ); - + if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) { base_priority -= 1; } - + return base_priority; } @@ -58,25 +58,25 @@ Executer( eObj ) { self endon( "disconnect" ); self endon( "zombified" ); - + powerup = eObj.eent; org = powerup.origin; - + self thread IncrementBotsForEntity( powerup ); self thread WatchForCancel( powerup ); - + self GoDoPowerup( eObj ); - + self WatchForCancelCleanup(); self DecrementBotsForEntity( powerup ); self ClearScriptGoal(); - + if ( distance( org, self.origin ) <= 64 ) { eObj.sreason = "completed"; eObj.bwassuccessful = true; } - + self CompletedObjective( eObj.bwassuccessful, eObj.sreason ); } @@ -90,17 +90,17 @@ WatchForCancel( powerup ) self endon( "disconnect" ); self endon( "zombified" ); self endon( "WatchForCancelPowerup" ); - + for ( ;; ) { wait 0.05; - + if ( self inLastStand() ) { self CancelObjective( "self inLastStand()" ); break; } - + if ( !isdefined( powerup ) ) { self CancelObjective( "!isdefined( powerup )" ); @@ -112,31 +112,31 @@ WatchForCancel( powerup ) GoDoPowerup( eObj ) { self endon( "cancel_bot_objective" ); - + powerup = eObj.eent; - + // go to it self SetScriptGoal( powerup.origin, 32 ); - + result = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + if ( result != "goal" ) { eObj.sreason = "didn't go to powerup"; return; } - + if ( !isdefined( powerup ) || !isdefined( powerup.origin ) ) { return; } - + if ( distance( powerup.origin, self.origin ) > 64 ) { eObj.sreason = "not touching it"; return; } - + eObj.sreason = "completed"; eObj.bwassuccessful = true; } diff --git a/maps/bots/objectives/_revive.gsc b/maps/bots/objectives/_revive.gsc index fe00389..356ad98 100644 --- a/maps/bots/objectives/_revive.gsc +++ b/maps/bots/objectives/_revive.gsc @@ -7,49 +7,49 @@ Finder( eObj ) { Players = get_players(); Answer = []; - + if ( self inLastStand() ) { return Answer; } - + for ( i = 0; i < Players.size; i++ ) { Player = Players[ i ]; - + if ( !isdefined( Player ) || !isdefined( Player.team ) ) { continue; } - + if ( Player == self ) { continue; } - + if ( Player.sessionstate != "playing" ) { continue; } - + if ( !Player inLastStand() || Player.revivetrigger.beingrevived ) { continue; } - + if ( GetPathIsInaccessible( self.origin, Player.origin ) ) { continue; } - + if ( self GetBotsAmountForEntity( Player ) >= 1 ) { continue; } - + Answer[ Answer.size ] = self CreateFinderObjectiveEZ( eObj, Player ); } - + return Answer; } @@ -57,12 +57,12 @@ Priority( eObj, eEnt ) { base_priority = 3; base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 500, 1200, 2, 0 ); - + if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) { base_priority -= 1; } - + return base_priority; } @@ -70,20 +70,20 @@ Executer( eObj ) { self endon( "disconnect" ); self endon( "zombified" ); - + revivee = eObj.eent; - + self thread IncrementBotsForEntity( revivee ); self thread WatchForCancelRevive( revivee ); - + self GoDoRevive( eObj ); - + self WatchForCancelReviveCleanup(); self DecrementBotsForEntity( revivee ); self ClearScriptAimPos(); self ClearScriptGoal(); self ClearPriorityObjective(); - + self CompletedObjective( eObj.bwassuccessful, eObj.sreason ); } @@ -97,31 +97,31 @@ WatchForCancelRevive( revivee ) self endon( "disconnect" ); self endon( "zombified" ); self endon( "WatchForCancelRevive" ); - + org = revivee.origin; - + for ( ;; ) { wait 0.05; - + if ( self inLastStand() ) { self CancelObjective( "self inLastStand()" ); break; } - + if ( !isdefined( revivee ) || !revivee inLastStand() ) { self CancelObjective( "!isdefined( revivee ) || !revivee inLastStand()" ); break; } - + if ( revivee.revivetrigger.beingrevived && !self isReviving( revivee ) ) { self CancelObjective( "revivee.revivetrigger.beingrevived && !self isReviving( revivee )" ); break; } - + if ( distance( revivee.origin, org ) > 16 ) { self CancelObjective( "distance( revivee.origin, org ) > 16" ); @@ -138,11 +138,11 @@ WatchToGoToGuy( revivee ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { wait 1; - + if ( self istouching( revivee.revivetrigger ) ) { self notify( "goal" ); @@ -155,11 +155,11 @@ WatchForSuccessRevive( eObj ) { self endon( "disconnect" ); self endon( "zombified" ); - + revivee = eObj.eent; - + ret = self waittill_either_return( "cancel_bot_objective", "completed_bot_objective" ); - + if ( ret == "cancel_bot_objective" && isdefined( revivee ) && !revivee inLastStand() ) { eObj.bwassuccessful = true; @@ -170,40 +170,40 @@ WatchForSuccessRevive( eObj ) GoDoRevive( eObj ) { self endon( "cancel_bot_objective" ); - + revivee = eObj.eent; - + // go to guy self thread WatchToGoToGuy( revivee ); self SetPriorityObjective(); self SetScriptGoal( revivee.origin, 32 ); - + result = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + if ( result != "goal" ) { eObj.sreason = "didn't go to guy"; return; } - + if ( !self istouching( revivee.revivetrigger ) ) { eObj.sreason = "not touching guy"; return; } - + // ok we are touching guy, lets look at him self SetScriptAimPos( revivee.origin ); - + // now lets hold use until he is up or otherwise self thread WatchForSuccessRevive( eObj ); - + while ( self istouching( revivee.revivetrigger ) ) { self thread BotPressUse( 0.15 ); - + wait 0.1; } - + eObj.sreason = "not touching guy"; } diff --git a/maps/bots/objectives/_treasurechest.gsc b/maps/bots/objectives/_treasurechest.gsc index 0b7503b..91bb26c 100644 --- a/maps/bots/objectives/_treasurechest.gsc +++ b/maps/bots/objectives/_treasurechest.gsc @@ -6,45 +6,45 @@ Finder( eObj ) { answer = []; - + if ( self inLastStand() ) { return answer; } - + weapons = self getweaponslist(); - + // TODO check if need a new weapon, rate weapons too is better then current etc chests = level.chests; - + if ( !isdefined( chests ) ) { chests = getentarray( "treasure_chest_use", "targetname" ); } - + if ( !isdefined( chests ) || chests.size <= 0 ) { return answer; } - + for ( i = 0; i < chests.size; i ++ ) { chest = chests[ i ]; - + // not active chest if ( isdefined( chest.disabled ) && chest.disabled ) { continue; } - + // box is waiting for someone to grab weapon if ( isdefined( chest.grab_weapon_hint ) && chest.grab_weapon_hint ) { continue; } - + cost = 950; - + if ( isdefined( level.zombie_treasure_chest_cost ) ) { cost = level.zombie_treasure_chest_cost; @@ -53,44 +53,44 @@ Finder( eObj ) { cost = chest.zombie_cost; } - + // check cost if ( self.score < cost ) { continue; } - + lid = getent( chest.target, "targetname" ); - + if ( !isdefined( lid ) ) { continue; } - + weapon_spawn_org = getent( lid.target, "targetname" ); - + if ( !isdefined( weapon_spawn_org ) ) { continue; } - + org = self getOffset( lid ); - + if ( GetPathIsInaccessible( self.origin, org ) ) { continue; } - + answer[ answer.size ] = self CreateFinderObjectiveEZ( eObj, chest ); } - + return answer; } getOffset( model ) { org = model get_angle_offset_node( 52, ( 0, 90, 0 ), ( 0, 0, 1 ) ); - + return org; } @@ -98,12 +98,12 @@ Priority( eObj, eEnt ) { base_priority = 1; base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 600, 1800, 2, 0 ); - + if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) { base_priority -= 1; } - + return base_priority; } @@ -111,18 +111,18 @@ Executer( eObj ) { self endon( "disconnect" ); self endon( "zombified" ); - + chest = eObj.eent; - + self thread WatchForCancel( chest ); - + self GoDoTreasureChest( eObj ); - + self WatchForCancelCleanup(); self ClearScriptAimPos(); self ClearScriptGoal(); self ClearPriorityObjective(); - + self CompletedObjective( eObj.bwassuccessful, eObj.sreason ); } @@ -136,11 +136,11 @@ WatchForCancel( chest ) self endon( "disconnect" ); self endon( "zombified" ); self endon( "WatchForCancelTreasurechest" ); - + for ( ;; ) { wait 0.05; - + if ( self inLastStand() ) { self CancelObjective( "self inLastStand()" ); @@ -157,17 +157,17 @@ WatchToGoToChest( chest ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { wait 0.05; - + if ( self istouching( chest ) || chest PointInsideUseTrigger( self.origin ) ) { self notify( "goal" ); break; // is this needed? } - + if ( isdefined( chest.disabled ) && chest.disabled ) { self notify( "bad_path" ); @@ -179,105 +179,105 @@ WatchToGoToChest( chest ) GoDoTreasureChest( eObj ) { self endon( "cancel_bot_objective" ); - + chest = eObj.eent; lid = getent( chest.target, "targetname" ); weapon_spawn_org = getent( lid.target, "targetname" ); org = self getOffset( lid ); - + weap = self getcurrentweapon(); - + if ( weap == "none" || !self getammocount( weap ) ) { self SetPriorityObjective(); } - + // go to box self thread WatchToGoToChest( chest ); self SetScriptGoal( org, 32 ); - + result = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + if ( result != "goal" ) { eObj.sreason = "didn't go to chest"; return; } - + if ( !self istouching( chest ) && !chest PointInsideUseTrigger( self.origin ) ) { eObj.sreason = "not touching chest"; return; } - + // ok we are touching weapon, lets look at it self SetScriptAimPos( chest.origin ); - + // wait to look at it wait 1; - + // press use self thread BotPressUse( 0.15 ); wait 0.25; - + // ok we pressed use, wait for randomization to complete self ClearScriptAimPos(); self ClearPriorityObjective(); - + // randomization isnt happening... if ( !isdefined( chest.disabled ) || !chest.disabled ) { eObj.sreason = "chest isnt randomizing"; return; } - + ret = weapon_spawn_org waittill_any_timeout( 5, "randomization_done" ); - - if (ret == "timeout") + + if ( ret == "timeout" ) { eObj.sreason = "randomization_done timed out"; return; } - + if ( isdefined( level.flag[ "moving_chest_now" ] ) && flag( "moving_chest_now" ) ) { eObj.sreason = "chest is moving!"; return; } - + waittillframeend; weap = weapon_spawn_org.weapon_string; // weapon is done cooking, grabit! self SetPriorityObjective(); - + // go to box self thread WatchToGoToChest( chest ); self SetScriptGoal( org, 32 ); - + result = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + if ( result != "goal" ) { eObj.sreason = "didn't go to chest"; return; } - + if ( !self istouching( chest ) && !chest PointInsideUseTrigger( self.origin ) ) { eObj.sreason = "not touching chest"; return; } - + // ok we are touching weapon, lets look at it self SetScriptAimPos( chest.origin ); - + // wait to look at it wait 1; - + // press use self thread BotPressUse( 0.15 ); wait 0.1; - + // complete! eObj.sreason = "completed " + weap; eObj.bwassuccessful = true; diff --git a/maps/bots/objectives/_utility.gsc b/maps/bots/objectives/_utility.gsc index cea9d66..e947c4d 100644 --- a/maps/bots/objectives/_utility.gsc +++ b/maps/bots/objectives/_utility.gsc @@ -5,15 +5,15 @@ CreateObjectiveForManger( sName, fpFinder, fpPriorty, fpExecuter, iProcessRate ) { Answer = spawnstruct(); - + Answer.sname = sName; Answer.fpfinder = fpFinder; Answer.fpexecuter = fpExecuter; Answer.fppriorty = fpPriorty; - + Answer.abotprocesstimes = []; Answer.iprocessrate = iProcessRate; - + return Answer; } @@ -25,16 +25,16 @@ CreateFinderObjectiveEZ( eObj, eEnt ) CreateFinderObjective( eObj, sName, eEnt, fPriority ) { Answer = spawnstruct(); - + Answer.eparentobj = eObj; Answer.sname = sName; Answer.eent = eEnt; Answer.fpriority = fPriority; Answer.guid = eEnt getentitynumber(); - + Answer.bwassuccessful = false; Answer.sreason = "canceled"; - + return Answer; } @@ -44,18 +44,18 @@ GetBotsAmountForEntity( eEnt ) { eEnt.bots = 0; } - + return eEnt.bots; } IncrementBotsForEntity( eEnt ) { self endon( "bots_for_entity_cleanup" ); - + eEnt.bots++; - + self waittill_either( "disconnect", "zombified" ); - + if ( isdefined( eEnt ) ) { eEnt.bots--; @@ -65,7 +65,7 @@ IncrementBotsForEntity( eEnt ) DecrementBotsForEntity( eEnt ) { self notify( "bots_for_entity_cleanup" ); - + if ( isdefined( eEnt ) ) { eEnt.bots--; @@ -93,7 +93,7 @@ GetBotObjectiveEnt() { return undefined; } - + return self GetBotObjective().eent; } diff --git a/maps/bots/objectives/_wallweapon.gsc b/maps/bots/objectives/_wallweapon.gsc index 7a46b87..eac5827 100644 --- a/maps/bots/objectives/_wallweapon.gsc +++ b/maps/bots/objectives/_wallweapon.gsc @@ -6,32 +6,32 @@ Finder( eObj ) { answer = []; - + if ( self inLastStand() ) { return answer; } - + weapon_spawns = getentarray( "weapon_upgrade", "targetname" ); - + if ( !isdefined( weapon_spawns ) || weapon_spawns.size <= 0 ) { return answer; } - + weapons = self getweaponslist(); - + // TODO check if need a new weapon, rate weapons too is better then current etc - + for ( i = 0; i < weapon_spawns.size; i++ ) { player_has_weapon = false; - + if ( !isdefined( weapon_spawns[ i ].zombie_weapon_upgrade ) ) { continue; } - + for ( h = 0; h < weapons.size; h++ ) { if ( weapons[ h ] == weapon_spawns[ i ].zombie_weapon_upgrade ) @@ -39,13 +39,13 @@ Finder( eObj ) player_has_weapon = true; } } - + is_grenade = ( weapontype( weapon_spawns[ i ].zombie_weapon_upgrade ) == "grenade" ); - + if ( !player_has_weapon || is_grenade ) { func = BotBuiltinGetFunction( "maps/_zombiemode_weapons", "get_weapon_cost" ); - + if ( self.score < [[ func ]]( weapon_spawns[ i ].zombie_weapon_upgrade ) ) { continue; @@ -54,69 +54,69 @@ Finder( eObj ) else { func = BotBuiltinGetFunction( "maps/_zombiemode_weapons", "get_ammo_cost" ); - + if ( self.score < [[ func ]]( weapon_spawns[ i ].zombie_weapon_upgrade ) ) { continue; } } - + model = weapon_spawns[ i ]; - + if ( isdefined( weapon_spawns[ i ].target ) ) { model = getent( weapon_spawns[ i ].target, "targetname" ); } - + if ( !isdefined( model ) ) { continue; } - + org = self getOffset( model, weapon_spawns[ i ] ); - + if ( GetPathIsInaccessible( self.origin, org ) ) { continue; } - + answer[ answer.size ] = self CreateFinderObjectiveEZ( eObj, weapon_spawns[ i ] ); } - + return answer; } getOffset( model, weapon ) { org = model get_angle_offset_node( 40, ( 0, -90, 0 ), ( 0, 0, 1 ) ); - + test_org = ( org[ 0 ], org[ 1 ], weapon.origin[ 2 ] ); - + if ( !weapon PointInsideUseTrigger( test_org ) ) { org = model get_angle_offset_node( 40, ( 0, 90, 0 ), ( 0, 0, 1 ) ); } - + return org; } Priority( eObj, eEnt ) { // TODO: check weallweapon type - + base_priority = 0; base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 0, 800, 1, -2 ); - + if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) { base_priority -= 1; } - + if ( issubstr( eEnt.zombie_weapon_upgrade, "kar98k" ) || issubstr( eEnt.zombie_weapon_upgrade, "type99" ) ) { base_priority -= 999; } - + return base_priority; } @@ -124,18 +124,18 @@ Executer( eObj ) { self endon( "disconnect" ); self endon( "zombified" ); - + weapon = eObj.eent; - + self thread WatchForCancel( weapon ); - + self GoDoWallweapon( eObj ); - + self WatchForCancelCleanup(); self ClearScriptAimPos(); self ClearScriptGoal(); self ClearPriorityObjective(); - + self CompletedObjective( eObj.bwassuccessful, eObj.sreason ); } @@ -149,11 +149,11 @@ WatchForCancel( weapon ) self endon( "disconnect" ); self endon( "zombified" ); self endon( "WatchForCancelWallweapon" ); - + for ( ;; ) { wait 0.05; - + if ( self inLastStand() ) { self CancelObjective( "self inLastStand()" ); @@ -170,11 +170,11 @@ WatchToGoToWeapon( weapon ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { wait 0.05; - + if ( self istouching( weapon ) || weapon PointInsideUseTrigger( self.origin ) ) { self notify( "goal" ); @@ -186,52 +186,52 @@ WatchToGoToWeapon( weapon ) GoDoWallweapon( eObj ) { self endon( "cancel_bot_objective" ); - + weapon = eObj.eent; model = weapon; - + if ( isdefined( weapon.target ) ) { model = getent( weapon.target, "targetname" ); } - + org = self getOffset( model, weapon ); - + weap = self getcurrentweapon(); - + if ( weap == "none" || !self getammocount( weap ) ) { self SetPriorityObjective(); } - + // go to weapon self thread WatchToGoToWeapon( weapon ); self SetScriptGoal( org, 32 ); - + result = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + if ( result != "goal" ) { eObj.sreason = "didn't go to weapon"; return; } - + if ( !self istouching( weapon ) && !weapon PointInsideUseTrigger( self.origin ) ) { eObj.sreason = "not touching weapon"; return; } - + // ok we are touching weapon, lets look at it self SetScriptAimPos( weapon.origin ); - + // wait to look at it wait 1; - + // press use self thread BotPressUse( 0.15 ); wait 0.1; - + eObj.sreason = "completed"; eObj.bwassuccessful = true; }