diff --git a/userraw/maps/mp/bots/_bot.gsc b/userraw/maps/mp/bots/_bot.gsc index 8e7ad7e..762f1a0 100644 --- a/userraw/maps/mp/bots/_bot.gsc +++ b/userraw/maps/mp/bots/_bot.gsc @@ -127,6 +127,7 @@ init() level thread onPlayerConnect(); level thread addNotifyOnAirdrops(); + level thread watchScrabler(); level thread handleBots(); } @@ -253,6 +254,43 @@ onPlayerConnect() } } +watchScrabler() +{ + for (;;) + { + wait 1; + + for ( i = level.players.size - 1; i >= 0; i-- ) + { + player = level.players[i]; + + player.bot_isScrambled = false; + + if (!player _HasPerk("specialty_localjammer") || !isReallyAlive(player)) + continue; + + if (player isEMPed()) + continue; + + for ( h = level.players.size - 1; h >= 0; h-- ) + { + player2 = level.players[h]; + + if (player2 == player) + continue; + + if(level.teamBased && player2.team == player.team) + continue; + + if (Distance(player2.origin, player.origin) > 100) + continue; + + player.bot_isScrambled = true; + } + } + } +} + /* Called when a player connects. */ diff --git a/userraw/maps/mp/bots/_bot_script.gsc b/userraw/maps/mp/bots/_bot_script.gsc index 53132d0..1bc817b 100644 --- a/userraw/maps/mp/bots/_bot_script.gsc +++ b/userraw/maps/mp/bots/_bot_script.gsc @@ -1085,6 +1085,199 @@ onBotSpawned() self thread bot_weapon_think(); self thread bot_crate_think(); self thread bot_turret_think(); + self thread bot_revenge_think(); + self thread bot_uav_think(); + self thread bot_listen_to_steps(); + } +} + +bot_listen_to_steps() +{ + self endon("disconnect"); + self endon("death"); + + for(;;) + { + wait 1; + + if(self HasScriptGoal() || self.bot_lock_goal) + continue; + + if(self.pers["bots"]["skill"]["base"] < 3) + continue; + + dist = level.bots_listenDist; + if(self hasPerk("specialty_selectivehearing")) + dist *= 1.4; + + dist *= dist; + + heard = undefined; + for(i = level.players.size-1 ; i >= 0; i--) + { + player = level.players[i]; + + if(player == self) + continue; + if(level.teamBased && self.team == player.team) + continue; + if(player.sessionstate != "playing") + continue; + if(!isReallyAlive(player)) + continue; + + if ( player is_bot() && lengthsquared( player getBotVelocity() ) < 20000 ) + continue; + + if( lengthsquared( player getVelocity() ) < 20000 ) + continue; + + if( distanceSquared(player.origin, self.origin) > dist ) + continue; + + if( player hasPerk("specialty_quieter")) + continue; + + heard = player; + break; + } + + hasHeartbeat = (isSubStr(self GetCurrentWeapon(), "_heartbeat_") && !self IsEMPed()); + heartbeatDist = 350*350; + + if(!IsDefined(heard) && hasHeartbeat) + { + for(i = level.players.size-1 ; i >= 0; i--) + { + player = level.players[i]; + + if(player == self) + continue; + if(level.teamBased && self.team == player.team) + continue; + if(player.sessionstate != "playing") + continue; + if(!isReallyAlive(player)) + continue; + + if (player hasPerk("specialty_heartbreaker")) + continue; + + if (distanceSquared(player.origin, self.origin) > heartbeatDist) + continue; + + if (GetConeDot(player.origin, self.origin, self GetPlayerAngles()) < 0.6) + continue; + + heard = player; + } + } + + if(!IsDefined(heard)) + continue; + + if(bulletTracePassed(self getEye(), heard getTagOrigin( "j_spineupper" ), false, heard)) + { + self setAttacker(heard); + continue; + } + + self SetScriptGoal( heard.origin, 64 ); + self waittill_any( "goal", "bad_path" ); + self ClearScriptGoal(); + } +} + +bot_uav_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + + for(;;) + { + wait 0.75; + + if ( self HasScriptGoal() || self.bot_lock_goal ) + continue; + + if(self.pers["bots"]["skill"]["base"] <= 1) + continue; + + if (self isEMPed() || self.bot_isScrambled) + continue; + + if (self _hasPerk("_specialty_blastshield")) + continue; + + if ((level.teamBased && level.activeCounterUAVs[level.otherTeam[self.team]]) || (!level.teamBased && self.isRadarBlocked)) + continue; + + hasRadar = ((level.teamBased && level.activeUAVs[self.team]) || (!level.teamBased && level.activeUAVs[self.guid])); + if( level.hardcoreMode && !hasRadar ) + continue; + + dist = self.pers["bots"]["skill"]["help_dist"]; + dist *= 8; + + for ( i = level.players.size - 1; i >= 0; i-- ) + { + player = level.players[i]; + + if(player == self) + continue; + + if(!isDefined(player.team)) + continue; + + if(player.sessionstate != "playing") + continue; + + if(level.teambased && player.team == self.team) + continue; + + if(!isReallyAlive(player)) + continue; + + if(DistanceSquared(self.origin, player.origin) > dist) + continue; + + if((!isSubStr(player getCurrentWeapon(), "_silencer_") && player.bots_firing) || (hasRadar && !player hasPerk("specialty_coldblooded"))) + { + self SetScriptGoal( player.origin, 128 ); + + self waittill_any( "goal", "bad_path" ); + + self ClearScriptGoal(); + break; + } + } + } +} + +bot_revenge_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + + if(self.pers["bots"]["skill"]["base"] <= 1) + return; + + if(!isDefined(self.killerLocation)) + return; + + for(;;) + { + wait( RandomIntRange( 1, 5 ) ); + + if(self HasScriptGoal() || self.bot_lock_goal) + return; + + if ( randomint( 100 ) < 75 ) + return; + + self SetScriptGoal( self.killerLocation, 64 ); + self waittill_any( "goal", "bad_path" ); + self ClearScriptGoal(); } } @@ -1154,6 +1347,9 @@ bot_turret_think() continue; } + if(self.pers["bots"]["skill"]["base"] <= 1) + continue; + if (self HasScriptEnemy() || self IsUsingRemote()) continue; @@ -1435,6 +1631,9 @@ bot_target_vehicle() { wait randomIntRange(2, 4); + if(self.pers["bots"]["skill"]["base"] <= 1) + continue; + if(self HasScriptEnemy()) continue; @@ -1732,7 +1931,7 @@ bot_killstreak_think() if (streakName == "counter_uav" && self.pers["bots"]["skill"]["base"] > 3 && ((level.teamBased && level.activeCounterUAVs[self.team]) || (!level.teamBased && level.activeCounterUAVs[self.guid]))) continue; - if (streakName == "uav" && self.pers["bots"]["skill"]["base"] > 3 && ((level.teamBased && level.activeUAVs[self.team]) || (!level.teamBased && level.activeUAVs[self.guid]))) + if (streakName == "uav" && self.pers["bots"]["skill"]["base"] > 3 && ((level.teamBased && (level.activeUAVs[self.team] || level.activeCounterUAVs[level.otherTeam[self.team]])) || (!level.teamBased && (level.activeUAVs[self.guid] || self.isRadarBlocked)))) continue; if (streakName == "emp" && self.pers["bots"]["skill"]["base"] > 3 && ((level.teamBased && level.teamEMPed[level.otherTeam[self.team]]) || (!level.teamBased && isDefined( level.empPlayer ))))