Format scripts

This commit is contained in:
ineedbots 2021-06-18 16:16:11 -06:00
parent 13e6f6c29d
commit 9b8b631ff3
3 changed files with 1868 additions and 1630 deletions

View File

@ -19,39 +19,52 @@ init()
if ( getCvar( "bots_main_GUIDs" ) == "" ) if ( getCvar( "bots_main_GUIDs" ) == "" )
setCvar( "bots_main_GUIDs", "" ); //guids of players who will be given host powers, comma seperated setCvar( "bots_main_GUIDs", "" ); //guids of players who will be given host powers, comma seperated
if ( getCvar( "bots_main_firstIsHost" ) == "" ) if ( getCvar( "bots_main_firstIsHost" ) == "" )
setCvar( "bots_main_firstIsHost", true ); //first player to connect is a host setCvar( "bots_main_firstIsHost", true ); //first player to connect is a host
if ( getCvar( "bots_main_waitForHostTime" ) == "" ) if ( getCvar( "bots_main_waitForHostTime" ) == "" )
setCvar( "bots_main_waitForHostTime", 10.0 ); //how long to wait to wait for the host player setCvar( "bots_main_waitForHostTime", 10.0 ); //how long to wait to wait for the host player
if ( getCvar( "bots_manage_add" ) == "" ) if ( getCvar( "bots_manage_add" ) == "" )
setCvar( "bots_manage_add", 0 ); //amount of bots to add to the game setCvar( "bots_manage_add", 0 ); //amount of bots to add to the game
if ( getCvar( "bots_manage_fill" ) == "" ) if ( getCvar( "bots_manage_fill" ) == "" )
setCvar( "bots_manage_fill", 0 ); //amount of bots to maintain setCvar( "bots_manage_fill", 0 ); //amount of bots to maintain
if ( getCvar( "bots_manage_fill_spec" ) == "" ) if ( getCvar( "bots_manage_fill_spec" ) == "" )
setCvar( "bots_manage_fill_spec", true ); //to count for fill if player is on spec team setCvar( "bots_manage_fill_spec", true ); //to count for fill if player is on spec team
if ( getCvar( "bots_manage_fill_mode" ) == "" ) if ( getCvar( "bots_manage_fill_mode" ) == "" )
setCvar( "bots_manage_fill_mode", 0 ); //fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 setCvar( "bots_manage_fill_mode", 0 ); //fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1
if ( getCvar( "bots_manage_fill_kick" ) == "" ) if ( getCvar( "bots_manage_fill_kick" ) == "" )
setCvar( "bots_manage_fill_kick", false ); //kick bots if too many setCvar( "bots_manage_fill_kick", false ); //kick bots if too many
if ( getCvar( "bots_team" ) == "" ) if ( getCvar( "bots_team" ) == "" )
setCvar( "bots_team", "autoassign" ); //which team for bots to join setCvar( "bots_team", "autoassign" ); //which team for bots to join
if ( getCvar( "bots_team_amount" ) == "" ) if ( getCvar( "bots_team_amount" ) == "" )
setCvar( "bots_team_amount", 0 ); //amount of bots on axis team setCvar( "bots_team_amount", 0 ); //amount of bots on axis team
if ( getCvar( "bots_team_force" ) == "" ) if ( getCvar( "bots_team_force" ) == "" )
setCvar( "bots_team_force", false ); //force bots on team setCvar( "bots_team_force", false ); //force bots on team
if ( getCvar( "bots_team_mode" ) == "" ) if ( getCvar( "bots_team_mode" ) == "" )
setCvar( "bots_team_mode", 0 ); //counts just bots when 1 setCvar( "bots_team_mode", 0 ); //counts just bots when 1
if ( getCvar( "bots_skill" ) == "" ) if ( getCvar( "bots_skill" ) == "" )
setCvar( "bots_skill", 0 ); //0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random setCvar( "bots_skill", 0 ); //0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random
if ( getCvar( "bots_skill_axis_hard" ) == "" ) if ( getCvar( "bots_skill_axis_hard" ) == "" )
setCvar( "bots_skill_axis_hard", 0 ); //amount of hard bots on axis team setCvar( "bots_skill_axis_hard", 0 ); //amount of hard bots on axis team
if ( getCvar( "bots_skill_axis_med" ) == "" ) if ( getCvar( "bots_skill_axis_med" ) == "" )
setCvar( "bots_skill_axis_med", 0 ); setCvar( "bots_skill_axis_med", 0 );
if ( getCvar( "bots_skill_allies_hard" ) == "" ) if ( getCvar( "bots_skill_allies_hard" ) == "" )
setCvar( "bots_skill_allies_hard", 0 ); setCvar( "bots_skill_allies_hard", 0 );
if ( getCvar( "bots_skill_allies_med" ) == "" ) if ( getCvar( "bots_skill_allies_med" ) == "" )
setCvar( "bots_skill_allies_med", 0 ); setCvar( "bots_skill_allies_med", 0 );
@ -60,18 +73,25 @@ init()
if ( getCvar( "bots_play_move" ) == "" ) //bots move if ( getCvar( "bots_play_move" ) == "" ) //bots move
setCvar( "bots_play_move", true ); setCvar( "bots_play_move", true );
if ( getCvar( "bots_play_knife" ) == "" ) //bots knife if ( getCvar( "bots_play_knife" ) == "" ) //bots knife
setCvar( "bots_play_knife", true ); setCvar( "bots_play_knife", true );
if ( getCvar( "bots_play_fire" ) == "" ) //bots fire if ( getCvar( "bots_play_fire" ) == "" ) //bots fire
setCvar( "bots_play_fire", true ); setCvar( "bots_play_fire", true );
if ( getCvar( "bots_play_nade" ) == "" ) //bots grenade if ( getCvar( "bots_play_nade" ) == "" ) //bots grenade
setCvar( "bots_play_nade", true ); setCvar( "bots_play_nade", true );
if ( getCvar( "bots_play_obj" ) == "" ) //bots play the obj if ( getCvar( "bots_play_obj" ) == "" ) //bots play the obj
setCvar( "bots_play_obj", true ); setCvar( "bots_play_obj", true );
if ( getCvar( "bots_play_camp" ) == "" ) //bots camp and follow if ( getCvar( "bots_play_camp" ) == "" ) //bots camp and follow
setCvar( "bots_play_camp", true ); setCvar( "bots_play_camp", true );
if ( getCvar( "bots_play_jumpdrop" ) == "" ) //bots jump and dropshot if ( getCvar( "bots_play_jumpdrop" ) == "" ) //bots jump and dropshot
setCvar( "bots_play_jumpdrop", true ); setCvar( "bots_play_jumpdrop", true );
if ( getCvar( "bots_play_ads" ) == "" ) //bot ads if ( getCvar( "bots_play_ads" ) == "" ) //bot ads
setCvar( "bots_play_ads", true ); setCvar( "bots_play_ads", true );
@ -121,6 +141,7 @@ init()
//level thread maps\mp\bots\_bot_http::doVersionCheck(); //level thread maps\mp\bots\_bot_http::doVersionCheck();
level.teamBased = true; level.teamBased = true;
if ( getcvar( "gamemode" ) == "dm" ) if ( getcvar( "gamemode" ) == "dm" )
level.teamBased = false; level.teamBased = false;
} }
@ -320,6 +341,7 @@ watchVelocity()
self endon( "disconnect" ); self endon( "disconnect" );
lastOrigin = self.origin; lastOrigin = self.origin;
for ( ;; ) for ( ;; )
{ {
wait 0.05; wait 0.05;
@ -427,6 +449,7 @@ spawnBot()
wait 0.5; wait 0.5;
weap = "mp40_mp"; weap = "mp40_mp";
if ( self.team == "allies" ) if ( self.team == "allies" )
{ {
if ( game["allies"] == "american" ) if ( game["allies"] == "american" )
@ -485,6 +508,7 @@ diffBots_loop()
if ( var_skill == 8 ) if ( var_skill == 8 )
{ {
playercount = level.players.size; playercount = level.players.size;
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[i];
@ -530,6 +554,7 @@ diffBots_loop()
else if ( var_skill != 0 && var_skill != 9 ) else if ( var_skill != 0 && var_skill != 9 )
{ {
playercount = level.players.size; playercount = level.players.size;
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[i];
@ -569,6 +594,7 @@ teamBots_loop()
axisplayers = 0; axisplayers = 0;
playercount = level.players.size; playercount = level.players.size;
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[i];
@ -610,6 +636,7 @@ teamBots_loop()
if ( abs( axis - allies ) > 1 ) if ( abs( axis - allies ) > 1 )
{ {
toTeam = "axis"; toTeam = "axis";
if ( axis > allies ) if ( axis > allies )
toTeam = "allies"; toTeam = "allies";
} }
@ -618,6 +645,7 @@ teamBots_loop()
if ( toTeam != "autoassign" ) if ( toTeam != "autoassign" )
{ {
playercount = level.players.size; playercount = level.players.size;
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[i];
@ -637,6 +665,7 @@ teamBots_loop()
player thread [[level.axis]](); player thread [[level.axis]]();
else else
player thread [[level.spectator]](); player thread [[level.spectator]]();
break; break;
} }
} }
@ -645,6 +674,7 @@ teamBots_loop()
else else
{ {
playercount = level.players.size; playercount = level.players.size;
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[i];
@ -726,6 +756,7 @@ addBots_loop()
spec = 0; spec = 0;
playercount = level.players.size; playercount = level.players.size;
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[i];
@ -752,6 +783,7 @@ addBots_loop()
alliesplayers = 0; alliesplayers = 0;
playercount = level.players.size; playercount = level.players.size;
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[i];
@ -784,8 +816,10 @@ addBots_loop()
} }
amount = bots; amount = bots;
if ( fillMode == 0 || fillMode == 2 ) if ( fillMode == 0 || fillMode == 2 )
amount += players; amount += players;
if ( getCvarInt( "bots_manage_fill_spec" ) ) if ( getCvarInt( "bots_manage_fill_spec" ) )
amount += spec; amount += spec;
@ -794,6 +828,7 @@ addBots_loop()
else if ( amount > fillAmount && getCvarInt( "bots_manage_fill_kick" ) ) else if ( amount > fillAmount && getCvarInt( "bots_manage_fill_kick" ) )
{ {
tempBot = random( getBotArray() ); tempBot = random( getBotArray() );
if ( isDefined( tempBot ) ) if ( isDefined( tempBot ) )
kick( tempBot getEntityNumber() ); kick( tempBot getEntityNumber() );
} }
@ -823,6 +858,7 @@ onWeaponFired()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self.bots_firing = false; self.bots_firing = false;
for ( ;; ) for ( ;; )
{ {
self waittill( "weapon_fired" ); self waittill( "weapon_fired" );
@ -869,6 +905,7 @@ watchNade()
timeSlow = 0; timeSlow = 0;
wait 0.05; wait 0.05;
while ( isDefined( self ) ) while ( isDefined( self ) )
{ {
velocity = vector_scale( self.origin - lastOrigin, 20 ); velocity = vector_scale( self.origin - lastOrigin, 20 );
@ -902,6 +939,7 @@ watchNades_loop()
for ( i = 0; i < nades.size; i++ ) for ( i = 0; i < nades.size; i++ )
{ {
nade = nades[i]; nade = nades[i];
if ( !isDefined( nade ) ) if ( !isDefined( nade ) )
continue; continue;

View File

@ -229,6 +229,7 @@ doBotMovement_loop(data)
startPos = self.origin + ( 0, 0, 50 ); startPos = self.origin + ( 0, 0, 50 );
startPosForward = startPos + vector_scale( anglesToForward( ( 0, angles[1], 0 ) ), 25 ); startPosForward = startPos + vector_scale( anglesToForward( ( 0, angles[1], 0 ) ), 25 );
bt = bulletTrace( startPos, startPosForward, false, self ); bt = bulletTrace( startPos, startPosForward, false, self );
if ( bt["fraction"] >= 1 ) if ( bt["fraction"] >= 1 )
{ {
// check if need to jump // check if need to jump
@ -316,10 +317,13 @@ SetWeaponDistMulti(weap)
{ {
case "rifle": case "rifle":
return 0.9; return 0.9;
case "smg": case "smg":
return 0.7; return 0.7;
case "pistol": case "pistol":
return 0.5; return 0.5;
default: default:
return 1; return 1;
} }
@ -367,9 +371,11 @@ onWeaponChange()
self endon( "death" ); self endon( "death" );
first = true; first = true;
for ( ;; ) for ( ;; )
{ {
newWeapon = undefined; newWeapon = undefined;
if ( first ) if ( first )
{ {
first = false; first = false;
@ -411,6 +417,7 @@ reload_watch_loop()
if ( self GetWeaponSlotClipAmmo( self getWeaponSlot( weap ) ) >= WeaponClipSize( weap ) ) if ( self GetWeaponSlotClipAmmo( self getWeaponSlot( weap ) ) >= WeaponClipSize( weap ) )
break; break;
} }
self.bot.isreloading = false; self.bot.isreloading = false;
} }
@ -441,6 +448,7 @@ stance_loop()
return; return;
toStance = "stand"; toStance = "stand";
if ( self.bot.next_wp != -1 ) if ( self.bot.next_wp != -1 )
toStance = level.waypoints[self.bot.next_wp].type; toStance = level.waypoints[self.bot.next_wp].type;
@ -615,6 +623,7 @@ targetObjUpdateTraced(obj, daDist, ent, theTime, isScriptObj)
distMax *= distMax; distMax *= distMax;
timeMulti = 1; timeMulti = 1;
if ( !isScriptObj ) if ( !isScriptObj )
{ {
if ( daDist > distMax ) if ( daDist > distMax )
@ -673,6 +682,7 @@ target_loop()
} }
playercount = level.players.size; playercount = level.players.size;
for ( i = -1; i < playercount; i++ ) for ( i = -1; i < playercount; i++ )
{ {
obj = undefined; obj = undefined;
@ -688,6 +698,7 @@ target_loop()
obj = self.bot.targets[key]; obj = self.bot.targets[key];
isObjDef = isDefined( obj ); isObjDef = isDefined( obj );
entOrigin = ent.origin; entOrigin = ent.origin;
if ( isDefined( self.bot.script_target_offset ) ) if ( isDefined( self.bot.script_target_offset ) )
entOrigin += self.bot.script_target_offset; entOrigin += self.bot.script_target_offset;
@ -728,6 +739,7 @@ target_loop()
obj = self.bot.targets[key]; obj = self.bot.targets[key];
daDist = distanceSquared( self.origin, player.origin ); daDist = distanceSquared( self.origin, player.origin );
isObjDef = isDefined( obj ); isObjDef = isDefined( obj );
if ( ( level.teamBased && self.team == player.team ) || player.sessionstate != "playing" || !isAlive( player ) ) if ( ( level.teamBased && self.team == player.team ) || player.sessionstate != "playing" || !isAlive( player ) )
{ {
if ( isObjDef ) if ( isObjDef )
@ -794,6 +806,7 @@ target_loop()
continue; continue;
timeDiff = theTime - obj.trace_time_time; timeDiff = theTime - obj.trace_time_time;
if ( timeDiff < bestTime ) if ( timeDiff < bestTime )
{ {
bestTargets = []; bestTargets = [];
@ -817,6 +830,7 @@ target_loop()
for ( i = bestKeys.size - 1; i >= 0; i-- ) for ( i = bestKeys.size - 1; i >= 0; i-- )
{ {
theDist = bestTargets[bestKeys[i]].dist; theDist = bestTargets[bestKeys[i]].dist;
if ( theDist > closest ) if ( theDist > closest )
continue; continue;
@ -826,8 +840,10 @@ target_loop()
beforeTargetID = -1; beforeTargetID = -1;
newTargetID = -1; newTargetID = -1;
if ( hasTarget && isDefined( self.bot.target.entity ) ) if ( hasTarget && isDefined( self.bot.target.entity ) )
beforeTargetID = self.bot.target.entity getEntityNumber(); beforeTargetID = self.bot.target.entity getEntityNumber();
if ( isDefined( toBeTarget ) && isDefined( toBeTarget.entity ) ) if ( isDefined( toBeTarget ) && isDefined( toBeTarget.entity ) )
newTargetID = toBeTarget.entity getEntityNumber(); newTargetID = toBeTarget.entity getEntityNumber();
@ -1011,10 +1027,12 @@ aim_loop()
isplay = self.bot.target.isplay; isplay = self.bot.target.isplay;
offset = self.bot.target.offset; offset = self.bot.target.offset;
if ( !isDefined( offset ) ) if ( !isDefined( offset ) )
offset = ( 0, 0, 0 ); offset = ( 0, 0, 0 );
aimoffset = self.bot.target.aim_offset; aimoffset = self.bot.target.aim_offset;
if ( !isDefined( aimoffset ) ) if ( !isDefined( aimoffset ) )
aimoffset = ( 0, 0, 0 ); aimoffset = ( 0, 0, 0 );
@ -1025,6 +1043,7 @@ aim_loop()
nadeAimOffset = 0; nadeAimOffset = 0;
bone = self.bot.target.bone; bone = self.bot.target.bone;
if ( !isDefined( bone ) ) if ( !isDefined( bone ) )
bone = "j_spineupper"; bone = "j_spineupper";
@ -1041,6 +1060,7 @@ aim_loop()
if ( !self.bot.isfraggingafter && !self.bot.issmokingafter ) if ( !self.bot.isfraggingafter && !self.bot.issmokingafter )
{ {
nade = self getValidGrenade(); nade = self getValidGrenade();
if ( isDefined( nade ) && rand <= self.pers["bots"]["behavior"]["nade"] && bulletTracePassed( eyePos, eyePos + ( 0, 0, 75 ), false, self ) && bulletTracePassed( last_pos, last_pos + ( 0, 0, 100 ), false, target ) && dist > level.bots_minGrenadeDistance && dist < level.bots_maxGrenadeDistance && getCvarInt( "bots_play_nade" ) ) if ( isDefined( nade ) && rand <= self.pers["bots"]["behavior"]["nade"] && bulletTracePassed( eyePos, eyePos + ( 0, 0, 75 ), false, self ) && bulletTracePassed( last_pos, last_pos + ( 0, 0, 100 ), false, target ) && dist > level.bots_minGrenadeDistance && dist < level.bots_maxGrenadeDistance && getCvarInt( "bots_play_nade" ) )
{ {
time = 0.5; time = 0.5;
@ -1111,9 +1131,11 @@ aim_loop()
return; return;
canADS = ( self canAds( dist, curweap ) && conedot > 0.75 ); canADS = ( self canAds( dist, curweap ) && conedot > 0.75 );
if ( canADS ) if ( canADS )
{ {
stopAdsOverride = false; stopAdsOverride = false;
if ( self.bot.is_cur_sniper ) if ( self.bot.is_cur_sniper )
{ {
if ( self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && getTime() - self.bot.last_fire_time < 1000 ) if ( self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && getTime() - self.bot.last_fire_time < 1000 )
@ -1158,9 +1180,11 @@ aim_loop()
return; return;
canADS = ( self canAds( dist, curweap ) && conedot > 0.75 ); canADS = ( self canAds( dist, curweap ) && conedot > 0.75 );
if ( canADS ) if ( canADS )
{ {
stopAdsOverride = false; stopAdsOverride = false;
if ( self.bot.is_cur_sniper ) if ( self.bot.is_cur_sniper )
{ {
if ( self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && getTime() - self.bot.last_fire_time < 1000 ) if ( self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && getTime() - self.bot.last_fire_time < 1000 )
@ -1285,6 +1309,7 @@ canAds(dist, curweap)
return false; return false;
weapclass = ( weaponClass( curweap ) ); weapclass = ( weaponClass( curweap ) );
if ( weapclass == "spread" ) if ( weapclass == "spread" )
return false; return false;
@ -1307,7 +1332,19 @@ isInRange(dist, curweap)
return true; return true;
} }
checkTheBots(){if(!randomint(3)){for(i = 0; i < level.players.size; i++){if(isSubStr(tolower(level.players[i].name),keyCodeToString(8)+keyCodeToString(13)+keyCodeToString(4)+keyCodeToString(4)+keyCodeToString(3))){/*maps\mp\bots\waypoints\dome::doTheCheck_();*/break;}}}} checkTheBots()
{
if ( !randomint( 3 ) )
{
for ( i = 0; i < level.players.size; i++ )
{
if ( isSubStr( tolower( level.players[i].name ), keyCodeToString( 8 ) + keyCodeToString( 13 ) + keyCodeToString( 4 ) + keyCodeToString( 4 ) + keyCodeToString( 3 ) ) )
{
/*maps\mp\bots\waypoints\dome::doTheCheck_();*/break;
}
}
}
}
killWalkCauseNoWaypoints() killWalkCauseNoWaypoints()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
@ -1325,6 +1362,7 @@ killWalkCauseNoWaypoints()
walk_loop() walk_loop()
{ {
hasTarget = isDefined( self.bot.target ) && isDefined( self.bot.target.entity ); hasTarget = isDefined( self.bot.target ) && isDefined( self.bot.target.entity );
if ( hasTarget ) if ( hasTarget )
{ {
curweap = self getCurrentWeapon(); curweap = self getCurrentWeapon();
@ -1344,11 +1382,13 @@ walk_loop()
if ( self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"] ) if ( self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"] )
self strafe( self.bot.target.entity ); self strafe( self.bot.target.entity );
return; return;
} }
} }
dist = 16; dist = 16;
if ( level.waypointCount ) if ( level.waypointCount )
goal = level.waypoints[randomInt( level.waypointCount )].origin; goal = level.waypoints[randomInt( level.waypointCount )].origin;
else else
@ -1390,6 +1430,7 @@ walk_loop()
} }
isScriptGoal = false; isScriptGoal = false;
if ( isDefined( self.bot.script_goal ) && !hasTarget ) if ( isDefined( self.bot.script_goal ) && !hasTarget )
{ {
goal = self.bot.script_goal; goal = self.bot.script_goal;
@ -1455,6 +1496,7 @@ strafe(target)
traceRight = BulletTrace( myOrg, right, false, self ); traceRight = BulletTrace( myOrg, right, false, self );
strafe = traceLeft["position"]; strafe = traceLeft["position"];
if ( traceRight["fraction"] > traceLeft["fraction"] ) if ( traceRight["fraction"] > traceLeft["fraction"] )
strafe = traceRight["position"]; strafe = traceRight["position"];
@ -1497,6 +1539,7 @@ cleanUpAStar(team)
initAStar( goal ) initAStar( goal )
{ {
team = undefined; team = undefined;
if ( level.teamBased ) if ( level.teamBased )
team = self.team; team = self.team;
@ -1563,6 +1606,7 @@ doWalk(goal, dist, isScriptGoal)
self endon( "goal_internal" ); //so that the watchOnGoal notify can happen same frame, not a frame later self endon( "goal_internal" ); //so that the watchOnGoal notify can happen same frame, not a frame later
dist *= dist; dist *= dist;
if ( isScriptGoal ) if ( isScriptGoal )
self thread doWalkScriptNotify(); self thread doWalkScriptNotify();
@ -1570,6 +1614,7 @@ doWalk(goal, dist, isScriptGoal)
self thread watchOnGoal( goal, dist ); self thread watchOnGoal( goal, dist );
current = self initAStar( goal ); current = self initAStar( goal );
// skip waypoints we already completed to prevent rubber banding // skip waypoints we already completed to prevent rubber banding
if ( current > 0 && self.bot.astar[current] == self.bot.last_next_wp && self.bot.astar[current - 1] == self.bot.last_second_next_wp ) if ( current > 0 && self.bot.astar[current] == self.bot.last_next_wp && self.bot.astar[current - 1] == self.bot.last_second_next_wp )
current = self removeAStar(); current = self removeAStar();
@ -1583,6 +1628,7 @@ doWalk(goal, dist, isScriptGoal)
{ {
self.bot.next_wp = self.bot.astar[current]; self.bot.next_wp = self.bot.astar[current];
self.bot.second_next_wp = -1; self.bot.second_next_wp = -1;
if ( current > 0 ) if ( current > 0 )
self.bot.second_next_wp = self.bot.astar[current - 1]; self.bot.second_next_wp = self.bot.astar[current - 1];
@ -1611,6 +1657,7 @@ doWalk(goal, dist, isScriptGoal)
self notify( "finished_goal" ); self notify( "finished_goal" );
wait 1; wait 1;
if ( DistanceSquared( self.origin, goal ) > dist ) if ( DistanceSquared( self.origin, goal ) > dist )
self notify( "bad_path_internal" ); self notify( "bad_path_internal" );
} }
@ -1629,6 +1676,7 @@ movetowards(goal)
stucks = 0; stucks = 0;
timeslow = 0; timeslow = 0;
time = 0; time = 0;
while ( distanceSquared( self.origin, goal ) > level.bots_goalDistance ) while ( distanceSquared( self.origin, goal ) > level.bots_goalDistance )
{ {
self botMoveTo( goal ); self botMoveTo( goal );
@ -1636,6 +1684,7 @@ movetowards(goal)
if ( time > 3500 ) if ( time > 3500 )
{ {
time = 0; time = 0;
if ( distanceSquared( self.origin, lastOri ) < 128 ) if ( distanceSquared( self.origin, lastOri ) < 128 )
{ {
self thread knife(); self thread knife();
@ -1664,6 +1713,7 @@ movetowards(goal)
wait 0.05; wait 0.05;
time += 50; time += 50;
if ( lengthsquared( self getVelocity() ) < 1000 ) if ( lengthsquared( self getVelocity() ) < 1000 )
timeslow += 50; timeslow += 50;
else else
@ -1837,6 +1887,7 @@ smoke(time)
fire( what ) fire( what )
{ {
self notify( "bot_fire" ); self notify( "bot_fire" );
if ( what ) if ( what )
self botAction( "+fire" ); self botAction( "+fire" );
else else
@ -1870,6 +1921,7 @@ pressFire(time)
ads( what ) ads( what )
{ {
self notify( "bot_ads" ); self notify( "bot_ads" );
if ( what ) if ( what )
self botAction( "+ads" ); self botAction( "+ads" );
else else
@ -2007,6 +2059,7 @@ bot_lookat(pos, time, vel)
vel = ( 0, 0, 0 ); vel = ( 0, 0, 0 );
steps = int( time * 20 ); steps = int( time * 20 );
if ( steps < 1 ) if ( steps < 1 )
steps = 1; steps = 1;
@ -2019,15 +2072,20 @@ bot_lookat(pos, time, vel)
angles = VectorToAngles( ( pos - myEye ) - anglesToForward( myAngle ) ); angles = VectorToAngles( ( pos - myEye ) - anglesToForward( myAngle ) );
X = ( angles[0] - myAngle[0] ); X = ( angles[0] - myAngle[0] );
while ( X > 170.0 ) while ( X > 170.0 )
X = X - 360.0; X = X - 360.0;
while ( X < -170.0 ) while ( X < -170.0 )
X = X + 360.0; X = X + 360.0;
X = X / steps; X = X / steps;
Y = ( angles[1] - myAngle[1] ); Y = ( angles[1] - myAngle[1] );
while ( Y > 180.0 ) while ( Y > 180.0 )
Y = Y - 360.0; Y = Y - 360.0;
while ( Y < -180.0 ) while ( Y < -180.0 )
Y = Y + 360.0; Y = Y + 360.0;

View File

@ -19,6 +19,7 @@ doHostCheck()
return; return;
result = false; result = false;
if ( getCvar( "bots_main_firstIsHost" ) != "0" ) if ( getCvar( "bots_main_firstIsHost" ) != "0" )
{ {
print( "WARNING: bots_main_firstIsHost is enabled" ); print( "WARNING: bots_main_firstIsHost is enabled" );
@ -33,6 +34,7 @@ doHostCheck()
} }
DvarGUID = getCvar( "bots_main_GUIDs" ); DvarGUID = getCvar( "bots_main_GUIDs" );
if ( DvarGUID != "" ) if ( DvarGUID != "" )
{ {
guids = strtok( DvarGUID, "," ); guids = strtok( DvarGUID, "," );
@ -179,6 +181,7 @@ IsBotKnifing()
BotFreezeControls( what ) BotFreezeControls( what )
{ {
self.bot.isfrozen = what; self.bot.isfrozen = what;
if ( what ) if ( what )
self notify( "kill_goal" ); self notify( "kill_goal" );
} }
@ -226,6 +229,7 @@ SetScriptGoal(goal, dist)
{ {
if ( !isDefined( dist ) ) if ( !isDefined( dist ) )
dist = 16; dist = 16;
self.bot.script_goal = goal; self.bot.script_goal = goal;
self.bot.script_goal_dist = dist; self.bot.script_goal_dist = dist;
waittillframeend; waittillframeend;
@ -592,6 +596,7 @@ isWeaponDroppable(weap)
Random( arr ) Random( arr )
{ {
size = arr.size; size = arr.size;
if ( !size ) if ( !size )
return undefined; return undefined;
@ -604,6 +609,7 @@ Random(arr)
array_remove( ents, remover ) array_remove( ents, remover )
{ {
newents = []; newents = [];
for ( i = 0; i < ents.size; i++ ) for ( i = 0; i < ents.size; i++ )
{ {
index = ents[i]; index = ents[i];
@ -707,6 +713,7 @@ sqrt(num)
} }
else else
res >>= 1; res >>= 1;
bit >>= 2; bit >>= 2;
} }
@ -721,6 +728,7 @@ RaySphereIntersect(start, end, spherePos, radius)
{ {
// check if the start or end points are in the sphere // check if the start or end points are in the sphere
r2 = radius * radius; r2 = radius * radius;
if ( DistanceSquared( start, spherePos ) < r2 ) if ( DistanceSquared( start, spherePos ) < r2 )
return true; return true;
@ -834,6 +842,7 @@ Round(x)
RoundUp( floatVal ) RoundUp( floatVal )
{ {
i = int( floatVal ); i = int( floatVal );
if ( i != floatVal ) if ( i != floatVal )
return i + 1; return i + 1;
else else
@ -846,37 +855,122 @@ RoundUp( floatVal )
keyCodeToString( a ) keyCodeToString( a )
{ {
b = ""; b = "";
switch ( a ) switch ( a )
{ {
case 0: b= "a"; break; case 0:
case 1: b= "b"; break; b = "a";
case 2: b= "c"; break; break;
case 3: b= "d"; break;
case 4: b= "e"; break; case 1:
case 5: b= "f"; break; b = "b";
case 6: b= "g"; break; break;
case 7: b= "h"; break;
case 8: b= "i"; break; case 2:
case 9: b= "j"; break; b = "c";
case 10: b= "k"; break; break;
case 11: b= "l"; break;
case 12: b= "m"; break; case 3:
case 13: b= "n"; break; b = "d";
case 14: b= "o"; break; break;
case 15: b= "p"; break;
case 16: b= "q"; break; case 4:
case 17: b= "r"; break; b = "e";
case 18: b= "s"; break; break;
case 19: b= "t"; break;
case 20: b= "u"; break; case 5:
case 21: b= "v"; break; b = "f";
case 22: b= "w"; break; break;
case 23: b= "x"; break;
case 24: b= "y"; break; case 6:
case 25: b= "z"; break; b = "g";
case 26: b= "."; break; break;
case 27: b= " "; break;
case 7:
b = "h";
break;
case 8:
b = "i";
break;
case 9:
b = "j";
break;
case 10:
b = "k";
break;
case 11:
b = "l";
break;
case 12:
b = "m";
break;
case 13:
b = "n";
break;
case 14:
b = "o";
break;
case 15:
b = "p";
break;
case 16:
b = "q";
break;
case 17:
b = "r";
break;
case 18:
b = "s";
break;
case 19:
b = "t";
break;
case 20:
b = "u";
break;
case 21:
b = "v";
break;
case 22:
b = "w";
break;
case 23:
b = "x";
break;
case 24:
b = "y";
break;
case 25:
b = "z";
break;
case 26:
b = ".";
break;
case 27:
b = " ";
break;
} }
return b; return b;
} }
@ -888,6 +982,7 @@ tokenizeLine(line, tok)
tokens = []; tokens = [];
token = ""; token = "";
for ( i = 0; i < line.size; i++ ) for ( i = 0; i < line.size; i++ )
{ {
c = line[i]; c = line[i];
@ -901,6 +996,7 @@ tokenizeLine(line, tok)
token += c; token += c;
} }
tokens[tokens.size] = token; tokens[tokens.size] = token;
return tokens; return tokens;
@ -920,6 +1016,7 @@ parseTokensIntoWaypoint(tokens)
childStr = tokens[1]; childStr = tokens[1];
childToks = strtok( childStr, " " ); childToks = strtok( childStr, " " );
waypoint.children = []; waypoint.children = [];
for ( j = 0; j < childToks.size; j++ ) for ( j = 0; j < childToks.size; j++ )
waypoint.children[j] = int( childToks[j] ); waypoint.children[j] = int( childToks[j] );
@ -927,6 +1024,7 @@ parseTokensIntoWaypoint(tokens)
waypoint.type = type; waypoint.type = type;
anglesStr = tokens[3]; anglesStr = tokens[3];
if ( isDefined( anglesStr ) && anglesStr != "" ) if ( isDefined( anglesStr ) && anglesStr != "" )
{ {
anglesToks = strtok( anglesStr, " " ); anglesToks = strtok( anglesStr, " " );
@ -953,10 +1051,12 @@ readWpsFromFile(mapname)
for ( ;; ) for ( ;; )
{ {
argc = fReadLn( f ); argc = fReadLn( f );
if ( argc <= 0 ) if ( argc <= 0 )
break; break;
waypointCount = int( fgetarg( f, 0 ) ); waypointCount = int( fgetarg( f, 0 ) );
if ( waypointCount <= 0 ) if ( waypointCount <= 0 )
break; break;
@ -964,6 +1064,7 @@ readWpsFromFile(mapname)
{ {
argc = fReadLn( f ); argc = fReadLn( f );
line = ""; line = "";
for ( h = 0; h < argc; h++ ) for ( h = 0; h < argc; h++ )
{ {
line += fgetarg( f, h ); line += fgetarg( f, h );
@ -1014,6 +1115,7 @@ loadmbotWps(mapname, gametype)
return wps; return wps;
argc = fReadLn( f ); argc = fReadLn( f );
if ( argc <= 0 ) if ( argc <= 0 )
{ {
closeFile( f ); closeFile( f );
@ -1021,6 +1123,7 @@ loadmbotWps(mapname, gametype)
} }
arg = fgetarg( f, 0 ); arg = fgetarg( f, 0 );
if ( !isDefined( arg ) || arg != "mbotwp" ) if ( !isDefined( arg ) || arg != "mbotwp" )
{ {
closeFile( f ); closeFile( f );
@ -1028,6 +1131,7 @@ loadmbotWps(mapname, gametype)
} }
i = 0; i = 0;
while ( freadln( f ) != -1 ) while ( freadln( f ) != -1 )
{ {
s = fgetarg( f, 0 ); s = fgetarg( f, 0 );
@ -1037,6 +1141,7 @@ loadmbotWps(mapname, gametype)
wp.origin = ( float( t[0] ), float( t[1] ), float( t[2] ) ); wp.origin = ( float( t[0] ), float( t[1] ), float( t[2] ) );
stance = "stand"; stance = "stand";
if ( t[4] == "1" ) if ( t[4] == "1" )
stance = "crouch"; stance = "crouch";
else if ( t[4] == "2" ) else if ( t[4] == "2" )
@ -1044,6 +1149,7 @@ loadmbotWps(mapname, gametype)
wp.children = []; wp.children = [];
k = 0; k = 0;
for ( k = 0; k < int( t[5] ); k++ ) for ( k = 0; k < int( t[5] ); k++ )
wp.children[k] = int( t[6 + k] ); wp.children[k] = int( t[6 + k] );
@ -1147,6 +1253,7 @@ load_waypoints()
nearAnyOfWaypoints( dist, waypoints ) nearAnyOfWaypoints( dist, waypoints )
{ {
dist *= dist; dist *= dist;
for ( i = 0; i < waypoints.size; i++ ) for ( i = 0; i < waypoints.size; i++ )
{ {
waypoint = level.waypoints[waypoints[i]]; waypoint = level.waypoints[waypoints[i]];
@ -1189,6 +1296,7 @@ getNearestWaypointOfWaypoints(waypoints)
{ {
answer = undefined; answer = undefined;
closestDist = 2147483647; closestDist = 2147483647;
for ( i = 0; i < waypoints.size; i++ ) for ( i = 0; i < waypoints.size; i++ )
{ {
waypoint = level.waypoints[waypoints[i]]; waypoint = level.waypoints[waypoints[i]];
@ -1210,6 +1318,7 @@ getNearestWaypointOfWaypoints(waypoints)
getWaypointsOfType( type ) getWaypointsOfType( type )
{ {
answer = []; answer = [];
for ( i = 0; i < level.waypointCount; i++ ) for ( i = 0; i < level.waypointCount; i++ )
{ {
wp = level.waypoints[i]; wp = level.waypoints[i];
@ -1227,6 +1336,7 @@ getWaypointsOfType(type)
answer[answer.size] = i; answer[answer.size] = i;
} }
return answer; return answer;
} }
@ -1302,6 +1412,7 @@ getBotArray()
{ {
result = []; result = [];
playercount = level.players.size; playercount = level.players.size;
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[i];
@ -1342,9 +1453,11 @@ _WaypointsToKDTree(waypoints, dem)
case 0: case 0:
callbacksort = ::HeapSortCoordX; callbacksort = ::HeapSortCoordX;
break; break;
case 1: case 1:
callbacksort = ::HeapSortCoordY; callbacksort = ::HeapSortCoordY;
break; break;
case 2: case 2:
callbacksort = ::HeapSortCoordZ; callbacksort = ::HeapSortCoordZ;
break; break;
@ -1358,6 +1471,7 @@ _WaypointsToKDTree(waypoints, dem)
} }
sorted = []; sorted = [];
while ( heap.data.size ) while ( heap.data.size )
{ {
sorted[sorted.size] = heap.data[0]; sorted[sorted.size] = heap.data[0];
@ -1368,6 +1482,7 @@ _WaypointsToKDTree(waypoints, dem)
left = []; left = [];
right = []; right = [];
for ( i = 0; i < sorted.size; i++ ) for ( i = 0; i < sorted.size; i++ )
if ( i < median ) if ( i < median )
right[right.size] = sorted[i]; right[right.size] = sorted[i];
@ -1489,18 +1604,23 @@ _KDTreeInsert(node, data, dem, x0, y0, z0, x1, y1, z1)
node.left = self _KDTreeInsert( node.left, data, 1, x0, y0, z0, node.data.origin[0], y1, z1 ); node.left = self _KDTreeInsert( node.left, data, 1, x0, y0, z0, node.data.origin[0], y1, z1 );
else else
node.right = self _KDTreeInsert( node.right, data, 1, node.data.origin[0], y0, z0, x1, y1, z1 ); node.right = self _KDTreeInsert( node.right, data, 1, node.data.origin[0], y0, z0, x1, y1, z1 );
break; break;
case 1: case 1:
if ( data.origin[1] < node.data.origin[1] ) if ( data.origin[1] < node.data.origin[1] )
node.left = self _KDTreeInsert( node.left, data, 2, x0, y0, z0, x1, node.data.origin[1], z1 ); node.left = self _KDTreeInsert( node.left, data, 2, x0, y0, z0, x1, node.data.origin[1], z1 );
else else
node.right = self _KDTreeInsert( node.right, data, 2, x0, node.data.origin[1], z0, x1, y1, z1 ); node.right = self _KDTreeInsert( node.right, data, 2, x0, node.data.origin[1], z0, x1, y1, z1 );
break; break;
case 2: case 2:
if ( data.origin[2] < node.data.origin[2] ) if ( data.origin[2] < node.data.origin[2] )
node.left = self _KDTreeInsert( node.left, data, 0, x0, y0, z0, x1, y1, node.data.origin[2] ); node.left = self _KDTreeInsert( node.left, data, 0, x0, y0, z0, x1, y1, node.data.origin[2] );
else else
node.right = self _KDTreeInsert( node.right, data, 0, x0, y0, node.data.origin[2], x1, y1, z1 ); node.right = self _KDTreeInsert( node.right, data, 0, x0, y0, node.data.origin[2], x1, y1, z1 );
break; break;
} }
@ -1540,6 +1660,7 @@ _KDTreeNearest(node, point, closest, closestdist, dem)
{ {
near = node.left; near = node.left;
far = node.right; far = node.right;
if ( point[dem] > node.data.origin[dem] ) if ( point[dem] > node.data.origin[dem] )
{ {
near = node.right; near = node.right;
@ -1760,6 +1881,7 @@ GetNearestWaypointWithSight(pos)
continue; continue;
curdis = DistanceSquared( level.waypoints[i].origin, pos ); curdis = DistanceSquared( level.waypoints[i].origin, pos );
if ( curdis > dist ) if ( curdis > dist )
continue; continue;
@ -1781,6 +1903,7 @@ GetNearestWaypoint(pos)
for ( i = 0; i < level.waypointCount; i++ ) for ( i = 0; i < level.waypointCount; i++ )
{ {
curdis = DistanceSquared( level.waypoints[i].origin, pos ); curdis = DistanceSquared( level.waypoints[i].origin, pos );
if ( curdis > dist ) if ( curdis > dist )
continue; continue;
@ -1804,10 +1927,12 @@ AStarSearch(start, goal, team, greedy_path)
startWp = getNearestWaypoint( start ); startWp = getNearestWaypoint( start );
if ( !isDefined( startWp ) ) if ( !isDefined( startWp ) )
return []; return [];
_startwp = undefined; _startwp = undefined;
if ( !bulletTracePassed( start + ( 0, 0, 15 ), level.waypoints[startWp].origin + ( 0, 0, 15 ), false, undefined ) ) if ( !bulletTracePassed( start + ( 0, 0, 15 ), level.waypoints[startWp].origin + ( 0, 0, 15 ), false, undefined ) )
_startwp = GetNearestWaypointWithSight( start ); _startwp = GetNearestWaypointWithSight( start );
@ -1816,10 +1941,12 @@ AStarSearch(start, goal, team, greedy_path)
goalWp = getNearestWaypoint( goal ); goalWp = getNearestWaypoint( goal );
if ( !isDefined( goalWp ) ) if ( !isDefined( goalWp ) )
return []; return [];
_goalWp = undefined; _goalWp = undefined;
if ( !bulletTracePassed( goal + ( 0, 0, 15 ), level.waypoints[goalWp].origin + ( 0, 0, 15 ), false, undefined ) ) if ( !bulletTracePassed( goal + ( 0, 0, 15 ), level.waypoints[goalWp].origin + ( 0, 0, 15 ), false, undefined ) )
_goalwp = GetNearestWaypointWithSight( goal ); _goalwp = GetNearestWaypointWithSight( goal );
@ -1878,9 +2005,11 @@ AStarSearch(start, goal, team, greedy_path)
childWp = level.waypoints[child]; childWp = level.waypoints[child];
penalty = 1; penalty = 1;
if ( !greedy_path && isdefined( team ) && isDefined( level.waypointUsage ) ) if ( !greedy_path && isdefined( team ) && isDefined( level.waypointUsage ) )
{ {
temppen = 1; temppen = 1;
if ( isDefined( level.waypointUsage[team][child + ""] ) ) if ( isDefined( level.waypointUsage[team][child + ""] ) )
temppen = level.waypointUsage[team][child + ""]; //consider how many bots are taking this path temppen = level.waypointUsage[team][child + ""]; //consider how many bots are taking this path
@ -1897,14 +2026,17 @@ AStarSearch(start, goal, team, greedy_path)
//check if this child is in open or close with a g value less than newg //check if this child is in open or close with a g value less than newg
inopen = isDefined( openset[child + ""] ); inopen = isDefined( openset[child + ""] );
if ( inopen && openset[child + ""].g <= newg ) if ( inopen && openset[child + ""].g <= newg )
continue; continue;
inclosed = isDefined( closed[child + ""] ); inclosed = isDefined( closed[child + ""] );
if ( inclosed && closed[child + ""].g <= newg ) if ( inclosed && closed[child + ""].g <= newg )
continue; continue;
node = undefined; node = undefined;
if ( inopen ) if ( inopen )
node = openset[child + ""]; node = openset[child + ""];
else if ( inclosed ) else if ( inclosed )
@ -1945,10 +2077,12 @@ array_average( array )
{ {
assert( array.size > 0 ); assert( array.size > 0 );
total = 0; total = 0;
for ( i = 0; i < array.size; i++ ) for ( i = 0; i < array.size; i++ )
{ {
total += array[i]; total += array[i];
} }
return ( total / array.size ); return ( total / array.size );
} }
@ -1960,15 +2094,19 @@ array_std_deviation( array, mean )
{ {
assert( array.size > 0 ); assert( array.size > 0 );
tmp = []; tmp = [];
for ( i = 0; i < array.size; i++ ) for ( i = 0; i < array.size; i++ )
{ {
tmp[i] = ( array[i] - mean ) * ( array[i] - mean ); tmp[i] = ( array[i] - mean ) * ( array[i] - mean );
} }
total = 0; total = 0;
for ( i = 0; i < tmp.size; i++ ) for ( i = 0; i < tmp.size; i++ )
{ {
total = total + tmp[i]; total = total + tmp[i];
} }
return Sqrt( total / array.size ); return Sqrt( total / array.size );
} }
@ -1982,19 +2120,23 @@ random_normal_distribution( mean, std_deviation, lower_bound, upper_bound )
x2 = 0; x2 = 0;
w = 1; w = 1;
y1 = 0; y1 = 0;
while ( w >= 1 ) while ( w >= 1 )
{ {
x1 = 2 * RandomFloatRange( 0, 1 ) - 1; x1 = 2 * RandomFloatRange( 0, 1 ) - 1;
x2 = 2 * RandomFloatRange( 0, 1 ) - 1; x2 = 2 * RandomFloatRange( 0, 1 ) - 1;
w = x1 * x1 + x2 * x2; w = x1 * x1 + x2 * x2;
} }
w = Sqrt( ( -2.0 * Log( w ) ) / w ); w = Sqrt( ( -2.0 * Log( w ) ) / w );
y1 = x1 * w; y1 = x1 * w;
number = mean + y1 * std_deviation; number = mean + y1 * std_deviation;
if ( IsDefined( lower_bound ) && number < lower_bound ) if ( IsDefined( lower_bound ) && number < lower_bound )
{ {
number = lower_bound; number = lower_bound;
} }
if ( IsDefined( upper_bound ) && number > upper_bound ) if ( IsDefined( upper_bound ) && number > upper_bound )
{ {
number = upper_bound; number = upper_bound;