mirror of
https://github.com/ineedbots/t4_bot_warfare.git
synced 2025-04-22 07:55:43 +00:00
Format scripts
This commit is contained in:
parent
ed8fd1db01
commit
a4819bacf4
@ -22,69 +22,94 @@ init()
|
||||
|
||||
if ( getDvar( "bots_main_GUIDs" ) == "" )
|
||||
setDvar( "bots_main_GUIDs", "" ); //guids of players who will be given host powers, comma seperated
|
||||
|
||||
if ( getDvar( "bots_main_firstIsHost" ) == "" )
|
||||
setDvar( "bots_main_firstIsHost", true ); //first player to connect is a host
|
||||
|
||||
if ( getDvar( "bots_main_waitForHostTime" ) == "" )
|
||||
setDvar( "bots_main_waitForHostTime", 10.0 ); //how long to wait to wait for the host player
|
||||
|
||||
if ( getDvar( "bots_manage_add" ) == "" )
|
||||
setDvar( "bots_manage_add", 0 ); //amount of bots to add to the game
|
||||
|
||||
if ( getDvar( "bots_manage_fill" ) == "" )
|
||||
setDvar( "bots_manage_fill", 0 ); //amount of bots to maintain
|
||||
|
||||
if ( getDvar( "bots_manage_fill_spec" ) == "" )
|
||||
setDvar( "bots_manage_fill_spec", true ); //to count for fill if player is on spec team
|
||||
|
||||
if ( getDvar( "bots_manage_fill_mode" ) == "" )
|
||||
setDvar( "bots_manage_fill_mode", 0 ); //fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1
|
||||
|
||||
if ( getDvar( "bots_manage_fill_kick" ) == "" )
|
||||
setDvar( "bots_manage_fill_kick", false ); //kick bots if too many
|
||||
|
||||
if ( getDvar( "bots_team" ) == "" )
|
||||
setDvar( "bots_team", "autoassign" ); //which team for bots to join
|
||||
|
||||
if ( getDvar( "bots_team_amount" ) == "" )
|
||||
setDvar( "bots_team_amount", 0 ); //amount of bots on axis team
|
||||
|
||||
if ( getDvar( "bots_team_force" ) == "" )
|
||||
setDvar( "bots_team_force", false ); //force bots on team
|
||||
|
||||
if ( getDvar( "bots_team_mode" ) == "" )
|
||||
setDvar( "bots_team_mode", 0 ); //counts just bots when 1
|
||||
|
||||
if ( getDvar( "bots_skill" ) == "" )
|
||||
setDvar( "bots_skill", 0 ); //0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random
|
||||
|
||||
if ( getDvar( "bots_skill_axis_hard" ) == "" )
|
||||
setDvar( "bots_skill_axis_hard", 0 ); //amount of hard bots on axis team
|
||||
|
||||
if ( getDvar( "bots_skill_axis_med" ) == "" )
|
||||
setDvar( "bots_skill_axis_med", 0 );
|
||||
|
||||
if ( getDvar( "bots_skill_allies_hard" ) == "" )
|
||||
setDvar( "bots_skill_allies_hard", 0 );
|
||||
|
||||
if ( getDvar( "bots_skill_allies_med" ) == "" )
|
||||
setDvar( "bots_skill_allies_med", 0 );
|
||||
|
||||
if ( getDvar( "bots_loadout_reasonable" ) == "" ) //filter out the bad 'guns' and perks
|
||||
setDvar( "bots_loadout_reasonable", false );
|
||||
|
||||
if ( getDvar( "bots_loadout_allow_op" ) == "" ) //allows jug, marty and laststand
|
||||
setDvar( "bots_loadout_allow_op", true );
|
||||
|
||||
if ( getDvar( "bots_loadout_rank" ) == "" ) // what rank the bots should be around, -1 is around the players, 0 is all random
|
||||
setDvar( "bots_loadout_rank", -1 );
|
||||
|
||||
if ( getDvar( "bots_loadout_prestige" ) == "" ) // what pretige the bots will be, -1 is the players, -2 is random
|
||||
setDvar( "bots_loadout_prestige", -1 );
|
||||
|
||||
if ( getDvar( "bots_play_move" ) == "" ) //bots move
|
||||
setDvar( "bots_play_move", true );
|
||||
|
||||
if ( getDvar( "bots_play_knife" ) == "" ) //bots knife
|
||||
setDvar( "bots_play_knife", true );
|
||||
|
||||
if ( getDvar( "bots_play_fire" ) == "" ) //bots fire
|
||||
setDvar( "bots_play_fire", true );
|
||||
|
||||
if ( getDvar( "bots_play_nade" ) == "" ) //bots grenade
|
||||
setDvar( "bots_play_nade", true );
|
||||
|
||||
if ( getDvar( "bots_play_obj" ) == "" ) //bots play the obj
|
||||
setDvar( "bots_play_obj", true );
|
||||
|
||||
if ( getDvar( "bots_play_camp" ) == "" ) //bots camp and follow
|
||||
setDvar( "bots_play_camp", true );
|
||||
|
||||
if ( getDvar( "bots_play_jumpdrop" ) == "" ) //bots jump and dropshot
|
||||
setDvar( "bots_play_jumpdrop", true );
|
||||
|
||||
if ( getDvar( "bots_play_target_other" ) == "" ) //bot target non play ents (vehicles)
|
||||
setDvar( "bots_play_target_other", true );
|
||||
|
||||
if ( getDvar( "bots_play_killstreak" ) == "" ) //bot use killstreaks
|
||||
setDvar( "bots_play_killstreak", true );
|
||||
|
||||
if ( getDvar( "bots_play_ads" ) == "" ) //bot ads
|
||||
setDvar( "bots_play_ads", true );
|
||||
|
||||
@ -94,6 +119,7 @@ init()
|
||||
level.defuseObject = undefined;
|
||||
level.bots_smokeList = List();
|
||||
level.tbl_PerkData[0]["reference_full"] = true;
|
||||
|
||||
for ( h = 1; h < 6; h++ )
|
||||
for ( i = 0; i < 3; i++ )
|
||||
level.default_perk["CLASS_CUSTOM" + h][i] = "specialty_null";
|
||||
@ -241,6 +267,7 @@ fixGamemodes()
|
||||
{
|
||||
for ( i = 0; i < level.bombZones.size; i++ )
|
||||
level.bombZones[i].onUse = ::onUsePlantObjectFix;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@ -381,6 +408,7 @@ diffBots_loop()
|
||||
if ( var_skill == 8 )
|
||||
{
|
||||
playercount = level.players.size;
|
||||
|
||||
for ( i = 0; i < playercount; i++ )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -426,6 +454,7 @@ diffBots_loop()
|
||||
else if ( var_skill != 0 && var_skill != 9 )
|
||||
{
|
||||
playercount = level.players.size;
|
||||
|
||||
for ( i = 0; i < playercount; i++ )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -465,6 +494,7 @@ teamBots_loop()
|
||||
axisplayers = 0;
|
||||
|
||||
playercount = level.players.size;
|
||||
|
||||
for ( i = 0; i < playercount; i++ )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -506,6 +536,7 @@ teamBots_loop()
|
||||
if ( abs( axis - allies ) > 1 )
|
||||
{
|
||||
toTeam = "axis";
|
||||
|
||||
if ( axis > allies )
|
||||
toTeam = "allies";
|
||||
}
|
||||
@ -514,6 +545,7 @@ teamBots_loop()
|
||||
if ( toTeam != "autoassign" )
|
||||
{
|
||||
playercount = level.players.size;
|
||||
|
||||
for ( i = 0; i < playercount; i++ )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -533,6 +565,7 @@ teamBots_loop()
|
||||
player thread [[level.axis]]();
|
||||
else
|
||||
player thread [[level.spectator]]();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -541,6 +574,7 @@ teamBots_loop()
|
||||
else
|
||||
{
|
||||
playercount = level.players.size;
|
||||
|
||||
for ( i = 0; i < playercount; i++ )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -622,6 +656,7 @@ addBots_loop()
|
||||
spec = 0;
|
||||
|
||||
playercount = level.players.size;
|
||||
|
||||
for ( i = 0; i < playercount; i++ )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -648,6 +683,7 @@ addBots_loop()
|
||||
alliesplayers = 0;
|
||||
|
||||
playercount = level.players.size;
|
||||
|
||||
for ( i = 0; i < playercount; i++ )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -680,8 +716,10 @@ addBots_loop()
|
||||
}
|
||||
|
||||
amount = bots;
|
||||
|
||||
if ( fillMode == 0 || fillMode == 2 )
|
||||
amount += players;
|
||||
|
||||
if ( getDVarInt( "bots_manage_fill_spec" ) )
|
||||
amount += spec;
|
||||
|
||||
@ -690,6 +728,7 @@ addBots_loop()
|
||||
else if ( amount > fillAmount && getDvarInt( "bots_manage_fill_kick" ) )
|
||||
{
|
||||
tempBot = PickRandom( getBotArray() );
|
||||
|
||||
if ( isDefined( tempBot ) )
|
||||
tempBot RemoveTestClient();
|
||||
}
|
||||
@ -718,6 +757,7 @@ addBots()
|
||||
onPlayerSpawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill ( "spawned_player" );
|
||||
@ -731,6 +771,7 @@ onPlayerSpawned()
|
||||
onGrenadeFire()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill ( "grenade_fire", grenade, weaponName );
|
||||
@ -739,6 +780,7 @@ onGrenadeFire()
|
||||
continue;
|
||||
|
||||
grenade.name = weaponName;
|
||||
|
||||
if ( weaponName == "m8_white_smoke_mp" )
|
||||
grenade thread AddToSmokeList();
|
||||
}
|
||||
@ -770,6 +812,7 @@ thinkSmoke()
|
||||
self.state = "moving";
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
self.state = "smoking";
|
||||
wait 11.5;
|
||||
|
||||
@ -825,6 +868,7 @@ doUAVUpdate(team)
|
||||
wait level.radarViewTime;
|
||||
|
||||
playercount = level.players.size;
|
||||
|
||||
for ( i = 0; i < playercount; i++ )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -857,6 +901,7 @@ onWeaponFired()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self.bots_firing = false;
|
||||
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "weapon_fired" );
|
||||
|
@ -95,6 +95,7 @@ getLinesFromUrl(url, filename)
|
||||
fileWrite( filename, data, "write" );
|
||||
|
||||
line = "";
|
||||
|
||||
for ( i = 0; i < data.size; i++ )
|
||||
{
|
||||
c = data[i];
|
||||
@ -109,6 +110,7 @@ getLinesFromUrl(url, filename)
|
||||
|
||||
line += c;
|
||||
}
|
||||
|
||||
result.lines[result.lines.size] = line;
|
||||
|
||||
return result;
|
||||
|
@ -248,6 +248,7 @@ doBotMovement_loop(data)
|
||||
startPos = self.origin + ( 0, 0, 50 );
|
||||
startPosForward = startPos + anglesToForward( ( 0, angles[1], 0 ) ) * 25;
|
||||
bt = bulletTrace( startPos, startPosForward, false, self );
|
||||
|
||||
if ( bt["fraction"] >= 1 )
|
||||
{
|
||||
// check if need to jump
|
||||
@ -359,6 +360,7 @@ watchC4Thrown(c4)
|
||||
wait 1 + randomInt( 50 ) * 0.05;
|
||||
|
||||
shouldBreak = false;
|
||||
|
||||
for ( i = 0; i < level.players.size; i++ )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -400,10 +402,13 @@ SetWeaponDistMulti(weap)
|
||||
{
|
||||
case "rifle":
|
||||
return 0.9;
|
||||
|
||||
case "smg":
|
||||
return 0.7;
|
||||
|
||||
case "pistol":
|
||||
return 0.5;
|
||||
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
@ -454,6 +459,7 @@ onLastStand_loop()
|
||||
waittillframeend;
|
||||
|
||||
weaponslist = self getweaponslist();
|
||||
|
||||
for ( i = 0; i < weaponslist.size; i++ )
|
||||
{
|
||||
weapon = weaponslist[i];
|
||||
@ -469,6 +475,7 @@ onLastStand_loop()
|
||||
wait 0.05;
|
||||
|
||||
waittillframeend;
|
||||
|
||||
if ( isDefined( self.previousPrimary ) && self.previousPrimary != "none" )
|
||||
self changeToWeap( self.previousPrimary );
|
||||
}
|
||||
@ -496,9 +503,11 @@ onWeaponChange()
|
||||
self endon( "death" );
|
||||
|
||||
first = true;
|
||||
|
||||
for ( ;; )
|
||||
{
|
||||
newWeapon = undefined;
|
||||
|
||||
if ( first )
|
||||
{
|
||||
first = false;
|
||||
@ -558,6 +567,7 @@ reload_watch_loop()
|
||||
if ( self GetWeaponAmmoClip( weap ) >= WeaponClipSize( weap ) )
|
||||
break;
|
||||
}
|
||||
|
||||
self.bot.isreloading = false;
|
||||
}
|
||||
|
||||
@ -588,6 +598,7 @@ stance_loop()
|
||||
return;
|
||||
|
||||
toStance = "stand";
|
||||
|
||||
if ( self.bot.next_wp != -1 )
|
||||
toStance = level.waypoints[self.bot.next_wp].type;
|
||||
|
||||
@ -851,6 +862,7 @@ targetObjUpdateTraced(obj, daDist, ent, theTime, isScriptObj)
|
||||
distMax *= distMax;
|
||||
|
||||
timeMulti = 1;
|
||||
|
||||
if ( !isScriptObj )
|
||||
{
|
||||
if ( daDist > distMax )
|
||||
@ -908,6 +920,7 @@ target_loop()
|
||||
}
|
||||
|
||||
playercount = level.players.size;
|
||||
|
||||
for ( i = -1; i < playercount; i++ )
|
||||
{
|
||||
obj = undefined;
|
||||
@ -923,6 +936,7 @@ target_loop()
|
||||
obj = self.bot.targets[key];
|
||||
isObjDef = isDefined( obj );
|
||||
entOrigin = ent.origin;
|
||||
|
||||
if ( isDefined( self.bot.script_target_offset ) )
|
||||
entOrigin += self.bot.script_target_offset;
|
||||
|
||||
@ -958,6 +972,7 @@ target_loop()
|
||||
|
||||
if ( !player IsPlayerModelOK() )
|
||||
continue;
|
||||
|
||||
if ( player == self )
|
||||
continue;
|
||||
|
||||
@ -965,6 +980,7 @@ target_loop()
|
||||
obj = self.bot.targets[key];
|
||||
daDist = distanceSquared( self.origin, player.origin );
|
||||
isObjDef = isDefined( obj );
|
||||
|
||||
if ( ( level.teamBased && self.team == player.team ) || player.sessionstate != "playing" || !isAlive( player ) )
|
||||
{
|
||||
if ( isObjDef )
|
||||
@ -1031,6 +1047,7 @@ target_loop()
|
||||
continue;
|
||||
|
||||
timeDiff = theTime - obj.trace_time_time;
|
||||
|
||||
if ( timeDiff < bestTime )
|
||||
{
|
||||
bestTargets = [];
|
||||
@ -1048,9 +1065,11 @@ target_loop()
|
||||
toBeTarget = undefined;
|
||||
|
||||
bestKeys = getArrayKeys( bestTargets );
|
||||
|
||||
for ( i = bestKeys.size - 1; i >= 0; i-- )
|
||||
{
|
||||
theDist = bestTargets[bestKeys[i]].dist;
|
||||
|
||||
if ( theDist > closest )
|
||||
continue;
|
||||
|
||||
@ -1060,8 +1079,10 @@ target_loop()
|
||||
|
||||
beforeTargetID = -1;
|
||||
newTargetID = -1;
|
||||
|
||||
if ( hasTarget && isDefined( self.bot.target.entity ) )
|
||||
beforeTargetID = self.bot.target.entity getEntityNumber();
|
||||
|
||||
if ( isDefined( toBeTarget ) && isDefined( toBeTarget.entity ) )
|
||||
newTargetID = toBeTarget.entity getEntityNumber();
|
||||
|
||||
@ -1251,10 +1272,12 @@ aim_loop()
|
||||
isplay = self.bot.target.isplay;
|
||||
|
||||
offset = self.bot.target.offset;
|
||||
|
||||
if ( !isDefined( offset ) )
|
||||
offset = ( 0, 0, 0 );
|
||||
|
||||
aimoffset = self.bot.target.aim_offset;
|
||||
|
||||
if ( !isDefined( aimoffset ) )
|
||||
aimoffset = ( 0, 0, 0 );
|
||||
|
||||
@ -1265,6 +1288,7 @@ aim_loop()
|
||||
nadeAimOffset = 0;
|
||||
|
||||
bone = self.bot.target.bone;
|
||||
|
||||
if ( !isDefined( bone ) )
|
||||
bone = "j_spineupper";
|
||||
|
||||
@ -1283,9 +1307,11 @@ aim_loop()
|
||||
if ( !self.bot.isfraggingafter && !self.bot.issmokingafter )
|
||||
{
|
||||
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 && getDvarInt( "bots_play_nade" ) )
|
||||
{
|
||||
time = 0.5;
|
||||
|
||||
if ( nade == "frag_grenade_mp" )
|
||||
time = 2;
|
||||
|
||||
@ -1358,9 +1384,11 @@ aim_loop()
|
||||
return;
|
||||
|
||||
canADS = ( self canAds( dist, curweap ) && conedot > 0.75 );
|
||||
|
||||
if ( canADS )
|
||||
{
|
||||
stopAdsOverride = false;
|
||||
|
||||
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 )
|
||||
@ -1407,9 +1435,11 @@ aim_loop()
|
||||
return;
|
||||
|
||||
canADS = ( self canAds( dist, curweap ) && conedot > 0.75 );
|
||||
|
||||
if ( canADS )
|
||||
{
|
||||
stopAdsOverride = false;
|
||||
|
||||
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 )
|
||||
@ -1529,6 +1559,7 @@ canAds(dist, curweap)
|
||||
return false;
|
||||
|
||||
far = level.bots_noADSDistance;
|
||||
|
||||
if ( self hasPerk( "specialty_bulletaccuracy" ) )
|
||||
far *= 1.4;
|
||||
|
||||
@ -1536,6 +1567,7 @@ canAds(dist, curweap)
|
||||
return false;
|
||||
|
||||
weapclass = ( weaponClass( curweap ) );
|
||||
|
||||
if ( weapclass == "spread" || weapclass == "grenade" )
|
||||
return false;
|
||||
|
||||
@ -1561,7 +1593,20 @@ isInRange(dist, curweap)
|
||||
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()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
@ -1579,6 +1624,7 @@ killWalkCauseNoWaypoints()
|
||||
walk_loop()
|
||||
{
|
||||
hasTarget = isDefined( self.bot.target ) && isDefined( self.bot.target.entity );
|
||||
|
||||
if ( hasTarget )
|
||||
{
|
||||
curweap = self getCurrentWeapon();
|
||||
@ -1598,11 +1644,13 @@ walk_loop()
|
||||
|
||||
if ( self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"] )
|
||||
self strafe( self.bot.target.entity );
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
dist = 16;
|
||||
|
||||
if ( level.waypointCount )
|
||||
goal = level.waypoints[randomInt( level.waypointCount )].origin;
|
||||
else
|
||||
@ -1644,6 +1692,7 @@ walk_loop()
|
||||
}
|
||||
|
||||
isScriptGoal = false;
|
||||
|
||||
if ( isDefined( self.bot.script_goal ) && !hasTarget )
|
||||
{
|
||||
goal = self.bot.script_goal;
|
||||
@ -1717,6 +1766,7 @@ strafe(target)
|
||||
traceRight = BulletTrace( myOrg, right, false, self );
|
||||
|
||||
strafe = traceLeft["position"];
|
||||
|
||||
if ( traceRight["fraction"] > traceLeft["fraction"] )
|
||||
strafe = traceRight["position"];
|
||||
|
||||
@ -1759,6 +1809,7 @@ cleanUpAStar(team)
|
||||
initAStar( goal )
|
||||
{
|
||||
team = undefined;
|
||||
|
||||
if ( level.teamBased )
|
||||
team = self.team;
|
||||
|
||||
@ -1825,6 +1876,7 @@ doWalk(goal, dist, isScriptGoal)
|
||||
self endon( "goal_internal" ); //so that the watchOnGoal notify can happen same frame, not a frame later
|
||||
|
||||
dist *= dist;
|
||||
|
||||
if ( isScriptGoal )
|
||||
self thread doWalkScriptNotify();
|
||||
|
||||
@ -1832,6 +1884,7 @@ doWalk(goal, dist, isScriptGoal)
|
||||
self thread watchOnGoal( goal, dist );
|
||||
|
||||
current = self initAStar( goal );
|
||||
|
||||
// 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 )
|
||||
current = self removeAStar();
|
||||
@ -1845,6 +1898,7 @@ doWalk(goal, dist, isScriptGoal)
|
||||
{
|
||||
self.bot.next_wp = self.bot.astar[current];
|
||||
self.bot.second_next_wp = -1;
|
||||
|
||||
if ( current > 0 )
|
||||
self.bot.second_next_wp = self.bot.astar[current - 1];
|
||||
|
||||
@ -1873,6 +1927,7 @@ doWalk(goal, dist, isScriptGoal)
|
||||
self notify( "finished_goal" );
|
||||
|
||||
wait 1;
|
||||
|
||||
if ( DistanceSquared( self.origin, goal ) > dist )
|
||||
self notify( "bad_path_internal" );
|
||||
}
|
||||
@ -1891,6 +1946,7 @@ movetowards(goal)
|
||||
stucks = 0;
|
||||
timeslow = 0;
|
||||
time = 0;
|
||||
|
||||
while ( distanceSquared( self.origin, goal ) > level.bots_goalDistance )
|
||||
{
|
||||
self botMoveTo( goal );
|
||||
@ -1898,6 +1954,7 @@ movetowards(goal)
|
||||
if ( time > 3500 )
|
||||
{
|
||||
time = 0;
|
||||
|
||||
if ( distanceSquared( self.origin, lastOri ) < 128 )
|
||||
{
|
||||
self thread knife();
|
||||
@ -1926,6 +1983,7 @@ movetowards(goal)
|
||||
|
||||
wait 0.05;
|
||||
time += 50;
|
||||
|
||||
if ( lengthsquared( self getVelocity() ) < 1000 )
|
||||
timeslow += 50;
|
||||
else
|
||||
@ -2113,6 +2171,7 @@ smoke(time)
|
||||
fire( what )
|
||||
{
|
||||
self notify( "bot_fire" );
|
||||
|
||||
if ( what )
|
||||
self botAction( "+fire" );
|
||||
else
|
||||
@ -2146,6 +2205,7 @@ pressFire(time)
|
||||
ads( what )
|
||||
{
|
||||
self notify( "bot_ads" );
|
||||
|
||||
if ( what )
|
||||
self botAction( "+ads" );
|
||||
else
|
||||
@ -2283,6 +2343,7 @@ bot_lookat(pos, time, vel)
|
||||
vel = ( 0, 0, 0 );
|
||||
|
||||
steps = int( time * 20 );
|
||||
|
||||
if ( steps < 1 )
|
||||
steps = 1;
|
||||
|
||||
@ -2295,15 +2356,20 @@ bot_lookat(pos, time, vel)
|
||||
angles = VectorToAngles( ( pos - myEye ) - anglesToForward( myAngle ) );
|
||||
|
||||
X = ( angles[0] - myAngle[0] );
|
||||
|
||||
while ( X > 170.0 )
|
||||
X = X - 360.0;
|
||||
|
||||
while ( X < -170.0 )
|
||||
X = X + 360.0;
|
||||
|
||||
X = X / steps;
|
||||
|
||||
Y = ( angles[1] - myAngle[1] );
|
||||
|
||||
while ( Y > 180.0 )
|
||||
Y = Y - 360.0;
|
||||
|
||||
while ( Y < -180.0 )
|
||||
Y = Y + 360.0;
|
||||
|
||||
|
@ -126,6 +126,7 @@ bot_cry_for_help( attacker )
|
||||
}
|
||||
|
||||
theTime = GetTime();
|
||||
|
||||
if ( IsDefined( self.help_time ) && theTime - self.help_time < 1000 )
|
||||
{
|
||||
return;
|
||||
@ -165,6 +166,7 @@ bot_cry_for_help( attacker )
|
||||
|
||||
dist = player.pers["bots"]["skill"]["help_dist"];
|
||||
dist *= dist;
|
||||
|
||||
if ( DistanceSquared( self.origin, player.origin ) > dist )
|
||||
{
|
||||
continue;
|
||||
@ -205,6 +207,7 @@ chooseRandomClass()
|
||||
{
|
||||
class = "";
|
||||
rank = self maps\mp\gametypes\_rank::getRankForXp( self getStat( int( tableLookup( "mp/playerStatsTable.csv", 1, "rankxp", 0 ) ) ) ) + 1;
|
||||
|
||||
if ( rank < 4 || randomInt( 100 ) < 2 )
|
||||
{
|
||||
while ( class == "" )
|
||||
@ -214,19 +217,25 @@ chooseRandomClass()
|
||||
case 0:
|
||||
class = "assault_mp";
|
||||
break;
|
||||
|
||||
case 1:
|
||||
class = "specops_mp";
|
||||
break;
|
||||
|
||||
case 2:
|
||||
class = "heavygunner_mp";
|
||||
break;
|
||||
|
||||
case 3:
|
||||
if ( rank >= 2 )
|
||||
class = "demolitions_mp";
|
||||
|
||||
break;
|
||||
|
||||
case 4:
|
||||
if ( rank >= 3 )
|
||||
class = "sniper_mp";
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -326,6 +335,7 @@ difficulty()
|
||||
self.pers["bots"]["behavior"]["class"] = 2;
|
||||
self.pers["bots"]["behavior"]["jump"] = 0;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
self.pers["bots"]["skill"]["aim_time"] = 0.55;
|
||||
self.pers["bots"]["skill"]["init_react_time"] = 1000;
|
||||
@ -357,6 +367,7 @@ difficulty()
|
||||
self.pers["bots"]["behavior"]["class"] = 2;
|
||||
self.pers["bots"]["behavior"]["jump"] = 10;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
self.pers["bots"]["skill"]["aim_time"] = 0.4;
|
||||
self.pers["bots"]["skill"]["init_react_time"] = 750;
|
||||
@ -388,6 +399,7 @@ difficulty()
|
||||
self.pers["bots"]["behavior"]["class"] = 2;
|
||||
self.pers["bots"]["behavior"]["jump"] = 25;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
self.pers["bots"]["skill"]["aim_time"] = 0.3;
|
||||
self.pers["bots"]["skill"]["init_react_time"] = 600;
|
||||
@ -419,6 +431,7 @@ difficulty()
|
||||
self.pers["bots"]["behavior"]["class"] = 2;
|
||||
self.pers["bots"]["behavior"]["jump"] = 35;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
self.pers["bots"]["skill"]["aim_time"] = 0.25;
|
||||
self.pers["bots"]["skill"]["init_react_time"] = 500;
|
||||
@ -450,6 +463,7 @@ difficulty()
|
||||
self.pers["bots"]["behavior"]["class"] = 2;
|
||||
self.pers["bots"]["behavior"]["jump"] = 50;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
self.pers["bots"]["skill"]["aim_time"] = 0.2;
|
||||
self.pers["bots"]["skill"]["init_react_time"] = 250;
|
||||
@ -481,6 +495,7 @@ difficulty()
|
||||
self.pers["bots"]["behavior"]["class"] = 2;
|
||||
self.pers["bots"]["behavior"]["jump"] = 75;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
self.pers["bots"]["skill"]["aim_time"] = 0.1;
|
||||
self.pers["bots"]["skill"]["init_react_time"] = 100;
|
||||
@ -531,8 +546,10 @@ set_diff()
|
||||
case 0:
|
||||
self.pers["bots"]["skill"]["base"] = Round( random_normal_distribution( 3.5, 1.75, 1, 7 ) );
|
||||
break;
|
||||
|
||||
case 8:
|
||||
break;
|
||||
|
||||
case 9:
|
||||
self.pers["bots"]["skill"]["base"] = randomIntRange( 1, 7 );
|
||||
self.pers["bots"]["skill"]["aim_time"] = 0.05 * randomIntRange( 1, 20 );
|
||||
@ -566,6 +583,7 @@ set_diff()
|
||||
self.pers["bots"]["behavior"]["class"] = randomInt( 100 );
|
||||
self.pers["bots"]["behavior"]["jump"] = randomInt( 100 );
|
||||
break;
|
||||
|
||||
default:
|
||||
self.pers["bots"]["skill"]["base"] = rankVar;
|
||||
break;
|
||||
@ -615,6 +633,7 @@ set_class(rankxp)
|
||||
secondary = "";
|
||||
}
|
||||
}
|
||||
|
||||
att2 = get_random_attachment( secondary, rank );
|
||||
|
||||
perk1 = get_random_perk( "perk1", rank, att1, att2 );
|
||||
@ -627,13 +646,18 @@ set_class(rankxp)
|
||||
|
||||
if ( att1 == "bayonet" )
|
||||
att1 = "BAYONET";
|
||||
|
||||
if ( att2 == "bayonet" )
|
||||
att2 = "BAYONET"; // t4 is messed up lmao
|
||||
|
||||
self setStat ( 200 + ( i * 10 ) + 1, level.weaponReferenceToIndex[primary] );
|
||||
|
||||
if ( att1 != "none" ) self setStat ( 200 + ( i * 10 ) + 2, level.weaponAttachmentReferenceToIndex[att1] );
|
||||
|
||||
self setStat ( 200 + ( i * 10 ) + 3, level.weaponReferenceToIndex[secondary] );
|
||||
|
||||
if ( att2 != "none" ) self setStat ( 200 + ( i * 10 ) + 4, level.weaponAttachmentReferenceToIndex[att2] );
|
||||
|
||||
self setStat ( 200 + ( i * 10 ) + 5, level.perkReferenceToIndex[perk1] );
|
||||
self setStat ( 200 + ( i * 10 ) + 6, level.perkReferenceToIndex[perk2] );
|
||||
self setStat ( 200 + ( i * 10 ) + 7, level.perkReferenceToIndex[perk3] );
|
||||
@ -690,6 +714,7 @@ get_random_perk(perkslot, rank, att1, att2)
|
||||
op = GetDvarInt( "bots_loadout_allow_op" );
|
||||
|
||||
keys = getArrayKeys( level.tbl_PerkData );
|
||||
|
||||
for ( ;; )
|
||||
{
|
||||
id = level.tbl_PerkData[keys[randomInt( keys.size )]];
|
||||
@ -809,6 +834,7 @@ get_random_weapon(groups, rank)
|
||||
reasonable = GetDvarInt( "bots_loadout_reasonable" );
|
||||
|
||||
keys = getArrayKeys( level.tbl_weaponIDs );
|
||||
|
||||
for ( ;; )
|
||||
{
|
||||
id = level.tbl_weaponIDs[keys[randomInt( keys.size )]];
|
||||
@ -818,6 +844,7 @@ get_random_weapon(groups, rank)
|
||||
|
||||
group = id["group"];
|
||||
inGroup = false;
|
||||
|
||||
for ( i = groups.size - 1; i >= 0; i-- )
|
||||
{
|
||||
if ( groups[i] == group )
|
||||
@ -1262,6 +1289,7 @@ bot_bomb_use_time(wait_time)
|
||||
|
||||
wait 0.05;
|
||||
elapsed = 0;
|
||||
|
||||
while ( wait_time > elapsed )
|
||||
{
|
||||
wait 0.05;//wait first so waittill can setup
|
||||
@ -1470,6 +1498,7 @@ bot_revive_wait(revive)
|
||||
self endon( "bot_try_use_success" );
|
||||
|
||||
timer = 0;
|
||||
|
||||
for ( reviveTime = GetDvarInt( "revive_time_taken" ); timer < reviveTime; timer += 0.05 )
|
||||
{
|
||||
wait 0.05;
|
||||
@ -1532,6 +1561,7 @@ bots_use_revive(revive)
|
||||
self maps\mp\gametypes\_rank::giveRankXP( "revive", level.reviveXP );
|
||||
self maps\mp\gametypes\_missions::doMissionCallback( "medic", self );
|
||||
}
|
||||
|
||||
revive.thisPlayerIsInLastStand = false;
|
||||
revive thread maps\mp\_laststand::takePlayerOutOfLastStand();
|
||||
|
||||
@ -1555,6 +1585,7 @@ bot_use_revive_thread(revivePlayer)
|
||||
bot_revive_think_loop()
|
||||
{
|
||||
revivePlayer = undefined;
|
||||
|
||||
for ( i = 0; i < level.players.size; i++ )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -1564,10 +1595,13 @@ bot_revive_think_loop()
|
||||
|
||||
if ( !isDefined( player.pers["team"] ) )
|
||||
continue;
|
||||
|
||||
if ( player == self )
|
||||
continue;
|
||||
|
||||
if ( self.pers["team"] != player.pers["team"] )
|
||||
continue;
|
||||
|
||||
if ( !isDefined( player.revivetrigger ) )
|
||||
continue;
|
||||
|
||||
@ -1767,6 +1801,7 @@ CampAtSpot(origin, anglePos)
|
||||
self endon( "kill_camp_bot" );
|
||||
|
||||
self SetScriptGoal( origin, 64 );
|
||||
|
||||
if ( isDefined( anglePos ) )
|
||||
{
|
||||
self SetScriptAimPos( anglePos );
|
||||
@ -1785,6 +1820,7 @@ bot_think_follow_loop()
|
||||
{
|
||||
follows = [];
|
||||
distSq = self.pers["bots"]["skill"]["help_dist"] * self.pers["bots"]["skill"]["help_dist"];
|
||||
|
||||
for ( i = level.players.size - 1; i >= 0; i-- )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -1806,6 +1842,7 @@ bot_think_follow_loop()
|
||||
|
||||
follows[follows.size] = player;
|
||||
}
|
||||
|
||||
toFollow = PickRandom( follows );
|
||||
|
||||
if ( !isDefined( toFollow ) )
|
||||
@ -1925,6 +1962,7 @@ bot_use_tube_think_loop(data)
|
||||
wait randomintRange( 3, 7 );
|
||||
|
||||
chance = self.pers["bots"]["behavior"]["nade"] / 2;
|
||||
|
||||
if ( chance > 20 )
|
||||
chance = 20;
|
||||
|
||||
@ -1933,6 +1971,7 @@ bot_use_tube_think_loop(data)
|
||||
}
|
||||
|
||||
tube = self getValidTube();
|
||||
|
||||
if ( !isDefined( tube ) )
|
||||
return;
|
||||
|
||||
@ -1958,12 +1997,14 @@ bot_use_tube_think_loop(data)
|
||||
tubeWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "tube" ), 1024 ) ) );
|
||||
|
||||
myEye = self GetEye();
|
||||
|
||||
if ( !isDefined( tubeWp ) || self HasScriptGoal() || self.bot_lock_goal )
|
||||
{
|
||||
traceForward = BulletTrace( myEye, myEye + AnglesToForward( self GetPlayerAngles() ) * 900 * 5, false, self );
|
||||
|
||||
loc = traceForward["position"];
|
||||
dist = DistanceSquared( self.origin, loc );
|
||||
|
||||
if ( dist < level.bots_minGrenadeDistance || dist > level.bots_maxGrenadeDistance * 5 )
|
||||
return;
|
||||
|
||||
@ -2045,6 +2086,7 @@ bot_use_equipment_think_loop(data)
|
||||
wait randomintRange( 2, 4 );
|
||||
|
||||
chance = self.pers["bots"]["behavior"]["nade"] / 2;
|
||||
|
||||
if ( chance > 20 )
|
||||
chance = 20;
|
||||
|
||||
@ -2053,8 +2095,10 @@ bot_use_equipment_think_loop(data)
|
||||
}
|
||||
|
||||
nade = undefined;
|
||||
|
||||
if ( self GetAmmoCount( "mine_bouncing_betty_mp" ) )
|
||||
nade = "mine_bouncing_betty_mp";
|
||||
|
||||
if ( self GetAmmoCount( "satchel_charge_mp" ) )
|
||||
nade = "satchel_charge_mp";
|
||||
|
||||
@ -2079,6 +2123,7 @@ bot_use_equipment_think_loop(data)
|
||||
loc = undefined;
|
||||
|
||||
curWeap = self GetCurrentWeapon();
|
||||
|
||||
if ( curWeap == "none" || !isWeaponDroppable( curWeap ) )
|
||||
curWeap = self.lastDroppableWeapon;
|
||||
|
||||
@ -2129,6 +2174,7 @@ bot_use_equipment_think_loop(data)
|
||||
self thread fire_current_weapon();
|
||||
else
|
||||
self thread fire_c4();
|
||||
|
||||
self waittill_any_timeout( 5, "grenade_fire", "weapon_change" );
|
||||
self notify( "stop_firing_weapon" );
|
||||
}
|
||||
@ -2168,6 +2214,7 @@ bot_use_grenade_think_loop(data)
|
||||
wait randomintRange( 4, 7 );
|
||||
|
||||
chance = self.pers["bots"]["behavior"]["nade"] / 2;
|
||||
|
||||
if ( chance > 20 )
|
||||
chance = 20;
|
||||
|
||||
@ -2176,6 +2223,7 @@ bot_use_grenade_think_loop(data)
|
||||
}
|
||||
|
||||
nade = self getValidGrenade();
|
||||
|
||||
if ( !isDefined( nade ) )
|
||||
return;
|
||||
|
||||
@ -2201,12 +2249,14 @@ bot_use_grenade_think_loop(data)
|
||||
nadeWp = getWaypointForIndex( PickRandom( self waypointsNear( getWaypointsOfType( "grenade" ), 1024 ) ) );
|
||||
|
||||
myEye = self GetEye();
|
||||
|
||||
if ( !isDefined( nadeWp ) || self HasScriptGoal() || self.bot_lock_goal )
|
||||
{
|
||||
traceForward = BulletTrace( myEye, myEye + AnglesToForward( self GetPlayerAngles() ) * 900, false, self );
|
||||
|
||||
loc = traceForward["position"];
|
||||
dist = DistanceSquared( self.origin, loc );
|
||||
|
||||
if ( dist < level.bots_minGrenadeDistance || dist > level.bots_maxGrenadeDistance )
|
||||
return;
|
||||
|
||||
@ -2248,8 +2298,10 @@ bot_use_grenade_think_loop(data)
|
||||
wait 1;
|
||||
|
||||
time = 0.5;
|
||||
|
||||
if ( nade == "frag_grenade_mp" )
|
||||
time = 2;
|
||||
|
||||
self botThrowGrenade( nade, time );
|
||||
|
||||
self ClearScriptAimPos();
|
||||
@ -2290,6 +2342,7 @@ follow_target_loop()
|
||||
self thread stop_go_target_on_death( threat );
|
||||
|
||||
self SetScriptGoal( threat.origin, 64 );
|
||||
|
||||
if ( self waittill_any_return( "new_goal", "goal", "bad_path" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
}
|
||||
@ -2328,6 +2381,7 @@ bot_listen_to_steps_loop()
|
||||
dist *= dist;
|
||||
|
||||
heard = undefined;
|
||||
|
||||
for ( i = level.players.size - 1 ; i >= 0; i-- )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -2337,12 +2391,16 @@ bot_listen_to_steps_loop()
|
||||
|
||||
if ( player == self )
|
||||
continue;
|
||||
|
||||
if ( level.teamBased && self.team == player.team )
|
||||
continue;
|
||||
|
||||
if ( player.sessionstate != "playing" )
|
||||
continue;
|
||||
|
||||
if ( !isAlive( player ) )
|
||||
continue;
|
||||
|
||||
if ( player hasPerk( "specialty_quieter" ) )
|
||||
continue;
|
||||
|
||||
@ -2469,6 +2527,7 @@ doReloadCancel_loop()
|
||||
// check if got another weapon
|
||||
weaponslist = self GetWeaponsListPrimaries();
|
||||
weap = "";
|
||||
|
||||
while ( weaponslist.size )
|
||||
{
|
||||
weapon = weaponslist[randomInt( weaponslist.size )];
|
||||
@ -2533,6 +2592,7 @@ bot_weapon_think_loop(data)
|
||||
{
|
||||
if ( curWeap != "bazooka_mp" )
|
||||
self thread ChangeToWeapon( "bazooka_mp" );
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -2558,6 +2618,7 @@ bot_weapon_think_loop(data)
|
||||
|
||||
weaponslist = self getweaponslist();
|
||||
weap = "";
|
||||
|
||||
while ( weaponslist.size )
|
||||
{
|
||||
weapon = weaponslist[randomInt( weaponslist.size )];
|
||||
@ -2609,6 +2670,7 @@ bot_weapon_think()
|
||||
bot_watch_think_mw2_loop()
|
||||
{
|
||||
tube = self getValidTube();
|
||||
|
||||
if ( !isDefined( tube ) )
|
||||
{
|
||||
if ( self GetAmmoCount( "bazooka_mp" ) )
|
||||
@ -2663,15 +2725,18 @@ bot_watch_think_mw2()
|
||||
bot_killstreak_think_loop()
|
||||
{
|
||||
curWeap = self GetCurrentWeapon();
|
||||
|
||||
if ( curWeap == "none" || !isWeaponDroppable( curWeap ) )
|
||||
curWeap = self.lastDroppableWeapon;
|
||||
|
||||
targetPos = undefined;
|
||||
|
||||
switch ( self.pers["hardPointItem"] )
|
||||
{
|
||||
case "radar_mp":
|
||||
if ( self.bot_radar && self.pers["bots"]["skill"]["base"] > 3 )
|
||||
return;
|
||||
|
||||
break;
|
||||
|
||||
case "dogs_mp":
|
||||
@ -2685,6 +2750,7 @@ bot_killstreak_think_loop()
|
||||
return;
|
||||
|
||||
players = [];
|
||||
|
||||
for ( i = level.players.size - 1; i >= 0; i-- )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -2694,16 +2760,22 @@ bot_killstreak_think_loop()
|
||||
|
||||
if ( player == self )
|
||||
continue;
|
||||
|
||||
if ( !isDefined( player.team ) )
|
||||
continue;
|
||||
|
||||
if ( level.teamBased && self.team == player.team )
|
||||
continue;
|
||||
|
||||
if ( player.sessionstate != "playing" )
|
||||
continue;
|
||||
|
||||
if ( !isAlive( player ) )
|
||||
continue;
|
||||
|
||||
if ( player hasPerk( "specialty_gpsjammer" ) )
|
||||
continue;
|
||||
|
||||
if ( !bulletTracePassed( player.origin, player.origin + ( 0, 0, 512 ), false, player ) && self.pers["bots"]["skill"]["base"] > 3 )
|
||||
continue;
|
||||
|
||||
@ -2716,6 +2788,7 @@ bot_killstreak_think_loop()
|
||||
targetPos = target.origin + ( randomIntRange( ( 8 - self.pers["bots"]["skill"]["base"] ) * -75, ( 8 - self.pers["bots"]["skill"]["base"] ) * 75 ), randomIntRange( ( 8 - self.pers["bots"]["skill"]["base"] ) * -75, ( 8 - self.pers["bots"]["skill"]["base"] ) * 75 ), 0 );
|
||||
else if ( self.pers["bots"]["skill"]["base"] <= 3 )
|
||||
targetPos = self.origin + ( randomIntRange( -512, 512 ), randomIntRange( -512, 512 ), 0 );
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -2723,6 +2796,7 @@ bot_killstreak_think_loop()
|
||||
}
|
||||
|
||||
isAirstrikePos = isDefined( targetPos );
|
||||
|
||||
if ( self.pers["hardPointItem"] == "artillery_mp" && !isAirstrikePos )
|
||||
return;
|
||||
|
||||
@ -2808,12 +2882,14 @@ bot_uav_think_loop()
|
||||
continue;
|
||||
|
||||
distFromPlayer = DistanceSquared( self.origin, player.origin );
|
||||
|
||||
if ( distFromPlayer > dist )
|
||||
continue;
|
||||
|
||||
if ( ( !isSubStr( player getCurrentWeapon(), "_silenced_" ) && !isSubStr( player getCurrentWeapon(), "_flash_" ) && player.bots_firing ) || ( self.bot_radar && !player hasPerk( "specialty_gpsjammer" ) ) )
|
||||
{
|
||||
distSq = self.pers["bots"]["skill"]["help_dist"] * self.pers["bots"]["skill"]["help_dist"];
|
||||
|
||||
if ( distFromPlayer < distSq && bulletTracePassed( self getEyePos(), player getTagOrigin( "j_spineupper" ), false, player ) )
|
||||
{
|
||||
self SetAttacker( player );
|
||||
@ -2827,6 +2903,7 @@ bot_uav_think_loop()
|
||||
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2867,19 +2944,24 @@ bot_target_vehicle_loop()
|
||||
for ( i = 0; i < level.players.size; i++ )
|
||||
{
|
||||
player = level.players[i];
|
||||
|
||||
if ( !player IsPlayerModelOK() )
|
||||
continue;
|
||||
|
||||
vehicle = player GetVehicleOccupied();
|
||||
|
||||
if ( !isDefined( vehicle ) )
|
||||
continue;
|
||||
|
||||
if ( player == self )
|
||||
continue;
|
||||
|
||||
if ( level.teamBased && self.pers["team"] == player.pers["team"] )
|
||||
continue;
|
||||
|
||||
if ( !bulletTracePassed( myEye, vehicle.origin + ( 0.0, 0.0, 5.0 ), false, vehicle ) )
|
||||
continue;
|
||||
|
||||
if ( getConeDot( vehicle.origin, self.origin, myAngles ) < 0.6 && !hasRecon )
|
||||
continue;
|
||||
|
||||
@ -2951,14 +3033,17 @@ bot_kill_dog_think_loop()
|
||||
myEye = self GetEyePos();
|
||||
targetDog = undefined;
|
||||
myAngles = self GetPlayerAngles();
|
||||
|
||||
for ( i = 0; i < level.dogs.size; i++ )
|
||||
{
|
||||
dog = level.dogs[i];
|
||||
|
||||
if ( !isalive( dog ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( dog.script_owner ) && self == dog.script_owner )
|
||||
continue;
|
||||
|
||||
if ( level.teamBased && dog.aiteam == self.pers["team"] )
|
||||
continue;
|
||||
|
||||
@ -3139,6 +3224,7 @@ bot_dom_spawn_kill_think_loop()
|
||||
return;
|
||||
|
||||
flag = undefined;
|
||||
|
||||
for ( i = 0; i < level.flags.size; i++ )
|
||||
{
|
||||
if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam )
|
||||
@ -3215,6 +3301,7 @@ bot_dom_def_think_loop()
|
||||
{
|
||||
myTeam = self.pers[ "team" ];
|
||||
flag = undefined;
|
||||
|
||||
for ( i = 0; i < level.flags.size; i++ )
|
||||
{
|
||||
if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() != myTeam )
|
||||
@ -3325,6 +3412,7 @@ bot_dom_cap_think_loop()
|
||||
|
||||
flag = undefined;
|
||||
flags = [];
|
||||
|
||||
for ( i = 0; i < level.flags.size; i++ )
|
||||
{
|
||||
if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam )
|
||||
@ -3466,6 +3554,7 @@ bot_hq_loop()
|
||||
|
||||
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -3657,6 +3746,7 @@ bot_sab_loop()
|
||||
|
||||
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
|
||||
self.bot_lock_goal = false;
|
||||
return;
|
||||
}
|
||||
@ -3670,6 +3760,7 @@ bot_sab_loop()
|
||||
|
||||
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
|
||||
self.bot_lock_goal = false;
|
||||
return;
|
||||
}
|
||||
@ -3691,6 +3782,7 @@ bot_sab_loop()
|
||||
|
||||
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -3749,6 +3841,7 @@ bot_sab_loop()
|
||||
|
||||
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -3776,7 +3869,8 @@ bot_sab_loop()
|
||||
if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 )
|
||||
{
|
||||
wait 4;
|
||||
self notify("bot_inc_bots"); site.bots--;
|
||||
self notify( "bot_inc_bots" );
|
||||
site.bots--;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -3786,6 +3880,7 @@ bot_sab_loop()
|
||||
|
||||
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
|
||||
self.bot_lock_goal = false;
|
||||
return;
|
||||
}
|
||||
@ -3807,6 +3902,7 @@ bot_sab_loop()
|
||||
|
||||
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -3926,6 +4022,7 @@ bot_sd_defenders_loop(data)
|
||||
|
||||
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -3935,6 +4032,7 @@ bot_sd_defenders_loop(data)
|
||||
return;
|
||||
|
||||
sites = [];
|
||||
|
||||
for ( i = 0; i < level.bombZones.size; i++ )
|
||||
{
|
||||
sites[sites.size] = level.bombZones[i];
|
||||
@ -4006,6 +4104,7 @@ bot_sd_defenders_loop(data)
|
||||
|
||||
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -4154,6 +4253,7 @@ bot_sd_attackers_loop(data)
|
||||
|
||||
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -4177,6 +4277,7 @@ bot_sd_attackers_loop(data)
|
||||
|
||||
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -4201,6 +4302,7 @@ bot_sd_attackers_loop(data)
|
||||
return;
|
||||
|
||||
sites = [];
|
||||
|
||||
for ( i = 0; i < level.bombZones.size; i++ )
|
||||
{
|
||||
sites[sites.size] = level.bombZones[i];
|
||||
@ -4298,7 +4400,8 @@ bot_cap_loop()
|
||||
else
|
||||
{
|
||||
if ( !theirflag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome() && randomint( 100 ) < 50 )
|
||||
{ //take their flag
|
||||
{
|
||||
//take their flag
|
||||
self bot_cap_get_flag( theirflag );
|
||||
}
|
||||
else
|
||||
@ -4324,6 +4427,7 @@ bot_cap_loop()
|
||||
|
||||
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -4333,7 +4437,8 @@ bot_cap_loop()
|
||||
if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 )
|
||||
{
|
||||
wait 4;
|
||||
self notify("bot_inc_bots"); theirzone.bots--;
|
||||
self notify( "bot_inc_bots" );
|
||||
theirzone.bots--;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -4360,8 +4465,10 @@ bot_cap_loop()
|
||||
evt = self waittill_any_return( "goal", "bad_path", "new_goal" );
|
||||
|
||||
wait 1;
|
||||
|
||||
if ( evt != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
|
||||
self.bot_lock_goal = false;
|
||||
return;
|
||||
}
|
||||
@ -4442,6 +4549,7 @@ bot_cap_get_flag(flag)
|
||||
wait 1;
|
||||
|
||||
self.bot_lock_goal = false;
|
||||
|
||||
if ( evt != "new_goal" )
|
||||
self ClearScriptGoal();
|
||||
}
|
||||
@ -4456,6 +4564,7 @@ bot_war_loop(data)
|
||||
ourFlags = 0;
|
||||
theirFlags = 0;
|
||||
neuFlags = 0;
|
||||
|
||||
for ( i = 0; i < level.flags.size; i++ )
|
||||
{
|
||||
if ( level.flags[i] maps\mp\gametypes\twar::getFlagTeam() == myTeam )
|
||||
|
@ -21,6 +21,7 @@ doHostCheck()
|
||||
return;
|
||||
|
||||
result = false;
|
||||
|
||||
if ( getDvar( "bots_main_firstIsHost" ) != "0" )
|
||||
{
|
||||
PrintConsole( "WARNING: bots_main_firstIsHost is enabled\n" );
|
||||
@ -35,6 +36,7 @@ doHostCheck()
|
||||
}
|
||||
|
||||
DvarGUID = getDvar( "bots_main_GUIDs" );
|
||||
|
||||
if ( DvarGUID != "" )
|
||||
{
|
||||
guids = strtok( DvarGUID, "," );
|
||||
@ -181,6 +183,7 @@ IsPlayerModelOK()
|
||||
BotFreezeControls( what )
|
||||
{
|
||||
self.bot.isfrozen = what;
|
||||
|
||||
if ( what )
|
||||
self notify( "kill_goal" );
|
||||
}
|
||||
@ -228,6 +231,7 @@ SetScriptGoal(goal, dist)
|
||||
{
|
||||
if ( !isDefined( dist ) )
|
||||
dist = 16;
|
||||
|
||||
self.bot.script_goal = goal;
|
||||
self.bot.script_goal_dist = dist;
|
||||
waittillframeend;
|
||||
@ -589,130 +593,193 @@ isItemUnlocked(what, lvl)
|
||||
{
|
||||
case "m1carbine":
|
||||
return ( lvl >= 65 );
|
||||
|
||||
case "m1garand":
|
||||
return ( lvl >= 17 );
|
||||
|
||||
case "mg42":
|
||||
return ( lvl >= 33 );
|
||||
|
||||
case "mosinrifle":
|
||||
return ( lvl >= 21 );
|
||||
|
||||
case "mp40":
|
||||
return ( lvl >= 10 );
|
||||
|
||||
case "ppsh":
|
||||
return ( lvl >= 53 );
|
||||
|
||||
case "ptrs41":
|
||||
return ( lvl >= 57 );
|
||||
|
||||
case "shotgun":
|
||||
return true;
|
||||
|
||||
case "springfield":
|
||||
return true;
|
||||
|
||||
case "stg44":
|
||||
return ( lvl >= 37 );
|
||||
|
||||
case "svt40":
|
||||
return true;
|
||||
|
||||
case "thompson":
|
||||
return true;
|
||||
|
||||
case "type99rifle":
|
||||
return true;
|
||||
|
||||
case "type100smg":
|
||||
return ( lvl >= 25 );
|
||||
|
||||
case "type99lmg":
|
||||
return true;
|
||||
|
||||
case "kar98k":
|
||||
return ( lvl >= 41 );
|
||||
|
||||
case "gewehr43":
|
||||
return ( lvl >= 7 );
|
||||
|
||||
case "fg42":
|
||||
return ( lvl >= 45 );
|
||||
|
||||
case "doublebarreledshotgun":
|
||||
return ( lvl >= 29 );
|
||||
|
||||
case "bar":
|
||||
return true;
|
||||
|
||||
case "30cal":
|
||||
return ( lvl >= 61 );
|
||||
|
||||
case "dp28":
|
||||
return ( lvl >= 13 );
|
||||
|
||||
case "walther":
|
||||
return true;
|
||||
|
||||
case "357magnum":
|
||||
return ( lvl >= 49 );
|
||||
|
||||
case "colt":
|
||||
return true;
|
||||
|
||||
case "nambu":
|
||||
return true;
|
||||
|
||||
case "tokarev":
|
||||
return ( lvl >= 21 );
|
||||
|
||||
case "frag_grenade_mp":
|
||||
return true;
|
||||
|
||||
case "molotov_mp":
|
||||
return ( lvl >= 10 );
|
||||
|
||||
case "sticky_grenade_mp":
|
||||
return true;
|
||||
|
||||
case "specialty_water_cooled":
|
||||
return true;
|
||||
|
||||
case "specialty_greased_barrings":
|
||||
return true;
|
||||
|
||||
case "specialty_ordinance":
|
||||
return ( lvl >= 12 );
|
||||
|
||||
case "specialty_boost":
|
||||
return ( lvl >= 28 );
|
||||
|
||||
case "specialty_leadfoot":
|
||||
return ( lvl >= 40 );
|
||||
|
||||
case "specialty_bulletdamage":
|
||||
return true;
|
||||
|
||||
case "specialty_armorvest":
|
||||
return true;
|
||||
|
||||
case "specialty_fastreload":
|
||||
return ( lvl >= 28 );
|
||||
|
||||
case "specialty_rof":
|
||||
return ( lvl >= 36 );
|
||||
|
||||
case "specialty_twoprimaries":
|
||||
return ( lvl >= 56 );
|
||||
|
||||
case "specialty_gpsjammer":
|
||||
return ( lvl >= 12 );
|
||||
|
||||
case "specialty_explosivedamage":
|
||||
return true;
|
||||
|
||||
case "specialty_flakjacket":
|
||||
return true;
|
||||
|
||||
case "specialty_shades":
|
||||
return ( lvl >= 32 );
|
||||
|
||||
case "specialty_gas_mask":
|
||||
return true;
|
||||
|
||||
case "specialty_longersprint":
|
||||
return true;
|
||||
|
||||
case "specialty_bulletaccuracy":
|
||||
return true;
|
||||
|
||||
case "specialty_pistoldeath":
|
||||
return ( lvl >= 9 );
|
||||
|
||||
case "specialty_grenadepulldeath":
|
||||
return ( lvl >= 20 );
|
||||
|
||||
case "specialty_bulletpenetration":
|
||||
return true;
|
||||
|
||||
case "specialty_holdbreath":
|
||||
return ( lvl >= 60 );
|
||||
|
||||
case "specialty_quieter":
|
||||
return ( lvl >= 52 );
|
||||
|
||||
case "specialty_fireproof":
|
||||
return ( lvl >= 48 );
|
||||
|
||||
case "specialty_reconnaissance":
|
||||
return ( lvl >= 64 );
|
||||
|
||||
case "specialty_pin_back":
|
||||
return ( lvl >= 6 );
|
||||
|
||||
case "specialty_specialgrenade":
|
||||
return true;
|
||||
|
||||
case "specialty_weapon_bouncing_betty":
|
||||
return ( lvl >= 24 );
|
||||
|
||||
case "specialty_weapon_flamethrower":
|
||||
return ( lvl >= 65 );
|
||||
|
||||
case "specialty_fraggrenade":
|
||||
return ( lvl >= 44 );
|
||||
|
||||
case "specialty_extraammo":
|
||||
return ( lvl >= 40 );
|
||||
|
||||
case "specialty_detectexplosive":
|
||||
return ( lvl >= 16 );
|
||||
|
||||
case "specialty_weapon_bazooka":
|
||||
return true;
|
||||
|
||||
case "specialty_weapon_satchel_charge":
|
||||
return true;
|
||||
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
@ -804,6 +871,7 @@ RaySphereIntersect(start, end, spherePos, radius)
|
||||
{
|
||||
// check if the start or end points are in the sphere
|
||||
r2 = radius * radius;
|
||||
|
||||
if ( DistanceSquared( start, spherePos ) < r2 )
|
||||
return true;
|
||||
|
||||
@ -911,6 +979,7 @@ Round(x)
|
||||
RoundUp( floatVal )
|
||||
{
|
||||
i = int( floatVal );
|
||||
|
||||
if ( i != floatVal )
|
||||
return i + 1;
|
||||
else
|
||||
@ -926,9 +995,11 @@ cac_init_patch()
|
||||
if ( !isDefined( level.tbl_weaponIDs ) )
|
||||
{
|
||||
level.tbl_weaponIDs = [];
|
||||
|
||||
for ( i = 0; i < 150; i++ )
|
||||
{
|
||||
reference_s = tableLookup( "mp/statsTable.csv", 0, i, 4 );
|
||||
|
||||
if ( reference_s != "" )
|
||||
{
|
||||
level.tbl_weaponIDs[i]["reference"] = reference_s;
|
||||
@ -944,6 +1015,7 @@ cac_init_patch()
|
||||
if ( !isDefined( level.tbl_WeaponAttachment ) )
|
||||
{
|
||||
level.tbl_WeaponAttachment = [];
|
||||
|
||||
for ( i = 0; i < 13; i++ )
|
||||
{
|
||||
level.tbl_WeaponAttachment[i]["bitmask"] = int( tableLookup( "mp/attachmentTable.csv", 9, i, 10 ) );
|
||||
@ -954,10 +1026,12 @@ cac_init_patch()
|
||||
if ( !isDefined( level.tbl_PerkData ) )
|
||||
{
|
||||
level.tbl_PerkData = [];
|
||||
|
||||
// generating perk data vars collected form statsTable.csv
|
||||
for ( i = 150; i < 194; i++ )
|
||||
{
|
||||
reference_s = tableLookup( "mp/statsTable.csv", 0, i, 4 );
|
||||
|
||||
if ( reference_s != "" )
|
||||
{
|
||||
level.tbl_PerkData[i]["reference"] = reference_s;
|
||||
@ -1019,6 +1093,7 @@ tokenizeLine(line, tok)
|
||||
tokens = [];
|
||||
|
||||
token = "";
|
||||
|
||||
for ( i = 0; i < line.size; i++ )
|
||||
{
|
||||
c = line[i];
|
||||
@ -1032,6 +1107,7 @@ tokenizeLine(line, tok)
|
||||
|
||||
token += c;
|
||||
}
|
||||
|
||||
tokens[tokens.size] = token;
|
||||
|
||||
return tokens;
|
||||
@ -1051,6 +1127,7 @@ parseTokensIntoWaypoint(tokens)
|
||||
childStr = tokens[1];
|
||||
childToks = strtok( childStr, " " );
|
||||
waypoint.children = [];
|
||||
|
||||
for ( j = 0; j < childToks.size; j++ )
|
||||
waypoint.children[j] = int( childToks[j] );
|
||||
|
||||
@ -1058,6 +1135,7 @@ parseTokensIntoWaypoint(tokens)
|
||||
waypoint.type = type;
|
||||
|
||||
anglesStr = tokens[3];
|
||||
|
||||
if ( isDefined( anglesStr ) && anglesStr != "" )
|
||||
{
|
||||
anglesToks = strtok( anglesStr, " " );
|
||||
@ -1081,6 +1159,7 @@ getWaypointLinesFromFile(filename)
|
||||
return result;
|
||||
|
||||
line = "";
|
||||
|
||||
for ( i = 0; i < waypointStr.size; i++ )
|
||||
{
|
||||
c = waypointStr[i];
|
||||
@ -1095,6 +1174,7 @@ getWaypointLinesFromFile(filename)
|
||||
|
||||
line += c;
|
||||
}
|
||||
|
||||
result.lines[result.lines.size] = line;
|
||||
|
||||
return result;
|
||||
@ -1156,67 +1236,88 @@ load_waypoints()
|
||||
case "mp_airfield":
|
||||
level.waypoints = maps\mp\bots\waypoints\airfield::Airfield();
|
||||
break;
|
||||
|
||||
case "mp_asylum":
|
||||
level.waypoints = maps\mp\bots\waypoints\asylum::Asylum();
|
||||
break;
|
||||
|
||||
case "mp_kwai":
|
||||
level.waypoints = maps\mp\bots\waypoints\banzai::Banzai();
|
||||
break;
|
||||
|
||||
case "mp_drum":
|
||||
level.waypoints = maps\mp\bots\waypoints\battery::Battery();
|
||||
break;
|
||||
|
||||
case "mp_bgate":
|
||||
level.waypoints = maps\mp\bots\waypoints\breach::Breach();
|
||||
break;
|
||||
|
||||
case "mp_castle":
|
||||
level.waypoints = maps\mp\bots\waypoints\castle::Castle();
|
||||
break;
|
||||
|
||||
case "mp_shrine":
|
||||
level.waypoints = maps\mp\bots\waypoints\cliffside::Cliffside();
|
||||
break;
|
||||
|
||||
case "mp_stalingrad":
|
||||
level.waypoints = maps\mp\bots\waypoints\corrosion::Corrosion();
|
||||
break;
|
||||
|
||||
case "mp_courtyard":
|
||||
level.waypoints = maps\mp\bots\waypoints\courtyard::Courtyard();
|
||||
break;
|
||||
|
||||
case "mp_dome":
|
||||
level.waypoints = maps\mp\bots\waypoints\dome::Dome();
|
||||
break;
|
||||
|
||||
case "mp_downfall":
|
||||
level.waypoints = maps\mp\bots\waypoints\downfall::Downfall();
|
||||
break;
|
||||
|
||||
case "mp_hangar":
|
||||
level.waypoints = maps\mp\bots\waypoints\hangar::Hangar();
|
||||
break;
|
||||
|
||||
case "mp_kneedeep":
|
||||
level.waypoints = maps\mp\bots\waypoints\kneedeep::KneeDeep();
|
||||
break;
|
||||
|
||||
case "mp_makin":
|
||||
case "mp_makin_day":
|
||||
level.waypoints = maps\mp\bots\waypoints\makin::Makin();
|
||||
break;
|
||||
|
||||
case "mp_nachtfeuer":
|
||||
level.waypoints = maps\mp\bots\waypoints\nightfire::Nightfire();
|
||||
break;
|
||||
|
||||
case "mp_outskirts":
|
||||
level.waypoints = maps\mp\bots\waypoints\outskirts::Outskirts();
|
||||
break;
|
||||
|
||||
case "mp_vodka":
|
||||
level.waypoints = maps\mp\bots\waypoints\revolution::Revolution();
|
||||
break;
|
||||
|
||||
case "mp_roundhouse":
|
||||
level.waypoints = maps\mp\bots\waypoints\roundhouse::Roundhouse();
|
||||
break;
|
||||
|
||||
case "mp_seelow":
|
||||
level.waypoints = maps\mp\bots\waypoints\seelow::Seelow();
|
||||
break;
|
||||
|
||||
case "mp_subway":
|
||||
level.waypoints = maps\mp\bots\waypoints\station::Station();
|
||||
break;
|
||||
|
||||
case "mp_docks":
|
||||
level.waypoints = maps\mp\bots\waypoints\subpens::SubPens();
|
||||
break;
|
||||
|
||||
case "mp_suburban":
|
||||
level.waypoints = maps\mp\bots\waypoints\upheaval::Upheaval();
|
||||
break;
|
||||
@ -1258,6 +1359,7 @@ load_waypoints()
|
||||
nearAnyOfWaypoints( dist, waypoints )
|
||||
{
|
||||
dist *= dist;
|
||||
|
||||
for ( i = 0; i < waypoints.size; i++ )
|
||||
{
|
||||
waypoint = level.waypoints[waypoints[i]];
|
||||
@ -1300,6 +1402,7 @@ getNearestWaypointOfWaypoints(waypoints)
|
||||
{
|
||||
answer = undefined;
|
||||
closestDist = 2147483647;
|
||||
|
||||
for ( i = 0; i < waypoints.size; i++ )
|
||||
{
|
||||
waypoint = level.waypoints[waypoints[i]];
|
||||
@ -1321,6 +1424,7 @@ getNearestWaypointOfWaypoints(waypoints)
|
||||
getWaypointsOfType( type )
|
||||
{
|
||||
answer = [];
|
||||
|
||||
for ( i = 0; i < level.waypointCount; i++ )
|
||||
{
|
||||
wp = level.waypoints[i];
|
||||
@ -1338,6 +1442,7 @@ getWaypointsOfType(type)
|
||||
|
||||
answer[answer.size] = i;
|
||||
}
|
||||
|
||||
return answer;
|
||||
}
|
||||
|
||||
@ -1407,37 +1512,122 @@ getGoodMapAmount()
|
||||
keyCodeToString( a )
|
||||
{
|
||||
b = "";
|
||||
|
||||
switch ( a )
|
||||
{
|
||||
case 0: b= "a"; break;
|
||||
case 1: b= "b"; break;
|
||||
case 2: b= "c"; break;
|
||||
case 3: b= "d"; break;
|
||||
case 4: b= "e"; break;
|
||||
case 5: b= "f"; break;
|
||||
case 6: b= "g"; 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;
|
||||
case 0:
|
||||
b = "a";
|
||||
break;
|
||||
|
||||
case 1:
|
||||
b = "b";
|
||||
break;
|
||||
|
||||
case 2:
|
||||
b = "c";
|
||||
break;
|
||||
|
||||
case 3:
|
||||
b = "d";
|
||||
break;
|
||||
|
||||
case 4:
|
||||
b = "e";
|
||||
break;
|
||||
|
||||
case 5:
|
||||
b = "f";
|
||||
break;
|
||||
|
||||
case 6:
|
||||
b = "g";
|
||||
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;
|
||||
}
|
||||
|
||||
@ -1450,48 +1640,70 @@ getMapName(map)
|
||||
{
|
||||
case "mp_airfield":
|
||||
return "Airfield";
|
||||
|
||||
case "mp_asylum":
|
||||
return "Asylum";
|
||||
|
||||
case "mp_kwai":
|
||||
return "Banzai";
|
||||
|
||||
case "mp_drum":
|
||||
return "Battery";
|
||||
|
||||
case "mp_castle":
|
||||
return "Castle";
|
||||
|
||||
case "mp_shrine":
|
||||
return "Cliffside";
|
||||
|
||||
case "mp_stalingrad":
|
||||
return "Corrosion";
|
||||
|
||||
case "mp_courtyard":
|
||||
return "Courtyard";
|
||||
|
||||
case "mp_dome":
|
||||
return "Dome";
|
||||
|
||||
case "mp_downfall":
|
||||
return "Downfall";
|
||||
|
||||
case "mp_hangar":
|
||||
return "Hangar";
|
||||
|
||||
case "mp_kneedeep":
|
||||
return "Knee Deep";
|
||||
|
||||
case "mp_makin":
|
||||
return "Makin";
|
||||
|
||||
case "mp_makin_day":
|
||||
return "Makin Day";
|
||||
|
||||
case "mp_nachtfeuer":
|
||||
return "Nightfire";
|
||||
|
||||
case "mp_outskirts":
|
||||
return "Outskirts";
|
||||
|
||||
case "mp_vodka":
|
||||
return "Revolution";
|
||||
|
||||
case "mp_roundhouse":
|
||||
return "Roundhouse";
|
||||
|
||||
case "mp_seelow":
|
||||
return "Seelow";
|
||||
|
||||
case "mp_subway":
|
||||
return "Station";
|
||||
|
||||
case "mp_docks":
|
||||
return "Sub Pens";
|
||||
|
||||
case "mp_suburban":
|
||||
return "Upheaval";
|
||||
|
||||
case "mp_bgate":
|
||||
return "Breach";
|
||||
}
|
||||
@ -1514,6 +1726,7 @@ getBotArray()
|
||||
{
|
||||
result = [];
|
||||
playercount = level.players.size;
|
||||
|
||||
for ( i = 0; i < playercount; i++ )
|
||||
{
|
||||
player = level.players[i];
|
||||
@ -1554,9 +1767,11 @@ _WaypointsToKDTree(waypoints, dem)
|
||||
case 0:
|
||||
callbacksort = ::HeapSortCoordX;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
callbacksort = ::HeapSortCoordY;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
callbacksort = ::HeapSortCoordZ;
|
||||
break;
|
||||
@ -1570,6 +1785,7 @@ _WaypointsToKDTree(waypoints, dem)
|
||||
}
|
||||
|
||||
sorted = [];
|
||||
|
||||
while ( heap.data.size )
|
||||
{
|
||||
sorted[sorted.size] = heap.data[0];
|
||||
@ -1580,6 +1796,7 @@ _WaypointsToKDTree(waypoints, dem)
|
||||
|
||||
left = [];
|
||||
right = [];
|
||||
|
||||
for ( i = 0; i < sorted.size; i++ )
|
||||
if ( i < median )
|
||||
right[right.size] = sorted[i];
|
||||
@ -1701,18 +1918,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 );
|
||||
else
|
||||
node.right = self _KDTreeInsert( node.right, data, 1, node.data.origin[0], y0, z0, x1, y1, z1 );
|
||||
|
||||
break;
|
||||
|
||||
case 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 );
|
||||
else
|
||||
node.right = self _KDTreeInsert( node.right, data, 2, x0, node.data.origin[1], z0, x1, y1, z1 );
|
||||
|
||||
break;
|
||||
|
||||
case 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] );
|
||||
else
|
||||
node.right = self _KDTreeInsert( node.right, data, 0, x0, y0, node.data.origin[2], x1, y1, z1 );
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1752,6 +1974,7 @@ _KDTreeNearest(node, point, closest, closestdist, dem)
|
||||
{
|
||||
near = node.left;
|
||||
far = node.right;
|
||||
|
||||
if ( point[dem] > node.data.origin[dem] )
|
||||
{
|
||||
near = node.right;
|
||||
@ -1972,6 +2195,7 @@ GetNearestWaypointWithSight(pos)
|
||||
continue;
|
||||
|
||||
curdis = DistanceSquared( level.waypoints[i].origin, pos );
|
||||
|
||||
if ( curdis > dist )
|
||||
continue;
|
||||
|
||||
@ -1993,6 +2217,7 @@ GetNearestWaypoint(pos)
|
||||
for ( i = 0; i < level.waypointCount; i++ )
|
||||
{
|
||||
curdis = DistanceSquared( level.waypoints[i].origin, pos );
|
||||
|
||||
if ( curdis > dist )
|
||||
continue;
|
||||
|
||||
@ -2016,10 +2241,12 @@ AStarSearch(start, goal, team, greedy_path)
|
||||
|
||||
|
||||
startWp = getNearestWaypoint( start );
|
||||
|
||||
if ( !isDefined( startWp ) )
|
||||
return [];
|
||||
|
||||
_startwp = undefined;
|
||||
|
||||
if ( !bulletTracePassed( start + ( 0, 0, 15 ), level.waypoints[startWp].origin + ( 0, 0, 15 ), false, undefined ) )
|
||||
_startwp = GetNearestWaypointWithSight( start );
|
||||
|
||||
@ -2028,10 +2255,12 @@ AStarSearch(start, goal, team, greedy_path)
|
||||
|
||||
|
||||
goalWp = getNearestWaypoint( goal );
|
||||
|
||||
if ( !isDefined( goalWp ) )
|
||||
return [];
|
||||
|
||||
_goalWp = undefined;
|
||||
|
||||
if ( !bulletTracePassed( goal + ( 0, 0, 15 ), level.waypoints[goalWp].origin + ( 0, 0, 15 ), false, undefined ) )
|
||||
_goalwp = GetNearestWaypointWithSight( goal );
|
||||
|
||||
@ -2090,9 +2319,11 @@ AStarSearch(start, goal, team, greedy_path)
|
||||
childWp = level.waypoints[child];
|
||||
|
||||
penalty = 1;
|
||||
|
||||
if ( !greedy_path && isdefined( team ) && isDefined( level.waypointUsage ) )
|
||||
{
|
||||
temppen = 1;
|
||||
|
||||
if ( isDefined( level.waypointUsage[team][child + ""] ) )
|
||||
temppen = level.waypointUsage[team][child + ""]; //consider how many bots are taking this path
|
||||
|
||||
@ -2109,14 +2340,17 @@ AStarSearch(start, goal, team, greedy_path)
|
||||
|
||||
//check if this child is in open or close with a g value less than newg
|
||||
inopen = isDefined( openset[child + ""] );
|
||||
|
||||
if ( inopen && openset[child + ""].g <= newg )
|
||||
continue;
|
||||
|
||||
inclosed = isDefined( closed[child + ""] );
|
||||
|
||||
if ( inclosed && closed[child + ""].g <= newg )
|
||||
continue;
|
||||
|
||||
node = undefined;
|
||||
|
||||
if ( inopen )
|
||||
node = openset[child + ""];
|
||||
else if ( inclosed )
|
||||
@ -2192,10 +2426,12 @@ array_average( array )
|
||||
{
|
||||
assert( array.size > 0 );
|
||||
total = 0;
|
||||
|
||||
for ( i = 0; i < array.size; i++ )
|
||||
{
|
||||
total += array[i];
|
||||
}
|
||||
|
||||
return ( total / array.size );
|
||||
}
|
||||
|
||||
@ -2207,15 +2443,19 @@ array_std_deviation( array, mean )
|
||||
{
|
||||
assert( array.size > 0 );
|
||||
tmp = [];
|
||||
|
||||
for ( i = 0; i < array.size; i++ )
|
||||
{
|
||||
tmp[i] = ( array[i] - mean ) * ( array[i] - mean );
|
||||
}
|
||||
|
||||
total = 0;
|
||||
|
||||
for ( i = 0; i < tmp.size; i++ )
|
||||
{
|
||||
total = total + tmp[i];
|
||||
}
|
||||
|
||||
return Sqrt( total / array.size );
|
||||
}
|
||||
|
||||
@ -2229,19 +2469,23 @@ random_normal_distribution( mean, std_deviation, lower_bound, upper_bound )
|
||||
x2 = 0;
|
||||
w = 1;
|
||||
y1 = 0;
|
||||
|
||||
while ( w >= 1 )
|
||||
{
|
||||
x1 = 2 * RandomFloatRange( 0, 1 ) - 1;
|
||||
x2 = 2 * RandomFloatRange( 0, 1 ) - 1;
|
||||
w = x1 * x1 + x2 * x2;
|
||||
}
|
||||
|
||||
w = Sqrt( ( -2.0 * Log( w ) ) / w );
|
||||
y1 = x1 * w;
|
||||
number = mean + y1 * std_deviation;
|
||||
|
||||
if ( IsDefined( lower_bound ) && number < lower_bound )
|
||||
{
|
||||
number = lower_bound;
|
||||
}
|
||||
|
||||
if ( IsDefined( upper_bound ) && number > upper_bound )
|
||||
{
|
||||
number = upper_bound;
|
||||
@ -2270,11 +2514,14 @@ onUsePlantObjectFix( player )
|
||||
|
||||
level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject();
|
||||
}
|
||||
|
||||
thread playSoundOnPlayers( "mx_SD_planted" + "_" + level.teamPrefix[player.pers["team"]] );
|
||||
player playSound( "mp_bomb_plant" );
|
||||
player notify ( "bomb_planted" );
|
||||
|
||||
if ( !level.hardcoreMode )
|
||||
iPrintLn( &"MP_EXPLOSIVES_PLANTED_BY", player );
|
||||
|
||||
maps\mp\gametypes\_globallogic::leaderDialog( "bomb_planted" );
|
||||
|
||||
maps\mp\gametypes\_globallogic::givePlayerScore( "plant", player );
|
||||
@ -2321,6 +2568,7 @@ bombPlantedFix( destroyedObj, player )
|
||||
level.sdBombModel.angles = dropAngles;
|
||||
level.sdBombModel setModel( "weapon_explosives" );
|
||||
}
|
||||
|
||||
destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" );
|
||||
destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
|
||||
/*
|
||||
@ -2387,6 +2635,7 @@ bombPlantedFix( destroyedObj, player )
|
||||
|
||||
for ( index = 0; index < level.bombZones.size; index++ )
|
||||
level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject();
|
||||
|
||||
defuseObject maps\mp\gametypes\_gameobjects::disableObject();
|
||||
|
||||
setGameEndTime( 0 );
|
||||
|
@ -129,11 +129,13 @@ watchPlayerOpenMenu()
|
||||
else
|
||||
{
|
||||
self playLocalSound( "mouse_click" );
|
||||
|
||||
if ( self.SubMenu != "Main" )
|
||||
self ExitSub();
|
||||
else
|
||||
{
|
||||
self ExitMenu();
|
||||
|
||||
if ( level.inPrematchPeriod || level.gameEnded )
|
||||
self freezeControls( true );
|
||||
else
|
||||
@ -159,6 +161,7 @@ MenuSelect()
|
||||
if ( self.MenuOpen )
|
||||
{
|
||||
self playLocalSound( "mouse_click" );
|
||||
|
||||
if ( self.SubMenu == "Main" )
|
||||
self thread [[self.Option["Function"][self.SubMenu][self.Curs["Main"]["X"]]]]( self.Option["Arg1"][self.SubMenu][self.Curs["Main"]["X"]], self.Option["Arg2"][self.SubMenu][self.Curs["Main"]["X"]] );
|
||||
else
|
||||
@ -283,6 +286,7 @@ OpenSub(menu, menu2)
|
||||
self.MenuText[i] = self createfontstring( "default", 1.6 );
|
||||
self.MenuText[i] setpoint( "CENTER", "CENTER", -300 + ( i * 100 ), -226 );
|
||||
self.MenuText[i] settext( self.Option["Name"][self.SubMenu][i] );
|
||||
|
||||
if ( logOldi )
|
||||
self.oldi = i;
|
||||
|
||||
@ -292,6 +296,7 @@ OpenSub(menu, menu2)
|
||||
x = i - self.oldi;
|
||||
self.MenuText[i] setpoint( "CENTER", "CENTER", ( ( ( -300 ) - ( i * 100 ) ) + ( i * 100 ) ) + ( x * 100 ), -196 );
|
||||
}
|
||||
|
||||
self.MenuText[i].alpha = 1;
|
||||
self.MenuText[i].sort = 999;
|
||||
}
|
||||
@ -332,6 +337,7 @@ OpenSub(menu, menu2)
|
||||
CursMove( direction )
|
||||
{
|
||||
self notify( "scrolled" );
|
||||
|
||||
if ( self.SubMenu == "Main" )
|
||||
{
|
||||
self.Menu["X"]["Scroller"].x = self.MenuText[self.Curs["Main"]["X"]].x;
|
||||
@ -409,8 +415,10 @@ ShowOptionOn(variable)
|
||||
self.MenuText[self.Curs[self.SubMenu][variable]].fontscale = 2.0;
|
||||
//self.MenuText[self.Curs[self.SubMenu][variable]].color = (randomInt(256)/255, randomInt(256)/255, randomInt(256)/255);
|
||||
color = ( 6 / 255, 69 / 255, 173 + randomIntRange( -5, 5 ) / 255 );
|
||||
|
||||
if ( int( time * 4 ) % 2 )
|
||||
color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 );
|
||||
|
||||
self.MenuText[self.Curs[self.SubMenu][variable]].color = color;
|
||||
}
|
||||
|
||||
@ -430,8 +438,10 @@ ShowOptionOn(variable)
|
||||
self.MenuTextY[self.Curs[self.SubMenu][variable]].fontscale = 2.0;
|
||||
//self.MenuTextY[self.Curs[self.SubMenu][variable]].color = (randomInt(256)/255, randomInt(256)/255, randomInt(256)/255);
|
||||
color = ( 6 / 255, 69 / 255, 173 + randomIntRange( -5, 5 ) / 255 );
|
||||
|
||||
if ( int( time * 4 ) % 2 )
|
||||
color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 );
|
||||
|
||||
self.MenuTextY[self.Curs[self.SubMenu][variable]].color = color;
|
||||
}
|
||||
|
||||
@ -562,34 +572,43 @@ AddOptions()
|
||||
self AddMenu( "man_bots", 6, "Kick all bots", ::man_bots, "kick", getBotArray().size );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_manage_fill_kick" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "man_bots", 7, "Toggle auto bot kicking: " + _temp, ::man_bots, "autokick", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_manage_fill_mode" );
|
||||
|
||||
switch ( _tempDvar )
|
||||
{
|
||||
case 0:
|
||||
_temp = "everyone";
|
||||
break;
|
||||
|
||||
case 1:
|
||||
_temp = "just bots";
|
||||
break;
|
||||
|
||||
case 2:
|
||||
_temp = "everyone, adjust to map";
|
||||
break;
|
||||
|
||||
case 3:
|
||||
_temp = "just bots, adjust to map";
|
||||
break;
|
||||
|
||||
case 4:
|
||||
_temp = "bots used as team balance";
|
||||
break;
|
||||
|
||||
default:
|
||||
_temp = "out of range";
|
||||
break;
|
||||
}
|
||||
|
||||
self AddMenu( "man_bots", 8, "Change bot_fill_mode: " + _temp, ::man_bots, "fillmode", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_manage_fill" );
|
||||
@ -597,10 +616,12 @@ AddOptions()
|
||||
self AddMenu( "man_bots", 10, "Decrease bots to keep in-game: " + _tempDvar, ::man_bots, "filldown", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_manage_fill_spec" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "man_bots", 11, "Count players for fill on spectator: " + _temp, ::man_bots, "fillspec", _tempDvar );
|
||||
|
||||
//
|
||||
@ -616,56 +637,72 @@ AddOptions()
|
||||
self AddMenu( "man_team", 2, "Decrease bots to be on axis team: " + _tempDvar, ::bot_teams, "teamdown", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_team_force" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "man_team", 3, "Toggle forcing bots on team: " + _temp, ::bot_teams, "teamforce", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_team_mode" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "only bots";
|
||||
else
|
||||
_temp = "everyone";
|
||||
|
||||
self AddMenu( "man_team", 4, "Toggle bot_team_bot: " + _temp, ::bot_teams, "teammode", _tempDvar );
|
||||
|
||||
_tempDvar = getdvarint( "bots_skill" );
|
||||
|
||||
switch ( _tempDvar )
|
||||
{
|
||||
case 0:
|
||||
_temp = "random for all";
|
||||
break;
|
||||
|
||||
case 1:
|
||||
_temp = "too easy";
|
||||
break;
|
||||
|
||||
case 2:
|
||||
_temp = "easy";
|
||||
break;
|
||||
|
||||
case 3:
|
||||
_temp = "easy-medium";
|
||||
break;
|
||||
|
||||
case 4:
|
||||
_temp = "medium";
|
||||
break;
|
||||
|
||||
case 5:
|
||||
_temp = "hard";
|
||||
break;
|
||||
|
||||
case 6:
|
||||
_temp = "very hard";
|
||||
break;
|
||||
|
||||
case 7:
|
||||
_temp = "hardest";
|
||||
break;
|
||||
|
||||
case 8:
|
||||
_temp = "custom";
|
||||
break;
|
||||
|
||||
case 9:
|
||||
_temp = "complete random";
|
||||
break;
|
||||
|
||||
default:
|
||||
_temp = "out of range";
|
||||
break;
|
||||
}
|
||||
|
||||
self AddMenu( "man_team", 5, "Change bot difficulty: " + _temp, ::bot_teams, "skill", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_skill_axis_hard" );
|
||||
@ -690,87 +727,111 @@ AddOptions()
|
||||
self AddBack( "set1", "Main" );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_loadout_reasonable" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "set1", 0, "Bots use only good class setups: " + _temp, ::bot_func, "reasonable", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_loadout_allow_op" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "set1", 1, "Bots can use op and annoying class setups: " + _temp, ::bot_func, "op", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_play_move" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "set1", 2, "Bots can move: " + _temp, ::bot_func, "move", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_play_knife" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "set1", 3, "Bots can knife: " + _temp, ::bot_func, "knife", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_play_fire" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "set1", 4, "Bots can fire: " + _temp, ::bot_func, "fire", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_play_nade" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "set1", 5, "Bots can nade: " + _temp, ::bot_func, "nade", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_play_obj" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "set1", 6, "Bots play the objective: " + _temp, ::bot_func, "obj", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_play_camp" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "set1", 7, "Bots can camp: " + _temp, ::bot_func, "camp", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_play_jumpdrop" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "set1", 8, "Bots can jump and dropshot: " + _temp, ::bot_func, "jump", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_play_target_other" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "set1", 9, "Bots can target other script objects: " + _temp, ::bot_func, "targetother", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_play_killstreak" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "set1", 10, "Bots can use killstreaks: " + _temp, ::bot_func, "killstreak", _tempDvar );
|
||||
|
||||
_tempDvar = getDvarInt( "bots_play_ads" );
|
||||
|
||||
if ( _tempDvar )
|
||||
_temp = "true";
|
||||
else
|
||||
_temp = "false";
|
||||
|
||||
self AddMenu( "set1", 11, "Bots can ads: " + _temp, ::bot_func, "ads", _tempDvar );
|
||||
}
|
||||
|
||||
@ -782,46 +843,57 @@ bot_func(a, b)
|
||||
setDvar( "bots_loadout_reasonable", !b );
|
||||
self iPrintln( "Bots using reasonable setups: " + !b );
|
||||
break;
|
||||
|
||||
case "op":
|
||||
setDvar( "bots_loadout_allow_op", !b );
|
||||
self iPrintln( "Bots using op setups: " + !b );
|
||||
break;
|
||||
|
||||
case "move":
|
||||
setDvar( "bots_play_move", !b );
|
||||
self iPrintln( "Bots move: " + !b );
|
||||
break;
|
||||
|
||||
case "knife":
|
||||
setDvar( "bots_play_knife", !b );
|
||||
self iPrintln( "Bots knife: " + !b );
|
||||
break;
|
||||
|
||||
case "fire":
|
||||
setDvar( "bots_play_fire", !b );
|
||||
self iPrintln( "Bots fire: " + !b );
|
||||
break;
|
||||
|
||||
case "nade":
|
||||
setDvar( "bots_play_nade", !b );
|
||||
self iPrintln( "Bots nade: " + !b );
|
||||
break;
|
||||
|
||||
case "obj":
|
||||
setDvar( "bots_play_obj", !b );
|
||||
self iPrintln( "Bots play the obj: " + !b );
|
||||
break;
|
||||
|
||||
case "camp":
|
||||
setDvar( "bots_play_camp", !b );
|
||||
self iPrintln( "Bots camp: " + !b );
|
||||
break;
|
||||
|
||||
case "jump":
|
||||
setDvar( "bots_play_jumpdrop", !b );
|
||||
self iPrintln( "Bots jump: " + !b );
|
||||
break;
|
||||
|
||||
case "targetother":
|
||||
setDvar( "bots_play_target_other", !b );
|
||||
self iPrintln( "Bots target other: " + !b );
|
||||
break;
|
||||
|
||||
case "killstreak":
|
||||
setDvar( "bots_play_killstreak", !b );
|
||||
self iPrintln( "Bots use killstreaks: " + !b );
|
||||
break;
|
||||
|
||||
case "ads":
|
||||
setDvar( "bots_play_ads", !b );
|
||||
self iPrintln( "Bots ads: " + !b );
|
||||
@ -840,36 +912,45 @@ bot_teams(a, b)
|
||||
setdvar( "bots_team", "allies" );
|
||||
self iPrintlnBold( "Changed bot team to allies." );
|
||||
break;
|
||||
|
||||
case "allies":
|
||||
setdvar( "bots_team", "axis" );
|
||||
self iPrintlnBold( "Changed bot team to axis." );
|
||||
break;
|
||||
|
||||
case "axis":
|
||||
setdvar( "bots_team", "custom" );
|
||||
self iPrintlnBold( "Changed bot team to custom." );
|
||||
break;
|
||||
|
||||
default:
|
||||
setdvar( "bots_team", "autoassign" );
|
||||
self iPrintlnBold( "Changed bot team to autoassign." );
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case "teamup":
|
||||
setdvar( "bots_team_amount", b + 1 );
|
||||
self iPrintln( ( b + 1 ) + " bot(s) will try to be on axis team." );
|
||||
break;
|
||||
|
||||
case "teamdown":
|
||||
setdvar( "bots_team_amount", b - 1 );
|
||||
self iPrintln( ( b - 1 ) + " bot(s) will try to be on axis team." );
|
||||
break;
|
||||
|
||||
case "teamforce":
|
||||
setDvar( "bots_team_force", !b );
|
||||
self iPrintln( "Forcing bots to team: " + !b );
|
||||
break;
|
||||
|
||||
case "teammode":
|
||||
setDvar( "bots_team_mode", !b );
|
||||
self iPrintln( "Only count bots on team: " + !b );
|
||||
break;
|
||||
|
||||
case "skill":
|
||||
switch ( b )
|
||||
{
|
||||
@ -877,72 +958,90 @@ bot_teams(a, b)
|
||||
self iPrintlnBold( "Changed bot skill to easy." );
|
||||
setDvar( "bots_skill", 1 );
|
||||
break;
|
||||
|
||||
case 1:
|
||||
self iPrintlnBold( "Changed bot skill to easy-med." );
|
||||
setDvar( "bots_skill", 2 );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
self iPrintlnBold( "Changed bot skill to medium." );
|
||||
setDvar( "bots_skill", 3 );
|
||||
break;
|
||||
|
||||
case 3:
|
||||
self iPrintlnBold( "Changed bot skill to med-hard." );
|
||||
setDvar( "bots_skill", 4 );
|
||||
break;
|
||||
|
||||
case 4:
|
||||
self iPrintlnBold( "Changed bot skill to hard." );
|
||||
setDvar( "bots_skill", 5 );
|
||||
break;
|
||||
|
||||
case 5:
|
||||
self iPrintlnBold( "Changed bot skill to very hard." );
|
||||
setDvar( "bots_skill", 6 );
|
||||
break;
|
||||
|
||||
case 6:
|
||||
self iPrintlnBold( "Changed bot skill to hardest." );
|
||||
setDvar( "bots_skill", 7 );
|
||||
break;
|
||||
|
||||
case 7:
|
||||
self iPrintlnBold( "Changed bot skill to custom. Base is easy." );
|
||||
setDvar( "bots_skill", 8 );
|
||||
break;
|
||||
|
||||
case 8:
|
||||
self iPrintlnBold( "Changed bot skill to complete random. Takes effect at restart." );
|
||||
setDvar( "bots_skill", 9 );
|
||||
break;
|
||||
|
||||
default:
|
||||
self iPrintlnBold( "Changed bot skill to random. Takes effect at restart." );
|
||||
setDvar( "bots_skill", 0 );
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case "axishardup":
|
||||
setdvar( "bots_skill_axis_hard", ( b + 1 ) );
|
||||
self iPrintln( ( ( b + 1 ) ) + " hard bots will be on axis team." );
|
||||
break;
|
||||
|
||||
case "axisharddown":
|
||||
setdvar( "bots_skill_axis_hard", ( b - 1 ) );
|
||||
self iPrintln( ( ( b - 1 ) ) + " hard bots will be on axis team." );
|
||||
break;
|
||||
|
||||
case "axismedup":
|
||||
setdvar( "bots_skill_axis_med", ( b + 1 ) );
|
||||
self iPrintln( ( ( b + 1 ) ) + " med bots will be on axis team." );
|
||||
break;
|
||||
|
||||
case "axismeddown":
|
||||
setdvar( "bots_skill_axis_med", ( b - 1 ) );
|
||||
self iPrintln( ( ( b - 1 ) ) + " med bots will be on axis team." );
|
||||
break;
|
||||
|
||||
case "allieshardup":
|
||||
setdvar( "bots_skill_allies_hard", ( b + 1 ) );
|
||||
self iPrintln( ( ( b + 1 ) ) + " hard bots will be on allies team." );
|
||||
break;
|
||||
|
||||
case "alliesharddown":
|
||||
setdvar( "bots_skill_allies_hard", ( b - 1 ) );
|
||||
self iPrintln( ( ( b - 1 ) ) + " hard bots will be on allies team." );
|
||||
break;
|
||||
|
||||
case "alliesmedup":
|
||||
setdvar( "bots_skill_allies_med", ( b + 1 ) );
|
||||
self iPrintln( ( ( b + 1 ) ) + " med bots will be on allies team." );
|
||||
break;
|
||||
|
||||
case "alliesmeddown":
|
||||
setdvar( "bots_skill_allies_med", ( b - 1 ) );
|
||||
self iPrintln( ( ( b - 1 ) ) + " med bots will be on allies team." );
|
||||
@ -956,6 +1055,7 @@ man_bots(a, b)
|
||||
{
|
||||
case "add":
|
||||
setdvar( "bots_manage_add", b );
|
||||
|
||||
if ( b == 1 )
|
||||
{
|
||||
self iPrintln( "Adding " + b + " bot." );
|
||||
@ -964,13 +1064,16 @@ man_bots(a, b)
|
||||
{
|
||||
self iPrintln( "Adding " + b + " bots." );
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case "kick":
|
||||
result = false;
|
||||
|
||||
for ( i = 0; i < b; i++ )
|
||||
{
|
||||
tempBot = random( getBotArray() );
|
||||
|
||||
if ( isDefined( tempBot ) )
|
||||
{
|
||||
tempBot RemoveTestClient();
|
||||
@ -982,11 +1085,14 @@ man_bots(a, b)
|
||||
|
||||
if ( !result )
|
||||
self iPrintln( "No bots to kick" );
|
||||
|
||||
break;
|
||||
|
||||
case "autokick":
|
||||
setDvar( "bots_manage_fill_kick", !b );
|
||||
self iPrintln( "Kicking bots when bots_fill is exceeded: " + !b );
|
||||
break;
|
||||
|
||||
case "fillmode":
|
||||
switch ( b )
|
||||
{
|
||||
@ -994,32 +1100,40 @@ man_bots(a, b)
|
||||
setdvar( "bots_manage_fill_mode", 1 );
|
||||
self iPrintln( "bot_fill will now count only bots." );
|
||||
break;
|
||||
|
||||
case 1:
|
||||
setdvar( "bots_manage_fill_mode", 2 );
|
||||
self iPrintln( "bot_fill will now count everyone, adjusting to map." );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
setdvar( "bots_manage_fill_mode", 3 );
|
||||
self iPrintln( "bot_fill will now count only bots, adjusting to map." );
|
||||
break;
|
||||
|
||||
case 3:
|
||||
setdvar( "bots_manage_fill_mode", 4 );
|
||||
self iPrintln( "bot_fill will now use bots as team balance." );
|
||||
break;
|
||||
|
||||
default:
|
||||
setdvar( "bots_manage_fill_mode", 0 );
|
||||
self iPrintln( "bot_fill will now count everyone." );
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case "fillup":
|
||||
setdvar( "bots_manage_fill", b + 1 );
|
||||
self iPrintln( "Increased to maintain " + ( b + 1 ) + " bot(s)." );
|
||||
break;
|
||||
|
||||
case "filldown":
|
||||
setdvar( "bots_manage_fill", b - 1 );
|
||||
self iPrintln( "Decreased to maintain " + ( b - 1 ) + " bot(s)." );
|
||||
break;
|
||||
|
||||
case "fillspec":
|
||||
setDvar( "bots_manage_fill_spec", !b );
|
||||
self iPrintln( "Count players on spectator for bots_fill: " + !b );
|
||||
|
@ -63,6 +63,7 @@ init()
|
||||
onPlayerSpawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
@ -147,6 +148,7 @@ debug()
|
||||
if ( closest != -1 )
|
||||
{
|
||||
stringChildren = "";
|
||||
|
||||
for ( i = 0; i < level.waypoints[closest].children.size; i++ )
|
||||
{
|
||||
if ( i != 0 )
|
||||
@ -154,6 +156,7 @@ debug()
|
||||
else
|
||||
stringChildren = stringChildren + level.waypoints[closest].children[i];
|
||||
}
|
||||
|
||||
print3d( level.waypoints[closest].origin + ( 0, 0, 35 ), stringChildren, ( 0, 1, 0 ), 2 );
|
||||
|
||||
print3d( level.waypoints[closest].origin + ( 0, 0, 15 ), level.waypoints[closest].type, ( 0, 1, 0 ), 2 );
|
||||
@ -165,6 +168,7 @@ AddWaypoints()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
|
||||
for ( ;; )
|
||||
{
|
||||
while ( !self SecondaryOffhandButtonPressed() || isDefined( self.command ) )
|
||||
@ -193,6 +197,7 @@ linkWaypoints()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
|
||||
for ( ;; )
|
||||
{
|
||||
while ( !self MeleeButtonPressed() || isDefined( self.command ) )
|
||||
@ -220,6 +225,7 @@ deleteWaypoints()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
|
||||
for ( ;; )
|
||||
{
|
||||
while ( !self fragButtonPressed() || isDefined( self.command ) )
|
||||
@ -272,18 +278,22 @@ watchSaveWaypointsCommand()
|
||||
mpnm = getMapName( getdvar( "mapname" ) );
|
||||
logprint( "\n\n" + mpnm + "()\n{\n/*" );
|
||||
logprint( "*/waypoints = [];\n/*" );
|
||||
|
||||
for ( i = 0; i < level.waypointCount; i++ )
|
||||
{
|
||||
logprint( "*/waypoints[" + i + "] = spawnstruct();\n/*" );
|
||||
logprint( "*/waypoints[" + i + "].origin = " + level.waypoints[i].origin + ";\n/*" );
|
||||
logprint( "*/waypoints[" + i + "].type = \"" + level.waypoints[i].type + "\";\n/*" );
|
||||
|
||||
for ( c = 0; c < level.waypoints[i].children.size; c++ )
|
||||
{
|
||||
logprint( "*/waypoints[" + i + "].children[" + c + "] = " + level.waypoints[i].children[c] + ";\n/*" );
|
||||
}
|
||||
|
||||
if ( isDefined( level.waypoints[i].angles ) && ( level.waypoints[i].type == "claymore" || level.waypoints[i].type == "tube" || ( level.waypoints[i].type == "crouch" && level.waypoints[i].children.size == 1 ) || level.waypoints[i].type == "climb" || level.waypoints[i].type == "grenade" ) )
|
||||
logprint( "*/waypoints[" + i + "].angles = " + level.waypoints[i].angles + ";\n/*" );
|
||||
}
|
||||
|
||||
logprint( "*/return waypoints;\n}\n\n\n\n" );
|
||||
|
||||
filename = "waypoints/" + getdvar( "mapname" ) + "_wp.csv";
|
||||
@ -292,6 +302,7 @@ watchSaveWaypointsCommand()
|
||||
PrintLn( level.waypointCount );
|
||||
|
||||
fileWrite( filename, level.waypointCount + "\n", "write" );
|
||||
|
||||
for ( i = 0; i < level.waypointCount; i++ )
|
||||
{
|
||||
str = "";
|
||||
@ -306,6 +317,7 @@ watchSaveWaypointsCommand()
|
||||
if ( h < wp.children.size - 1 )
|
||||
str += " ";
|
||||
}
|
||||
|
||||
str += "," + wp.type + ",";
|
||||
|
||||
if ( isDefined( wp.angles ) )
|
||||
@ -318,6 +330,7 @@ watchSaveWaypointsCommand()
|
||||
PrintLn( str );
|
||||
fileWrite( filename, str + "\n", "append" );
|
||||
}
|
||||
|
||||
PrintLn( "\n\n\n\n\n\n" );
|
||||
|
||||
self iprintln( "Saved!!! to " + filename );
|
||||
@ -448,10 +461,12 @@ DeleteWaypoint(nwp)
|
||||
level.waypoints[entry] = level.waypoints[entry + 1];
|
||||
entry++;
|
||||
}
|
||||
|
||||
level.waypoints[entry] = undefined;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
level.waypointCount--;
|
||||
|
||||
self iprintln( "DelWp " + nwp );
|
||||
@ -534,6 +549,7 @@ LinkWaypoint(nwp)
|
||||
}
|
||||
|
||||
weGood = true;
|
||||
|
||||
for ( i = level.waypoints[level.wpToLink].children.size - 1; i >= 0; i-- )
|
||||
{
|
||||
if ( level.waypoints[level.wpToLink].children[i] == nwp )
|
||||
@ -542,6 +558,7 @@ LinkWaypoint(nwp)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( weGood )
|
||||
{
|
||||
for ( i = level.waypoints[nwp].children.size - 1; i >= 0; i-- )
|
||||
|
Loading…
x
Reference in New Issue
Block a user