mirror of
https://github.com/JezuzLizard/t4sp_bot_warfare.git
synced 2025-04-21 05:55:43 +00:00
bot internal has everything now
This commit is contained in:
parent
52ebe9961f
commit
caa27fcfc2
@ -184,6 +184,21 @@ onDisconnectAll()
|
|||||||
level.players = array_remove( level.players, self );
|
level.players = array_remove( level.players, self );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
When any client spawns
|
||||||
|
*/
|
||||||
|
onSpawnedAll()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
self waittill( "spawned_player" );
|
||||||
|
|
||||||
|
self.lastSpawnTime = getTime();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
When a bot disconnects.
|
When a bot disconnects.
|
||||||
*/
|
*/
|
||||||
@ -207,6 +222,8 @@ connected()
|
|||||||
level.players[level.players.size] = self;
|
level.players[level.players.size] = self;
|
||||||
self thread onDisconnectAll();
|
self thread onDisconnectAll();
|
||||||
|
|
||||||
|
self thread onSpawnedAll();
|
||||||
|
|
||||||
if ( !self is_bot() )
|
if ( !self is_bot() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -42,7 +42,6 @@ added()
|
|||||||
self.pers["bots"]["behavior"]["follow"] = 50; // percentage of how often the bot will follow
|
self.pers["bots"]["behavior"]["follow"] = 50; // percentage of how often the bot will follow
|
||||||
self.pers["bots"]["behavior"]["crouch"] = 10; // percentage of how often the bot will crouch
|
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"]["switch"] = 1; // percentage of how often the bot will switch weapons
|
||||||
self.pers["bots"]["behavior"]["class"] = 1; // percentage of how often the bot will change classes
|
|
||||||
self.pers["bots"]["behavior"]["jump"] = 100; // percentage of how often the bot will jumpshot and dropshot
|
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"]["quickscope"] = false; // is a quickscoper
|
||||||
@ -73,7 +72,6 @@ resetBotVars()
|
|||||||
self.bot.towards_goal = undefined;
|
self.bot.towards_goal = undefined;
|
||||||
self.bot.astar = [];
|
self.bot.astar = [];
|
||||||
self.bot.stop_move = false;
|
self.bot.stop_move = false;
|
||||||
self.bot.greedy_path = false;
|
|
||||||
self.bot.climbing = false;
|
self.bot.climbing = false;
|
||||||
self.bot.wantsprint = false;
|
self.bot.wantsprint = false;
|
||||||
self.bot.last_next_wp = -1;
|
self.bot.last_next_wp = -1;
|
||||||
@ -145,6 +143,20 @@ onPlayerSpawned()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Is the weap a sniper
|
||||||
|
*/
|
||||||
|
IsWeapSniper( weap )
|
||||||
|
{
|
||||||
|
if ( weap == "none" )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ( false /*maps\mp\gametypes\_missions::getWeaponClass( weap ) != "weapon_sniper"*/ )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
When the bot changes weapon.
|
When the bot changes weapon.
|
||||||
*/
|
*/
|
||||||
@ -169,7 +181,7 @@ onWeaponChange()
|
|||||||
|
|
||||||
self.bot.is_cur_full_auto = WeaponIsFullAuto( newWeapon );
|
self.bot.is_cur_full_auto = WeaponIsFullAuto( newWeapon );
|
||||||
self.bot.cur_weap_dist_multi = SetWeaponDistMulti( newWeapon );
|
self.bot.cur_weap_dist_multi = SetWeaponDistMulti( newWeapon );
|
||||||
self.bot.is_cur_sniper = /* IsWeapSniper( newWeapon ) */ false;
|
self.bot.is_cur_sniper = IsWeapSniper( newWeapon );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,22 +285,269 @@ spawned()
|
|||||||
self thread target_cleanup();
|
self thread target_cleanup();
|
||||||
self thread updateBones();
|
self thread updateBones();
|
||||||
self thread aim();
|
self thread aim();
|
||||||
|
self thread watchHoldBreath();
|
||||||
|
self thread stance();
|
||||||
|
self thread onNewEnemy();
|
||||||
|
self thread check_reload();
|
||||||
|
|
||||||
self notify( "bot_spawned" );
|
self notify( "bot_spawned" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
When the bot gets a new enemy.
|
||||||
|
*/
|
||||||
|
onNewEnemy()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self endon( "zombified" );
|
||||||
|
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
self waittill( "new_enemy" );
|
||||||
|
|
||||||
|
if ( !isDefined( self.bot.target ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ( !isDefined( self.bot.target.entity ) || !self.bot.target.isactor )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ( self.bot.target.didlook )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
self thread watchToLook();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bots will jump or dropshot their enemy player.
|
||||||
|
*/
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( getConeDot( self.bot.target.last_seen_pos, self.origin, self getPlayerAngles() ) < 0.8 || self.bot.target.dist <= level.bots_noADSDistance )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
self.bot.jump_time = getTime();
|
||||||
|
self prone();
|
||||||
|
self notify( "kill_goal" );
|
||||||
|
wait 2.5;
|
||||||
|
self crouch();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bots will update its needed stance according to the nodes on the level. Will also allow the bot to sprint when it can.
|
||||||
|
*/
|
||||||
|
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";
|
||||||
|
|
||||||
|
if ( toStance == "stand" )
|
||||||
|
self stand();
|
||||||
|
else if ( toStance == "crouch" )
|
||||||
|
self crouch();
|
||||||
|
else
|
||||||
|
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 getEyePos(), self getEyePos() + 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Stops the sprint fix when goal is completed
|
||||||
|
*/
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bots will update its needed stance according to the nodes on the level. Will also allow the bot to sprint when it can.
|
||||||
|
*/
|
||||||
|
stance()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self endon( "zombified" );
|
||||||
|
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
self waittill_either( "finished_static_waypoints", "new_static_waypoint" );
|
||||||
|
|
||||||
|
self stance_loop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bot will wait until firing.
|
||||||
|
*/
|
||||||
|
check_reload()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self endon( "zombified" );
|
||||||
|
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
self waittill_notify_or_timeout( "weapon_fired", 5 );
|
||||||
|
self thread reload_thread();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bot will reload after firing if needed.
|
||||||
|
*/
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
target_cleanup()
|
target_cleanup()
|
||||||
{
|
{
|
||||||
self endon( "disconnect" );
|
self endon( "disconnect" );
|
||||||
self endon( "zombified" );
|
self endon( "zombified" );
|
||||||
|
|
||||||
while ( true )
|
while ( true )
|
||||||
{
|
{
|
||||||
wait 10;
|
wait 10;
|
||||||
curTime = getTime();
|
curTime = getTime();
|
||||||
targetKeys = getArrayKeys( self.bot.targets );
|
targetKeys = getArrayKeys( self.bot.targets );
|
||||||
|
|
||||||
for ( i = 0; i < targetKeys.size; i++ )
|
for ( i = 0; i < targetKeys.size; i++ )
|
||||||
{
|
{
|
||||||
obj = self.bot.targets[ targetKeys[ i ] ];
|
obj = self.bot.targets[ targetKeys[ i ] ];
|
||||||
|
|
||||||
if ( ( curTime - obj.time ) > 30000 )
|
if ( ( curTime - obj.time ) > 30000 )
|
||||||
{
|
{
|
||||||
self.bot.targets[ targetKeys[ i ] ] = undefined;
|
self.bot.targets[ targetKeys[ i ] ] = undefined;
|
||||||
@ -297,6 +556,25 @@ target_cleanup()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
The hold breath thread.
|
||||||
|
*/
|
||||||
|
watchHoldBreath()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self endon( "zombified" );
|
||||||
|
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
wait 1;
|
||||||
|
|
||||||
|
if ( self.bot.isfrozen )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
self holdbreath( self playerADS() > 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Bot moves towards the point
|
Bot moves towards the point
|
||||||
*/
|
*/
|
||||||
@ -458,6 +736,17 @@ canFire( curweap )
|
|||||||
*/
|
*/
|
||||||
isInRange( dist, curweap )
|
isInRange( dist, curweap )
|
||||||
{
|
{
|
||||||
|
if ( curweap == "none" )
|
||||||
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -466,6 +755,25 @@ isInRange( dist, curweap )
|
|||||||
*/
|
*/
|
||||||
canAds( dist, curweap )
|
canAds( dist, curweap )
|
||||||
{
|
{
|
||||||
|
if ( curweap == "none" )
|
||||||
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1582,6 +1890,17 @@ frag( time )
|
|||||||
self.bot.isfraggingafter = false;
|
self.bot.isfraggingafter = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bot will hold breath if true or not
|
||||||
|
*/
|
||||||
|
holdbreath( what )
|
||||||
|
{
|
||||||
|
if ( what )
|
||||||
|
self botAction( "+holdbreath" );
|
||||||
|
else
|
||||||
|
self botAction( "-holdbreath" );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Bot will hold the 'smoke' button for a time.
|
Bot will hold the 'smoke' button for a time.
|
||||||
*/
|
*/
|
||||||
@ -1681,6 +2000,21 @@ pressFire( time )
|
|||||||
self botAction( "-fire" );
|
self botAction( "-fire" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bot will reload.
|
||||||
|
*/
|
||||||
|
reload()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self notify( "bot_reload" );
|
||||||
|
self endon( "bot_reload" );
|
||||||
|
|
||||||
|
self botAction( "+reload" );
|
||||||
|
wait 0.05;
|
||||||
|
self botAction( "-reload" );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Bot will knife.
|
Bot will knife.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user