diff --git a/maps/bots/_bot.gsc b/maps/bots/_bot.gsc index f1e5a1c..b942156 100644 --- a/maps/bots/_bot.gsc +++ b/maps/bots/_bot.gsc @@ -93,7 +93,7 @@ init() level.bots_minGrenadeDistance *= level.bots_minGrenadeDistance; level.bots_maxGrenadeDistance = 1024; level.bots_maxGrenadeDistance *= level.bots_maxGrenadeDistance; - level.bots_maxKnifeDistance = 80; + level.bots_maxKnifeDistance = 128; level.bots_maxKnifeDistance *= level.bots_maxKnifeDistance; level.bots_goalDistance = 27.5; level.bots_goalDistance *= level.bots_goalDistance; diff --git a/maps/bots/_bot_internal.gsc b/maps/bots/_bot_internal.gsc index 9c38784..6d43d71 100644 --- a/maps/bots/_bot_internal.gsc +++ b/maps/bots/_bot_internal.gsc @@ -87,6 +87,7 @@ resetBotVars() self.bot.issmokingafter = false; self.bot.isknifing = false; self.bot.isknifingafter = false; + self.bot.knifing_target = undefined; self.bot.semi_time = false; self.bot.jump_time = undefined; @@ -660,7 +661,7 @@ doBotMovement_loop( data ) } // move! - if ( self.bot.wantsprint && self.bot.issprinting ) + 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] ) ); @@ -1267,7 +1268,7 @@ aim_loop() } else { - if ( self canAds( dist, curweap ) ) + if ( self canFire( curweap ) && self isInRange( dist, curweap ) && self canAds( dist, curweap ) ) { if ( !self.bot.is_cur_sniper || !self.pers["bots"]["behavior"]["quickscope"] ) self thread pressAds(); @@ -1293,7 +1294,9 @@ aim_loop() conedot = getConeDot( aimpos, eyePos, angles ); - if ( !nadeAimOffset && conedot > 0.999 && lengthsquared( aimoffset ) < 0.05 ) + if ( isDefined( self.bot.knifing_target ) ) + self thread bot_lookat( target getTagOrigin( "j_spine4" ), 0.05 ); + else if ( !nadeAimOffset && conedot > 0.999 && lengthsquared( aimoffset ) < 0.05 ) self thread bot_lookat( aimpos, 0.05 ); else self thread bot_lookat( aimpos, aimspeed, target getAiVelocity(), true ); @@ -1313,7 +1316,7 @@ aim_loop() if ( isActor && !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(); + self thread knife( target, isActor ); return; } @@ -2027,16 +2030,54 @@ reload() self BotBuiltinBotAction( "-reload" ); } +/* + Performs melee target +*/ +do_knife_target( target, isActor ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "bot_knife" ); + + if ( !isDefined( target ) || ( !isPlayer( target ) && ( !isDefined( isActor ) || !isActor ) ) ) + { + 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 ); +} + /* Bot will knife. */ -knife() +knife( target, isActor ) { self endon( "zombified" ); self endon( "disconnect" ); self notify( "bot_knife" ); self endon( "bot_knife" ); + self thread do_knife_target( target, isActor ); + self.bot.isknifing = true; self.bot.isknifingafter = true; diff --git a/maps/bots/_bot_utility.gsc b/maps/bots/_bot_utility.gsc index 0fa8fde..8491fdc 100644 --- a/maps/bots/_bot_utility.gsc +++ b/maps/bots/_bot_utility.gsc @@ -67,6 +67,17 @@ BotBuiltinBotMovement( left, forward ) } } +/* + Sets melee params +*/ +BotBuiltinBotMeleeParams( yaw, dist ) +{ + if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins["botmeleeparams"] ) ) + { + self [[ level.bot_builtins["botmeleeparams" ]]]( yaw, dist ); + } +} + /* Test if is a bot diff --git a/scripts/sp/bots_adapter_pt4.gsc b/scripts/sp/bots_adapter_pt4.gsc index f158340..84a72c3 100644 --- a/scripts/sp/bots_adapter_pt4.gsc +++ b/scripts/sp/bots_adapter_pt4.gsc @@ -4,6 +4,7 @@ init() level.bot_builtins["botaction"] = ::do_botaction; level.bot_builtins["botstop"] = ::do_botstop; level.bot_builtins["botmovement"] = ::do_botmovement; + level.bot_builtins["botmeleeparams"] = ::do_botmeleeparams; level.bot_builtins["isbot"] = ::do_isbot; level.bot_builtins["generatepath"] = ::do_generatepath; level.bot_builtins["getfunction"] = ::do_getfunction; @@ -40,6 +41,11 @@ do_botmovement( left, forward ) self BotMovement( left, forward ); } +do_botmeleeparams( yaw, dist ) +{ + // self BotMeleeParams( yaw, dist ); +} + do_isbot() { return self isBot();