This commit is contained in:
Your Name 2020-08-13 12:28:24 -06:00
parent e5cad564ca
commit a43849dcb3
4 changed files with 258 additions and 8 deletions

View File

@ -354,7 +354,7 @@ UseRunThink()
self.bot.isfrozen || self.bot.climbing || self.bot.isfrozen || self.bot.climbing ||
self.bot.isreloading || self.bot.isreloading ||
self.bot.ads_pressed || self.bot.fire_pressed || self.bot.ads_pressed || self.bot.fire_pressed ||
self.bot.isfragging || self.bot.isfragging || self.bot.knifing ||
lengthsquared(self.bot.velocity) <= 25 || lengthsquared(self.bot.velocity) <= 25 ||
self IsStunned() || self isArtShocked() || self maps\mp\_flashgrenades::isFlashbanged()) self IsStunned() || self isArtShocked() || self maps\mp\_flashgrenades::isFlashbanged())
{ {
@ -1060,7 +1060,12 @@ grenade_danager()
if (self.bot.isfrozen || level.gameEnded || !gameFlag( "prematch_done" )) if (self.bot.isfrozen || level.gameEnded || !gameFlag( "prematch_done" ))
continue; continue;
if(self.bot.isfraggingafter || self.bot.climbing) if(self.bot.isfraggingafter || self.bot.climbing || self.bot.knifingafter)
continue;
curWeap = self GetCurrentWeapon();
if (!isWeaponDroppable(curWeap))
continue; continue;
myEye = self getEye(); myEye = self getEye();
@ -1206,7 +1211,7 @@ reload_thread()
if (self.bot.isfrozen || level.gameEnded || !gameFlag( "prematch_done" )) if (self.bot.isfrozen || level.gameEnded || !gameFlag( "prematch_done" ))
return; return;
if(isDefined(self.bot.target) || self.bot.isreloading || self.bot.isfraggingafter || self.bot.climbing || self.bot.knifing) if(isDefined(self.bot.target) || self.bot.isreloading || self.bot.isfraggingafter || self.bot.climbing || self.bot.knifingafter)
return; return;
cur = self getCurrentWEapon(); cur = self getCurrentWEapon();
@ -2108,6 +2113,18 @@ knife(ent, knifeDist)
{ {
self endon("disconnect"); self endon("disconnect");
self endon("death"); self endon("death");
level endon ( "game_ended" );
if (level.gameEnded || !gameFlag( "prematch_done" ) || self.bot.isfrozen)
return;
curWeap = self GetCurrentWeapon();
if (!isWeaponDroppable(curWeap))
return;
if (self.bot.knifing || self.bot.isfraggingafter)
return;
self notify("bot_kill_knife"); self notify("bot_kill_knife");
self endon("bot_kill_knife"); self endon("bot_kill_knife");
@ -2116,7 +2133,6 @@ knife(ent, knifeDist)
self.bot.knifingafter = true; self.bot.knifingafter = true;
isplay = isPlayer(ent); isplay = isPlayer(ent);
curWeap = self GetCurrentWeapon();
usedRiot = self.hasRiotShieldEquipped; usedRiot = self.hasRiotShieldEquipped;
distsq = DistanceSquared(self.origin, ent.origin); distsq = DistanceSquared(self.origin, ent.origin);
inLastStand = isDefined(self.lastStand); inLastStand = isDefined(self.lastStand);
@ -2260,6 +2276,9 @@ reload()
{ {
cur = self GetCurrentWeapon(); cur = self GetCurrentWeapon();
if (level.gameEnded || !gameFlag( "prematch_done" ) || self.bot.isfrozen)
return;
self SetWeaponAmmoStock(cur, self GetWeaponAmmoClip(cur) + self GetWeaponAmmoStock(cur)); self SetWeaponAmmoStock(cur, self GetWeaponAmmoClip(cur) + self GetWeaponAmmoStock(cur));
self setWeaponAmmoClip(cur, 0); self setWeaponAmmoClip(cur, 0);
// the script should reload for us. // the script should reload for us.
@ -2269,6 +2288,21 @@ botThrowGrenade(grenName)
{ {
self endon("death"); self endon("death");
self endon("disconnect"); self endon("disconnect");
level endon ( "game_ended" );
if (isDefined(self.lastStand) && !self _hasPerk("specialty_laststandoffhand") && (!isDefined(self.inFinalStand) || !self.inFinalStand))
return "laststand";
if (level.gameEnded || !gameFlag( "prematch_done" ) || self.bot.isfrozen)
return "can't move";
curWeap = self GetCurrentWeapon();
if (!isWeaponDroppable(curWeap))
return "cur weap is not droppable";
if (self.bot.knifingafter)
return "knifing";
if (self.bot.tryingtofrag || self.bot.isfraggingafter) if (self.bot.tryingtofrag || self.bot.isfraggingafter)
return "already nading"; return "already nading";
@ -2276,8 +2310,6 @@ botThrowGrenade(grenName)
if (!self getAmmoCount(grenName)) if (!self getAmmoCount(grenName))
return "no ammo"; return "no ammo";
curWeap = self GetCurrentWeapon();
self setSpawnWeapon(grenName); self setSpawnWeapon(grenName);
self.bot.tryingtofrag = true; self.bot.tryingtofrag = true;
@ -2348,10 +2380,11 @@ jump()
{ {
self endon("death"); self endon("death");
self endon("disconnect"); self endon("disconnect");
level endon ( "game_ended" );
if (isDefined(self.lastStand) || self getStance() != "stand" || if (isDefined(self.lastStand) || self getStance() != "stand" ||
level.gameEnded || !gameFlag( "prematch_done" ) || self IsUsingRemote() || level.gameEnded || !gameFlag( "prematch_done" ) || self IsUsingRemote() ||
self.bot.isfrozen || self.bot.climbing || self.bot.jumping || self.bot.jumpingafter) self.bot.isfrozen || self.bot.climbing || self.bot.jumpingafter)
return; return;
self.bot.jumping = true; self.bot.jumping = true;
@ -2426,6 +2459,9 @@ bot_lookat(pos, time)
self endon("spawned_player"); self endon("spawned_player");
level endon ( "game_ended" ); level endon ( "game_ended" );
if (level.gameEnded || !gameFlag( "prematch_done" ) || self.bot.isfrozen)
return;
if (!isDefined(pos)) if (!isDefined(pos))
return; return;

View File

@ -500,6 +500,33 @@ setKillstreaks()
*/ */
onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration) onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration)
{ {
self.killerLocation = undefined;
if(!IsDefined( self ) || !isDefined(self.team))
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(level.teamBased && eAttacker.team == self.team)
return;
if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" )
return;
if(!isAlive(eAttacker))
return;
self.killerLocation = eAttacker.origin;
} }
/* /*
@ -507,6 +534,101 @@ onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc,
*/ */
onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset) onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset)
{ {
if(!IsDefined( self ) || !isDefined(self.team))
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(level.teamBased && eAttacker.team == self.team)
return;
if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" )
return;
if(!isAlive(eAttacker))
return;
if (!isSubStr(sWeapon, "_silencer_"))
self bot_cry_for_help( eAttacker );
self SetAttacker( eAttacker );
}
/*
When the bot gets attacked, have the bot ask for help from teammates.
*/
bot_cry_for_help( attacker )
{
if ( !level.teamBased )
{
return;
}
theTime = GetTime();
if ( IsDefined( self.help_time ) && theTime - self.help_time < 1000 )
{
return;
}
self.help_time = theTime;
for ( i = level.players.size - 1; i >= 0; i-- )
{
player = level.players[i];
if ( !player is_bot() )
{
continue;
}
if(!isDefined(player.team))
continue;
if ( !IsAlive( player ) )
{
continue;
}
if ( player == self )
{
continue;
}
if ( player.team != self.team )
{
continue;
}
dist = player.pers["bots"]["skill"]["help_dist"];
dist *= dist;
if ( DistanceSquared( self.origin, player.origin ) > dist )
{
continue;
}
if ( RandomInt( 100 ) < 50 )
{
self SetAttacker( attacker );
if ( RandomInt( 100 ) > 70 )
{
break;
}
}
}
} }
onKillcam() onKillcam()
@ -844,6 +966,9 @@ onSpawned()
if(randomInt(100) <= self.pers["bots"]["behavior"]["class"]) if(randomInt(100) <= self.pers["bots"]["behavior"]["class"])
self.bot_change_class = undefined; self.bot_change_class = undefined;
self.bot_lock_goal = false;
self.help_time = undefined;
} }
} }
@ -883,5 +1008,74 @@ onBotSpawned()
{ {
self waittill("bot_spawned"); self waittill("bot_spawned");
gameFlagWait("prematch_done"); gameFlagWait("prematch_done");
self thread bot_killstreak_think();
}
}
bot_killstreak_think()
{
self endon("disconnect");
self endon("death");
level endon("game_ended");
for (;;)
{
wait randomIntRange(1, 3);
if ( !isDefined( self.pers["killstreaks"][0] ) )
continue;
if(self BotIsFrozen())
continue;
if(self HasThreat())
continue;
if(self IsBotReloading() || self IsBotFragging() || self IsKnifing())
continue;
if(self isDefusing() || self isPlanting())
continue;
curWeap = self GetCurrentWeapon();
if (!isWeaponDroppable(curWeap))
continue;
streakName = self.pers["killstreaks"][0].streakName;
ksWeap = maps\mp\killstreaks\_killstreaks::getKillstreakWeapon( streakName );
if (maps\mp\killstreaks\_killstreaks::isRideKillstreak(streakName) || maps\mp\killstreaks\_killstreaks::isCarryKillstreak(streakName))
{
// sentry
// predator_missile
// ac130
// helicopter_minigun
}
else
{
// airdrop_mega
// airdrop_sentry_minigun
// airdrop
// case "harrier_airstrike":
// case "stealth_airstrike":
// case "precision_airstrike":
switch (streakName)
{
case "helicopter":
case "helicopter_flares":
case "uav":
case "nuke":
case "counter_uav":
case "emp":
self BotFreezeControls(true);
self setSpawnWeapon(ksWeap);
wait 1;
self setSpawnWeapon(curWeap);
self BotFreezeControls(false);
break;
}
}
} }
} }

View File

@ -186,6 +186,26 @@ HasThreat()
return (isDefined(self GetThreat())); return (isDefined(self GetThreat()));
} }
IsKnifing()
{
return self.bot.knifing;
}
IsDefusing()
{
return (isDefined(self.isDefusing) && self.isDefusing);
}
isPlanting()
{
return (isDefined(self.isPlanting) && self.isPlanting);
}
isWeaponDroppable(weap)
{
return (maps\mp\gametypes\_weapons::mayDropWeapon(weap));
}
/* /*
Returns if we are stunned. Returns if we are stunned.
*/ */

View File

@ -1 +1 @@
start iw4x.exe -dedicated +set net_port "28960" +exec server.cfg +map_rotate start iw4x.exe -dedicated +set sv_lanonly "1" +set net_port "28960" +exec server.cfg +map_rotate