From 8a9c7fb2468f0f196d08b995911717bc213b0d88 Mon Sep 17 00:00:00 2001
From: Your Name <you@example.com>
Date: Fri, 18 Sep 2020 12:51:32 -0600
Subject: [PATCH] fix camp killstreak

---
 userraw/maps/mp/bots/_bot_script.gsc  | 129 +++++++++++++++++---------
 userraw/maps/mp/bots/_bot_utility.gsc |   5 +
 2 files changed, 89 insertions(+), 45 deletions(-)

diff --git a/userraw/maps/mp/bots/_bot_script.gsc b/userraw/maps/mp/bots/_bot_script.gsc
index fbcb840..3534c61 100644
--- a/userraw/maps/mp/bots/_bot_script.gsc
+++ b/userraw/maps/mp/bots/_bot_script.gsc
@@ -1078,6 +1078,66 @@ bots_watch_touch_obj(obj)
 	}
 }
 
+nearAnyOfWaypoints(dist, waypoints)
+{
+	dist *= dist;
+	for (i = 0; i < waypoints.size; i++)
+	{
+		waypoint = waypoints[i];
+
+		if (DistanceSquared(waypoint.origin, self.origin) > dist)
+			continue;
+
+		return true;
+	}
+
+	return false;
+}
+
+bot_escort_obj(obj, carrier)
+{
+	self endon( "death" );
+	self endon( "disconnect" );
+	self endon( "goal" );
+	self endon( "bad_path" );
+	self endon( "new_goal" );
+
+	for (;;)
+	{
+		wait 0.5;
+
+		if (!isDefined(obj))
+			break;
+
+		if (!isDefined(obj.carrier) || carrier == obj.carrier)
+			break;
+	}
+	
+	self notify("goal");
+}
+
+bot_get_obj(obj)
+{
+	self endon( "death" );
+	self endon( "disconnect" );
+	self endon( "goal" );
+	self endon( "bad_path" );
+	self endon( "new_goal" );
+	
+	for (;;)
+	{
+		wait 0.5;
+
+		if (!isDefined(obj))
+			break;
+
+		if (isDefined(obj.carrier))
+			break;
+	}
+	
+	self notify("goal");
+}
+
 /*
 	When the bot spawned, after the difficulty wait. Start the logic for the bot.
 */
@@ -2784,6 +2844,24 @@ clear_remote_on_death(isac130)
 	self ClearUsingRemote();
 }
 
+isAnyEnemyPlanes()
+{
+	for (i = 0; i < level.planes.size; i++)
+	{
+		plane = level.planes[i];
+
+		if (level.teamBased && plane.team == self.team)
+			continue;
+
+		if (isDefined(plane.owner) && plane.owner == self)
+			continue;
+
+		return true;
+	}
+
+	return false;
+}
+
 bot_killstreak_think()
 {
 	self endon("disconnect");
@@ -2832,12 +2910,15 @@ bot_killstreak_think()
 
 		ksWeap = maps\mp\killstreaks\_killstreaks::getKillstreakWeapon( streakName );
 
+		if (isStrStart(streakName, "helicopter_") && self isAnyEnemyPlanes() && self.pers["bots"]["skill"]["base"] > 3)
+			continue;
+
 		if (maps\mp\killstreaks\_killstreaks::isRideKillstreak(streakName) || maps\mp\killstreaks\_killstreaks::isCarryKillstreak(streakName))
 		{
 			if (self inLastStand())
 				continue;
 
-			if (self.pers["killstreaks"][0].lifeId == self.pers["deaths"] && !self HasScriptGoal() && !self.bot_lock_goal && streakName != "sentry")
+			if (self.pers["killstreaks"][0].lifeId == self.pers["deaths"] && !self HasScriptGoal() && !self.bot_lock_goal && streakName != "sentry" && !self nearAnyOfWaypoints(128, level.waypointsCamp))
 			{
 				campSpots = [];
 				for (i = 0; i < level.waypointsCamp.size; i++)
@@ -2855,6 +2936,8 @@ bot_killstreak_think()
 
 					if (self waittill_any_return("new_goal", "goal", "bad_path") != "new_goal")
 						self ClearScriptGoal();
+
+					continue;
 				}
 			}
 				
@@ -3646,47 +3729,3 @@ bot_cap_get_flag(flag)
 	if (evt != "new_goal")
 		self ClearScriptGoal();
 }
-
-bot_escort_obj(obj, carrier)
-{
-	self endon( "death" );
-	self endon( "disconnect" );
-	self endon( "goal" );
-	self endon( "bad_path" );
-	self endon( "new_goal" );
-
-	for (;;)
-	{
-		wait 0.5;
-
-		if (!isDefined(obj))
-			break;
-
-		if (!isDefined(obj.carrier) || carrier == obj.carrier)
-			break;
-	}
-	
-	self notify("goal");
-}
-
-bot_get_obj(obj)
-{
-	self endon( "death" );
-	self endon( "disconnect" );
-	self endon( "goal" );
-	self endon( "bad_path" );
-	self endon( "new_goal" );
-	
-	for (;;)
-	{
-		wait 0.5;
-
-		if (!isDefined(obj))
-			break;
-
-		if (isDefined(obj.carrier))
-			break;
-	}
-	
-	self notify("goal");
-}
diff --git a/userraw/maps/mp/bots/_bot_utility.gsc b/userraw/maps/mp/bots/_bot_utility.gsc
index 79269a3..477978f 100644
--- a/userraw/maps/mp/bots/_bot_utility.gsc
+++ b/userraw/maps/mp/bots/_bot_utility.gsc
@@ -559,6 +559,11 @@ tokenizeLine(line, tok)
   return tokens;
 }
 
+isStrStart( string1, subStr )
+{
+	return ( getSubStr( string1, 0, subStr.size ) == subStr );
+}
+
 parseTokensIntoWaypoint(tokens)
 {
 	waypoint = spawnStruct();