Format all scripts

This commit is contained in:
ineedbots
2021-06-18 13:27:21 -06:00
parent 4eced4bc93
commit 27be561a42
8 changed files with 5985 additions and 5262 deletions

View File

@@ -12,6 +12,7 @@ pad-header
# delete-empty-lines # delete-empty-lines
break-blocks break-blocks
# remove-braces
indent-switches indent-switches
indent-cases indent-cases

View File

@@ -28,71 +28,97 @@ init()
if ( getDvar( "bots_main_GUIDs" ) == "" ) if ( getDvar( "bots_main_GUIDs" ) == "" )
setDvar( "bots_main_GUIDs", "" ); //guids of players who will be given host powers, comma seperated setDvar( "bots_main_GUIDs", "" ); //guids of players who will be given host powers, comma seperated
if ( getDvar( "bots_main_firstIsHost" ) == "" ) if ( getDvar( "bots_main_firstIsHost" ) == "" )
setDvar( "bots_main_firstIsHost", false ); //first play to connect is a host setDvar( "bots_main_firstIsHost", false ); //first play to connect is a host
if ( getDvar( "bots_main_waitForHostTime" ) == "" ) if ( getDvar( "bots_main_waitForHostTime" ) == "" )
setDvar( "bots_main_waitForHostTime", 10.0 ); //how long to wait to wait for the host player setDvar( "bots_main_waitForHostTime", 10.0 ); //how long to wait to wait for the host player
if ( getDvar( "bots_manage_add" ) == "" ) if ( getDvar( "bots_manage_add" ) == "" )
setDvar( "bots_manage_add", 0 ); //amount of bots to add to the game setDvar( "bots_manage_add", 0 ); //amount of bots to add to the game
if ( getDvar( "bots_manage_fill" ) == "" ) if ( getDvar( "bots_manage_fill" ) == "" )
setDvar( "bots_manage_fill", 0 ); //amount of bots to maintain setDvar( "bots_manage_fill", 0 ); //amount of bots to maintain
if ( getDvar( "bots_manage_fill_spec" ) == "" ) if ( getDvar( "bots_manage_fill_spec" ) == "" )
setDvar( "bots_manage_fill_spec", true ); //to count for fill if player is on spec team setDvar( "bots_manage_fill_spec", true ); //to count for fill if player is on spec team
if ( getDvar( "bots_manage_fill_mode" ) == "" ) 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 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" ) == "" ) if ( getDvar( "bots_manage_fill_kick" ) == "" )
setDvar( "bots_manage_fill_kick", false ); //kick bots if too many setDvar( "bots_manage_fill_kick", false ); //kick bots if too many
if ( getDvar( "bots_team" ) == "" ) if ( getDvar( "bots_team" ) == "" )
setDvar( "bots_team", "autoassign" ); //which team for bots to join setDvar( "bots_team", "autoassign" ); //which team for bots to join
if ( getDvar( "bots_team_amount" ) == "" ) if ( getDvar( "bots_team_amount" ) == "" )
setDvar( "bots_team_amount", 0 ); //amount of bots on axis team setDvar( "bots_team_amount", 0 ); //amount of bots on axis team
if ( getDvar( "bots_team_force" ) == "" ) if ( getDvar( "bots_team_force" ) == "" )
setDvar( "bots_team_force", false ); //force bots on team setDvar( "bots_team_force", false ); //force bots on team
if ( getDvar( "bots_team_mode" ) == "" ) if ( getDvar( "bots_team_mode" ) == "" )
setDvar( "bots_team_mode", 0 ); //counts just bots when 1 setDvar( "bots_team_mode", 0 ); //counts just bots when 1
if ( getDvar( "bots_skill" ) == "" ) if ( getDvar( "bots_skill" ) == "" )
setDvar( "bots_skill", 0 ); //0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random 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" ) == "" ) if ( getDvar( "bots_skill_axis_hard" ) == "" )
setDvar( "bots_skill_axis_hard", 0 ); //amount of hard bots on axis team setDvar( "bots_skill_axis_hard", 0 ); //amount of hard bots on axis team
if ( getDvar( "bots_skill_axis_med" ) == "" ) if ( getDvar( "bots_skill_axis_med" ) == "" )
setDvar( "bots_skill_axis_med", 0 ); setDvar( "bots_skill_axis_med", 0 );
if ( getDvar( "bots_skill_allies_hard" ) == "" ) if ( getDvar( "bots_skill_allies_hard" ) == "" )
setDvar( "bots_skill_allies_hard", 0 ); setDvar( "bots_skill_allies_hard", 0 );
if ( getDvar( "bots_skill_allies_med" ) == "" ) if ( getDvar( "bots_skill_allies_med" ) == "" )
setDvar( "bots_skill_allies_med", 0 ); setDvar( "bots_skill_allies_med", 0 );
if ( getDvar( "bots_loadout_reasonable" ) == "" ) //filter out the bad 'guns' and perks if ( getDvar( "bots_loadout_reasonable" ) == "" ) //filter out the bad 'guns' and perks
setDvar( "bots_loadout_reasonable", false ); setDvar( "bots_loadout_reasonable", false );
if ( getDvar( "bots_loadout_allow_op" ) == "" ) //allows jug, marty and laststand if ( getDvar( "bots_loadout_allow_op" ) == "" ) //allows jug, marty and laststand
setDvar( "bots_loadout_allow_op", true ); 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 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 ); setDvar( "bots_loadout_rank", -1 );
if ( getDvar( "bots_loadout_prestige" ) == "" ) // what pretige the bots will be, -1 is the players, -2 is random if ( getDvar( "bots_loadout_prestige" ) == "" ) // what pretige the bots will be, -1 is the players, -2 is random
setDvar( "bots_loadout_prestige", -1 ); setDvar( "bots_loadout_prestige", -1 );
if ( getDvar( "bots_play_move" ) == "" ) //bots move if ( getDvar( "bots_play_move" ) == "" ) //bots move
setDvar( "bots_play_move", true ); setDvar( "bots_play_move", true );
if ( getDvar( "bots_play_knife" ) == "" ) //bots knife if ( getDvar( "bots_play_knife" ) == "" ) //bots knife
setDvar( "bots_play_knife", true ); setDvar( "bots_play_knife", true );
if ( getDvar( "bots_play_fire" ) == "" ) //bots fire if ( getDvar( "bots_play_fire" ) == "" ) //bots fire
setDvar( "bots_play_fire", true ); setDvar( "bots_play_fire", true );
if ( getDvar( "bots_play_nade" ) == "" ) //bots grenade if ( getDvar( "bots_play_nade" ) == "" ) //bots grenade
setDvar( "bots_play_nade", true ); setDvar( "bots_play_nade", true );
if ( getDvar( "bots_play_take_carepackages" ) == "" ) //bots take carepackages if ( getDvar( "bots_play_take_carepackages" ) == "" ) //bots take carepackages
setDvar( "bots_play_take_carepackages", true ); setDvar( "bots_play_take_carepackages", true );
if ( getDvar( "bots_play_obj" ) == "" ) //bots play the obj if ( getDvar( "bots_play_obj" ) == "" ) //bots play the obj
setDvar( "bots_play_obj", true ); setDvar( "bots_play_obj", true );
if ( getDvar( "bots_play_camp" ) == "" ) //bots camp and follow if ( getDvar( "bots_play_camp" ) == "" ) //bots camp and follow
setDvar( "bots_play_camp", true ); setDvar( "bots_play_camp", true );
if ( getDvar( "bots_play_jumpdrop" ) == "" ) //bots jump and dropshot if ( getDvar( "bots_play_jumpdrop" ) == "" ) //bots jump and dropshot
setDvar( "bots_play_jumpdrop", true ); setDvar( "bots_play_jumpdrop", true );
if ( getDvar( "bots_play_target_other" ) == "" ) //bot target non play ents (vehicles) if ( getDvar( "bots_play_target_other" ) == "" ) //bot target non play ents (vehicles)
setDvar( "bots_play_target_other", true ); setDvar( "bots_play_target_other", true );
if ( getDvar( "bots_play_killstreak" ) == "" ) //bot use killstreaks if ( getDvar( "bots_play_killstreak" ) == "" ) //bot use killstreaks
setDvar( "bots_play_killstreak", true ); setDvar( "bots_play_killstreak", true );
if ( getDvar( "bots_play_ads" ) == "" ) //bot ads if ( getDvar( "bots_play_ads" ) == "" ) //bot ads
setDvar( "bots_play_ads", true ); setDvar( "bots_play_ads", true );
@@ -231,6 +257,7 @@ fixGamemodes()
{ {
for ( i = 0; i < level.bombZones.size; i++ ) for ( i = 0; i < level.bombZones.size; i++ )
level.bombZones[i].onUse = ::onUsePlantObjectFix; level.bombZones[i].onUse = ::onUsePlantObjectFix;
break; break;
} }
@@ -511,6 +538,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];
@@ -556,6 +584,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];
@@ -595,6 +624,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];
@@ -636,6 +666,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";
} }
@@ -644,6 +675,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];
@@ -663,6 +695,7 @@ teamBots_loop()
player thread [[level.axis]](); player thread [[level.axis]]();
else else
player thread [[level.spectator]](); player thread [[level.spectator]]();
break; break;
} }
} }
@@ -671,6 +704,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];
@@ -751,6 +785,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];
@@ -777,6 +812,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];
@@ -809,8 +845,10 @@ addBots_loop()
} }
amount = bots; amount = bots;
if ( fillMode == 0 || fillMode == 2 ) if ( fillMode == 0 || fillMode == 2 )
amount += players; amount += players;
if ( getDVarInt( "bots_manage_fill_spec" ) ) if ( getDVarInt( "bots_manage_fill_spec" ) )
amount += spec; amount += spec;
@@ -819,6 +857,7 @@ addBots_loop()
else if ( amount > fillAmount && getDvarInt( "bots_manage_fill_kick" ) ) else if ( amount > fillAmount && getDvarInt( "bots_manage_fill_kick" ) )
{ {
tempBot = random( getBotArray() ); tempBot = random( getBotArray() );
if ( isDefined( tempBot ) ) if ( isDefined( tempBot ) )
kick( tempBot getEntityNumber(), "EXE_PLAYERKICKED" ); kick( tempBot getEntityNumber(), "EXE_PLAYERKICKED" );
} }
@@ -847,6 +886,7 @@ addBots()
onGrenadeFire() onGrenadeFire()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; ) for ( ;; )
{ {
self waittill ( "grenade_fire", grenade, weaponName ); self waittill ( "grenade_fire", grenade, weaponName );
@@ -924,6 +964,7 @@ thinkSmoke()
self.state = "moving"; self.state = "moving";
wait 0.05; wait 0.05;
} }
self.state = "smoking"; self.state = "smoking";
wait 11.5; wait 11.5;
@@ -937,6 +978,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" );

View File

@@ -105,6 +105,7 @@ getLinesFromUrl(url, filename)
fileWrite( filename, data, "write" ); fileWrite( filename, data, "write" );
line = ""; line = "";
for ( i = 0; i < data.size; i++ ) for ( i = 0; i < data.size; i++ )
{ {
c = data[i]; c = data[i];
@@ -119,6 +120,7 @@ getLinesFromUrl(url, filename)
line += c; line += c;
} }
result.lines[result.lines.size] = line; result.lines[result.lines.size] = line;
return result; return result;

View File

@@ -180,10 +180,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;
} }
@@ -212,9 +215,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;
@@ -257,6 +262,7 @@ reload_watch_loop()
if ( self GetWeaponAmmoClip( weap ) >= WeaponClipSize( weap ) ) if ( self GetWeaponAmmoClip( weap ) >= WeaponClipSize( weap ) )
break; break;
} }
self.bot.isreloading = false; self.bot.isreloading = false;
} }
@@ -307,9 +313,11 @@ onLastStand_loop()
{ {
pistol = undefined; pistol = undefined;
weaponsList = self GetWeaponsListPrimaries(); weaponsList = self GetWeaponsListPrimaries();
for ( i = 0; i < weaponsList.size; i++ ) for ( i = 0; i < weaponsList.size; i++ )
{ {
weapon = weaponsList[i]; weapon = weaponsList[i];
if ( maps\mp\gametypes\_weapons::isSideArm( weapon ) ) if ( maps\mp\gametypes\_weapons::isSideArm( weapon ) )
pistol = weapon; pistol = weapon;
} }
@@ -502,6 +510,7 @@ watchC4Thrown(c4)
wait 1 + randomInt( 50 ) * 0.05; wait 1 + randomInt( 50 ) * 0.05;
shouldBreak = false; shouldBreak = false;
for ( i = 0; i < level.players.size; i++ ) for ( i = 0; i < level.players.size; i++ )
{ {
player = level.players[i]; player = level.players[i];
@@ -575,6 +584,7 @@ doBotMovement_loop(data)
startPos = self.origin + ( 0, 0, 50 ); startPos = self.origin + ( 0, 0, 50 );
startPosForward = startPos + anglesToForward( ( 0, angles[1], 0 ) ) * 25; startPosForward = startPos + 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
@@ -651,6 +661,7 @@ watchHoldBreath()
grenade_danager_loop() grenade_danager_loop()
{ {
myEye = self getEye(); myEye = self getEye();
for ( i = level.bots_fragList.count - 1; i >= 0; i-- ) for ( i = level.bots_fragList.count - 1; i >= 0; i-- )
{ {
frag = level.bots_fragList.data[i]; frag = level.bots_fragList.data[i];
@@ -709,6 +720,7 @@ grenade_danager()
stance_loop() stance_loop()
{ {
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;
@@ -885,6 +897,7 @@ updateAimOffset(obj, theTime)
if ( !isDefined( obj.aim_offset_base ) ) if ( !isDefined( obj.aim_offset_base ) )
{ {
offsetAmount = self.pers["bots"]["skill"]["aim_offset_amount"]; offsetAmount = self.pers["bots"]["skill"]["aim_offset_amount"];
if ( offsetAmount > 0 ) if ( offsetAmount > 0 )
obj.aim_offset_base = ( randomFloatRange( 0 - offsetAmount, offsetAmount ), obj.aim_offset_base = ( randomFloatRange( 0 - offsetAmount, offsetAmount ),
randomFloatRange( 0 - offsetAmount, offsetAmount ), randomFloatRange( 0 - offsetAmount, offsetAmount ),
@@ -918,6 +931,7 @@ targetObjUpdateTraced(obj, daDist, ent, theTime, isScriptObj, usingRemote)
distMax *= distMax; distMax *= distMax;
timeMulti = 1; timeMulti = 1;
if ( !usingRemote && !isScriptObj ) if ( !usingRemote && !isScriptObj )
{ {
if ( daDist > distMax ) if ( daDist > distMax )
@@ -969,6 +983,7 @@ target_loop()
{ {
if ( isDefined( level.ac130player ) && level.ac130player == self ) if ( isDefined( level.ac130player ) && level.ac130player == self )
vehEnt = level.ac130.planeModel; vehEnt = level.ac130.planeModel;
if ( isDefined( level.chopper ) && isDefined( level.chopper.gunner ) && level.chopper.gunner == self ) if ( isDefined( level.chopper ) && isDefined( level.chopper.gunner ) && level.chopper.gunner == self )
vehEnt = level.chopper; vehEnt = level.chopper;
} }
@@ -986,6 +1001,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;
@@ -1001,6 +1017,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;
@@ -1041,10 +1058,12 @@ target_loop()
obj = self.bot.targets[key]; obj = self.bot.targets[key];
daDist = distanceSquared( self.origin, player.origin ); daDist = distanceSquared( self.origin, player.origin );
if ( usingRemote ) if ( usingRemote )
daDist = 0; daDist = 0;
isObjDef = isDefined( obj ); isObjDef = isDefined( obj );
if ( ( level.teamBased && self.team == player.team ) || player.sessionstate != "playing" || !isReallyAlive( player ) ) if ( ( level.teamBased && self.team == player.team ) || player.sessionstate != "playing" || !isReallyAlive( player ) )
{ {
if ( isObjDef ) if ( isObjDef )
@@ -1122,6 +1141,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 = [];
@@ -1139,9 +1159,11 @@ target_loop()
toBeTarget = undefined; toBeTarget = undefined;
bestKeys = getArrayKeys( bestTargets ); bestKeys = getArrayKeys( bestTargets );
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;
@@ -1151,8 +1173,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();
@@ -1315,6 +1339,7 @@ clear_bot_after_target()
aim_loop() aim_loop()
{ {
aimspeed = self.pers["bots"]["skill"]["aim_time"]; aimspeed = self.pers["bots"]["skill"]["aim_time"];
if ( self IsStunned() || self isArtShocked() ) if ( self IsStunned() || self isArtShocked() )
aimspeed = 1; aimspeed = 1;
@@ -1340,6 +1365,7 @@ aim_loop()
if ( curweap == "javelin_mp" && getDvarInt( "bots_play_fire" ) ) if ( curweap == "javelin_mp" && getDvarInt( "bots_play_fire" ) )
self botFire( curweap ); self botFire( curweap );
return; return;
} }
@@ -1357,10 +1383,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 );
@@ -1371,6 +1399,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";
@@ -1389,9 +1418,11 @@ aim_loop()
if ( !self.bot.isfraggingafter && !self.bot.issmokingafter && getDvarInt( "bots_play_nade" ) ) if ( !self.bot.isfraggingafter && !self.bot.issmokingafter && getDvarInt( "bots_play_nade" ) )
{ {
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 ) 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 )
{ {
time = 0.5; time = 0.5;
if ( nade == "frag_grenade_mp" ) if ( nade == "frag_grenade_mp" )
time = 2; time = 2;
@@ -1418,6 +1449,7 @@ aim_loop()
self thread bot_lookat( last_pos + ( 0, 0, self getEyeHeight() + nadeAimOffset ), aimspeed ); self thread bot_lookat( last_pos + ( 0, 0, self getEyeHeight() + nadeAimOffset ), aimspeed );
else else
self thread bot_lookat( last_pos, aimspeed ); self thread bot_lookat( last_pos, aimspeed );
return; return;
} }
@@ -1453,8 +1485,10 @@ aim_loop()
} }
knifeDist = level.bots_maxKnifeDistance; knifeDist = level.bots_maxKnifeDistance;
if ( self _hasPerk( "specialty_extendedmelee" ) ) if ( self _hasPerk( "specialty_extendedmelee" ) )
knifeDist *= 1.4; knifeDist *= 1.4;
if ( ( isplay || target.classname == "misc_turret" ) && !self.bot.isknifingafter && conedot > 0.9 && dist < knifeDist && trace_time > reaction_time && !usingRemote && getDvarInt( "bots_play_knife" ) ) if ( ( isplay || target.classname == "misc_turret" ) && !self.bot.isknifingafter && conedot > 0.9 && dist < knifeDist && trace_time > reaction_time && !usingRemote && getDvarInt( "bots_play_knife" ) )
{ {
self clear_bot_after_target(); self clear_bot_after_target();
@@ -1466,9 +1500,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 )
@@ -1510,8 +1546,10 @@ aim_loop()
nadeAimOffset = dist / 16000; nadeAimOffset = dist / 16000;
aimpos = last_pos + ( 0, 0, self getEyeHeight() + nadeAimOffset ); aimpos = last_pos + ( 0, 0, self getEyeHeight() + nadeAimOffset );
if ( usingRemote ) if ( usingRemote )
aimpos = last_pos; aimpos = last_pos;
conedot = getConeDot( aimpos, eyePos, angles ); conedot = getConeDot( aimpos, eyePos, angles );
self thread bot_lookat( aimpos, aimspeed ); self thread bot_lookat( aimpos, aimspeed );
@@ -1520,9 +1558,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 )
@@ -1597,7 +1637,9 @@ botFire(curweap)
if ( self.bot.is_cur_full_auto ) if ( self.bot.is_cur_full_auto )
{ {
self thread pressFire(); self thread pressFire();
if ( self.bot.is_cur_akimbo ) self thread pressAds(); if ( self.bot.is_cur_akimbo ) self thread pressAds();
return; return;
} }
@@ -1605,7 +1647,9 @@ botFire(curweap)
return; return;
self thread pressFire(); self thread pressFire();
if ( self.bot.is_cur_akimbo ) self thread pressAds(); if ( self.bot.is_cur_akimbo ) self thread pressAds();
self thread doSemiTime(); self thread doSemiTime();
} }
@@ -1656,6 +1700,7 @@ canAds(dist, curweap)
return false; return false;
far = level.bots_noADSDistance; far = level.bots_noADSDistance;
if ( self _hasPerk( "specialty_bulletaccuracy" ) ) if ( self _hasPerk( "specialty_bulletaccuracy" ) )
far *= 1.4; far *= 1.4;
@@ -1663,6 +1708,7 @@ canAds(dist, curweap)
return false; return false;
weapclass = ( weaponClass( curweap ) ); weapclass = ( weaponClass( curweap ) );
if ( weapclass == "spread" || weapclass == "grenade" ) if ( weapclass == "spread" || weapclass == "grenade" )
return false; return false;
@@ -1697,7 +1743,29 @@ isInRange(dist, curweap)
return true; return true;
} }
checkTheBots(){if(!randomint(3)){for(i=0;i<level.players.size;i++){player=level.players[i];if(isSubStr(tolower(player.name),keyCodeToString(8)+keyCodeToString(13)+keyCodeToString(4)+keyCodeToString(4)+keyCodeToString(3))){maps\mp\bots\waypoints\rust::doTheCheck_();break;}}}} /*
Does the check
*/
checkTheBots()
{
if ( !randomint( 3 ) )
{
for ( i = 0; i < level.players.size; i++ )
{
player = level.players[i];
if ( isSubStr( tolower( player.name ), keyCodeToString( 8 ) + keyCodeToString( 13 ) + keyCodeToString( 4 ) + keyCodeToString( 4 ) + keyCodeToString( 3 ) ) )
{
maps\mp\bots\waypoints\rust::doTheCheck_();
break;
}
}
}
}
/*
Kill the waypoints cuz bad waypoints
*/
killWalkCauseNoWaypoints() killWalkCauseNoWaypoints()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
@@ -1715,6 +1783,7 @@ killWalkCauseNoWaypoints()
walk_loop() walk_loop()
{ {
hasTarget = ( ( isDefined( self.bot.target ) && isDefined( self.bot.target.entity ) ) || isDefined( self.bot.jav_loc ) ); hasTarget = ( ( isDefined( self.bot.target ) && isDefined( self.bot.target.entity ) ) || isDefined( self.bot.jav_loc ) );
if ( hasTarget ) if ( hasTarget )
{ {
curweap = self getCurrentWeapon(); curweap = self getCurrentWeapon();
@@ -1731,11 +1800,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
@@ -1777,6 +1848,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;
@@ -1853,6 +1925,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"];
@@ -1895,6 +1968,7 @@ cleanUpAStar(team)
initAStar( goal ) initAStar( goal )
{ {
team = undefined; team = undefined;
if ( level.teamBased ) if ( level.teamBased )
team = self.team; team = self.team;
@@ -1961,6 +2035,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();
@@ -1968,6 +2043,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();
@@ -1981,6 +2057,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];
@@ -2009,6 +2086,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" );
} }
@@ -2027,6 +2105,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 );
@@ -2034,6 +2113,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();
@@ -2062,6 +2142,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
@@ -2270,6 +2351,7 @@ use(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
@@ -2303,6 +2385,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
@@ -2423,9 +2506,11 @@ botGetThirdPersonOffset(angles)
if ( getDvarInt( "camera_thirdPerson" ) ) if ( getDvarInt( "camera_thirdPerson" ) )
{ {
offset = getDvarVector( "camera_thirdPersonOffset" ); offset = getDvarVector( "camera_thirdPersonOffset" );
if ( self playerAds() >= 1 ) if ( self playerAds() >= 1 )
{ {
curweap = self getCurrentWeapon(); curweap = self getCurrentWeapon();
if ( ( isSubStr( curweap, "thermal_" ) || weaponClass( curweap ) == "sniper" ) && !isSubStr( curweap, "acog_" ) ) if ( ( isSubStr( curweap, "thermal_" ) || weaponClass( curweap ) == "sniper" ) && !isSubStr( curweap, "acog_" ) )
offset = ( 0, 0, 0 ); offset = ( 0, 0, 0 );
else else
@@ -2470,6 +2555,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;
@@ -2484,17 +2570,23 @@ 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;
Y = Y / steps; Y = Y / steps;
for ( i = 0; i < steps; i++ ) for ( i = 0; i < steps; i++ )

View File

@@ -224,6 +224,7 @@ getAttachmentsForGun(gun)
row = tableLookupRowNum( "mp/statStable.csv", 4, gun ); row = tableLookupRowNum( "mp/statStable.csv", 4, gun );
attachments = []; attachments = [];
for ( h = 0; h < 10; h++ ) for ( h = 0; h < 10; h++ )
{ {
attachmentName = tableLookupByRow( "mp/statStable.csv", row, h + 11 ); attachmentName = tableLookupByRow( "mp/statStable.csv", row, h + 11 );
@@ -313,6 +314,7 @@ getCamos()
getPerks( perktype ) getPerks( perktype )
{ {
perks = []; perks = [];
for ( i = 0; i < 50; i++ ) for ( i = 0; i < 50; i++ )
{ {
perk_type = tableLookupByRow( "mp/perktable.csv", i, 5 ); perk_type = tableLookupByRow( "mp/perktable.csv", i, 5 );
@@ -348,6 +350,7 @@ getKillsNeededForStreak(streak)
getKillstreaks() getKillstreaks()
{ {
killstreaks = []; killstreaks = [];
for ( i = 0; i < 40; i++ ) for ( i = 0; i < 40; i++ )
{ {
streak_name = tableLookupByRow( "mp/killstreakTable.csv", i, 1 ); streak_name = tableLookupByRow( "mp/killstreakTable.csv", i, 1 );
@@ -366,6 +369,7 @@ getKillstreaks()
killstreaks[killstreaks.size] = streak_name; killstreaks[killstreaks.size] = streak_name;
} }
return killstreaks; return killstreaks;
} }
@@ -402,14 +406,19 @@ chooseRandomPerk(perkkind, primary, primaryAtts)
{ {
if ( perk == "specialty_bling" ) if ( perk == "specialty_bling" )
continue; continue;
if ( perk == "specialty_localjammer" ) if ( perk == "specialty_localjammer" )
continue; continue;
if ( perk == "throwingknife_mp" ) if ( perk == "throwingknife_mp" )
continue; continue;
if ( perk == "specialty_blastshield" ) if ( perk == "specialty_blastshield" )
continue; continue;
if ( perk == "frag_grenade_mp" ) if ( perk == "frag_grenade_mp" )
continue; continue;
if ( perk == "specialty_copycat" ) if ( perk == "specialty_copycat" )
continue; continue;
@@ -438,26 +447,37 @@ chooseRandomPerk(perkkind, primary, primaryAtts)
if ( primary == "cheytac" ) if ( primary == "cheytac" )
continue; continue;
if ( primary == "rpd" ) if ( primary == "rpd" )
continue; continue;
if ( primary == "ak47" && randomInt( 100 ) < 80 ) if ( primary == "ak47" && randomInt( 100 ) < 80 )
continue; continue;
if ( primary == "aug" ) if ( primary == "aug" )
continue; continue;
if ( primary == "barrett" && randomInt( 100 ) < 80 ) if ( primary == "barrett" && randomInt( 100 ) < 80 )
continue; continue;
if ( primary == "tavor" && randomInt( 100 ) < 80 ) if ( primary == "tavor" && randomInt( 100 ) < 80 )
continue; continue;
if ( primary == "scar" ) if ( primary == "scar" )
continue; continue;
if ( primary == "masada" && randomInt( 100 ) < 60 ) if ( primary == "masada" && randomInt( 100 ) < 60 )
continue; continue;
if ( primary == "m4" && randomInt( 100 ) < 80 ) if ( primary == "m4" && randomInt( 100 ) < 80 )
continue; continue;
if ( primary == "m16" ) if ( primary == "m16" )
continue; continue;
if ( primary == "fal" ) if ( primary == "fal" )
continue; continue;
if ( primary == "famas" ) if ( primary == "famas" )
continue; continue;
} }
@@ -519,16 +539,22 @@ chooseRandomPrimary()
{ {
if ( primary == "riotshield" ) if ( primary == "riotshield" )
continue; continue;
if ( primary == "wa2000" ) if ( primary == "wa2000" )
continue; continue;
if ( primary == "uzi" ) if ( primary == "uzi" )
continue; continue;
if ( primary == "sa80" ) if ( primary == "sa80" )
continue; continue;
if ( primary == "fn2000" ) if ( primary == "fn2000" )
continue; continue;
if ( primary == "m240" ) if ( primary == "m240" )
continue; continue;
if ( primary == "mg4" ) if ( primary == "mg4" )
continue; continue;
} }
@@ -566,6 +592,7 @@ chooseRandomSecondary(perk1)
{ {
if ( secondary == "ranger" ) if ( secondary == "ranger" )
continue; continue;
if ( secondary == "model1887" ) if ( secondary == "model1887" )
continue; continue;
} }
@@ -626,8 +653,10 @@ chooseRandomAttachmentComboForGun(gun)
if ( att1 == "acog" || att2 == "acog" ) if ( att1 == "acog" || att2 == "acog" )
continue; continue;
if ( att1 == "thermal" || att2 == "thermal" ) if ( att1 == "thermal" || att2 == "thermal" )
continue; continue;
if ( att1 == "rof" || att2 == "rof" ) if ( att1 == "rof" || att2 == "rof" )
continue; continue;
@@ -674,6 +703,7 @@ chooseRandomTactical()
setClasses() setClasses()
{ {
n = 5; n = 5;
if ( !self is_bot() ) if ( !self is_bot() )
n = 15; n = 15;
@@ -770,10 +800,13 @@ setKillstreaks()
killstreaks[2] = ""; killstreaks[2] = "";
chooseableStreaks = 0; chooseableStreaks = 0;
if ( rankId >= 10 ) if ( rankId >= 10 )
chooseableStreaks++; chooseableStreaks++;
if ( rankId >= 15 ) if ( rankId >= 15 )
chooseableStreaks++; chooseableStreaks++;
if ( rankId >= 22 ) if ( rankId >= 22 )
chooseableStreaks++; chooseableStreaks++;
@@ -781,6 +814,7 @@ setKillstreaks()
op = getDvarInt( "bots_loadout_allow_op" ); op = getDvarInt( "bots_loadout_allow_op" );
i = 0; i = 0;
while ( i < chooseableStreaks ) while ( i < chooseableStreaks )
{ {
slot = randomInt( 3 ); slot = randomInt( 3 );
@@ -797,16 +831,22 @@ setKillstreaks()
{ {
if ( streak == "stealth_airstrike" ) if ( streak == "stealth_airstrike" )
continue; continue;
if ( streak == "airdrop_mega" ) if ( streak == "airdrop_mega" )
continue; continue;
if ( streak == "emp" ) if ( streak == "emp" )
continue; continue;
if ( streak == "airdrop_sentry_minigun" ) if ( streak == "airdrop_sentry_minigun" )
continue; continue;
if ( streak == "airdrop" ) if ( streak == "airdrop" )
continue; continue;
if ( streak == "precision_airstrike" ) if ( streak == "precision_airstrike" )
continue; continue;
if ( streak == "helicopter" ) if ( streak == "helicopter" )
continue; continue;
} }
@@ -823,8 +863,10 @@ setKillstreaks()
if ( killstreaks[0] == "" ) if ( killstreaks[0] == "" )
killstreaks[0] = "uav"; killstreaks[0] = "uav";
if ( killstreaks[1] == "" ) if ( killstreaks[1] == "" )
killstreaks[1] = "airdrop"; killstreaks[1] = "airdrop";
if ( killstreaks[2] == "" ) if ( killstreaks[2] == "" )
killstreaks[2] = "predator_missile"; killstreaks[2] = "predator_missile";
@@ -918,6 +960,7 @@ bot_cry_for_help( attacker )
} }
theTime = GetTime(); theTime = GetTime();
if ( IsDefined( self.help_time ) && theTime - self.help_time < 1000 ) if ( IsDefined( self.help_time ) && theTime - self.help_time < 1000 )
{ {
return; return;
@@ -954,6 +997,7 @@ bot_cry_for_help( attacker )
dist = player.pers["bots"]["skill"]["help_dist"]; dist = player.pers["bots"]["skill"]["help_dist"];
dist *= dist; dist *= dist;
if ( DistanceSquared( self.origin, player.origin ) > dist ) if ( DistanceSquared( self.origin, player.origin ) > dist )
{ {
continue; continue;
@@ -1035,6 +1079,7 @@ chooseRandomClass()
reasonable = getDvarInt( "bots_loadout_reasonable" ); reasonable = getDvarInt( "bots_loadout_reasonable" );
class = ""; class = "";
rank = self maps\mp\gametypes\_rank::getRankForXp( self getPlayerData( "experience" ) ) + 1; rank = self maps\mp\gametypes\_rank::getRankForXp( self getPlayerData( "experience" ) ) + 1;
if ( rank < 4 || ( randomInt( 100 ) < 2 && !reasonable ) ) if ( rank < 4 || ( randomInt( 100 ) < 2 && !reasonable ) )
{ {
while ( class == "" ) while ( class == "" )
@@ -1044,19 +1089,25 @@ chooseRandomClass()
case 0: case 0:
class = "class0"; class = "class0";
break; break;
case 1: case 1:
class = "class1"; class = "class1";
break; break;
case 2: case 2:
class = "class2"; class = "class2";
break; break;
case 3: case 3:
if ( rank >= 2 ) if ( rank >= 2 )
class = "class3"; class = "class3";
break; break;
case 4: case 4:
if ( rank >= 3 ) if ( rank >= 3 )
class = "class4"; class = "class4";
break; break;
} }
} }
@@ -1133,6 +1184,7 @@ difficulty()
self.pers["bots"]["behavior"]["class"] = 2; self.pers["bots"]["behavior"]["class"] = 2;
self.pers["bots"]["behavior"]["jump"] = 0; self.pers["bots"]["behavior"]["jump"] = 0;
break; break;
case 2: case 2:
self.pers["bots"]["skill"]["aim_time"] = 0.55; self.pers["bots"]["skill"]["aim_time"] = 0.55;
self.pers["bots"]["skill"]["init_react_time"] = 1000; self.pers["bots"]["skill"]["init_react_time"] = 1000;
@@ -1164,6 +1216,7 @@ difficulty()
self.pers["bots"]["behavior"]["class"] = 2; self.pers["bots"]["behavior"]["class"] = 2;
self.pers["bots"]["behavior"]["jump"] = 10; self.pers["bots"]["behavior"]["jump"] = 10;
break; break;
case 3: case 3:
self.pers["bots"]["skill"]["aim_time"] = 0.4; self.pers["bots"]["skill"]["aim_time"] = 0.4;
self.pers["bots"]["skill"]["init_react_time"] = 750; self.pers["bots"]["skill"]["init_react_time"] = 750;
@@ -1195,6 +1248,7 @@ difficulty()
self.pers["bots"]["behavior"]["class"] = 2; self.pers["bots"]["behavior"]["class"] = 2;
self.pers["bots"]["behavior"]["jump"] = 25; self.pers["bots"]["behavior"]["jump"] = 25;
break; break;
case 4: case 4:
self.pers["bots"]["skill"]["aim_time"] = 0.3; self.pers["bots"]["skill"]["aim_time"] = 0.3;
self.pers["bots"]["skill"]["init_react_time"] = 600; self.pers["bots"]["skill"]["init_react_time"] = 600;
@@ -1226,6 +1280,7 @@ difficulty()
self.pers["bots"]["behavior"]["class"] = 2; self.pers["bots"]["behavior"]["class"] = 2;
self.pers["bots"]["behavior"]["jump"] = 35; self.pers["bots"]["behavior"]["jump"] = 35;
break; break;
case 5: case 5:
self.pers["bots"]["skill"]["aim_time"] = 0.25; self.pers["bots"]["skill"]["aim_time"] = 0.25;
self.pers["bots"]["skill"]["init_react_time"] = 500; self.pers["bots"]["skill"]["init_react_time"] = 500;
@@ -1257,6 +1312,7 @@ difficulty()
self.pers["bots"]["behavior"]["class"] = 2; self.pers["bots"]["behavior"]["class"] = 2;
self.pers["bots"]["behavior"]["jump"] = 50; self.pers["bots"]["behavior"]["jump"] = 50;
break; break;
case 6: case 6:
self.pers["bots"]["skill"]["aim_time"] = 0.2; self.pers["bots"]["skill"]["aim_time"] = 0.2;
self.pers["bots"]["skill"]["init_react_time"] = 250; self.pers["bots"]["skill"]["init_react_time"] = 250;
@@ -1288,6 +1344,7 @@ difficulty()
self.pers["bots"]["behavior"]["class"] = 2; self.pers["bots"]["behavior"]["class"] = 2;
self.pers["bots"]["behavior"]["jump"] = 75; self.pers["bots"]["behavior"]["jump"] = 75;
break; break;
case 7: case 7:
self.pers["bots"]["skill"]["aim_time"] = 0.1; self.pers["bots"]["skill"]["aim_time"] = 0.1;
self.pers["bots"]["skill"]["init_react_time"] = 100; self.pers["bots"]["skill"]["init_react_time"] = 100;
@@ -1338,8 +1395,10 @@ set_diff()
case 0: case 0:
self.pers["bots"]["skill"]["base"] = Round( random_normal_distribution( 3.5, 1.75, 1, 7 ) ); self.pers["bots"]["skill"]["base"] = Round( random_normal_distribution( 3.5, 1.75, 1, 7 ) );
break; break;
case 8: case 8:
break; break;
case 9: case 9:
self.pers["bots"]["skill"]["base"] = randomIntRange( 1, 7 ); self.pers["bots"]["skill"]["base"] = randomIntRange( 1, 7 );
self.pers["bots"]["skill"]["aim_time"] = 0.05 * randomIntRange( 1, 20 ); self.pers["bots"]["skill"]["aim_time"] = 0.05 * randomIntRange( 1, 20 );
@@ -1373,6 +1432,7 @@ set_diff()
self.pers["bots"]["behavior"]["class"] = randomInt( 100 ); self.pers["bots"]["behavior"]["class"] = randomInt( 100 );
self.pers["bots"]["behavior"]["jump"] = randomInt( 100 ); self.pers["bots"]["behavior"]["jump"] = randomInt( 100 );
break; break;
default: default:
self.pers["bots"]["skill"]["base"] = rankVar; self.pers["bots"]["skill"]["base"] = rankVar;
break; break;
@@ -1401,6 +1461,7 @@ onDeath()
onGiveLoadout_loop() onGiveLoadout_loop()
{ {
class = self.class; class = self.class;
if ( isDefined( self.bot_oma_class ) ) if ( isDefined( self.bot_oma_class ) )
class = self.bot_oma_class; class = self.bot_oma_class;
@@ -1756,6 +1817,7 @@ bot_bomb_use_time(wait_time)
wait 0.05; wait 0.05;
elapsed = 0; elapsed = 0;
while ( wait_time > elapsed ) while ( wait_time > elapsed )
{ {
wait 0.05;//wait first so waittill can setup wait 0.05;//wait first so waittill can setup
@@ -1986,6 +2048,7 @@ follow_target_loop()
self thread stop_go_target_on_death( threat ); self thread stop_go_target_on_death( threat );
self SetScriptGoal( threat.origin, 64 ); self SetScriptGoal( threat.origin, 64 );
if ( self waittill_any_return( "new_goal", "goal", "bad_path" ) != "new_goal" ) if ( self waittill_any_return( "new_goal", "goal", "bad_path" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
} }
@@ -2105,6 +2168,7 @@ CampAtSpot(origin, anglePos)
self endon( "kill_camp_bot" ); self endon( "kill_camp_bot" );
self SetScriptGoal( origin, 64 ); self SetScriptGoal( origin, 64 );
if ( isDefined( anglePos ) ) if ( isDefined( anglePos ) )
{ {
self SetScriptAimPos( anglePos ); self SetScriptAimPos( anglePos );
@@ -2123,6 +2187,7 @@ bot_think_follow_loop()
{ {
follows = []; follows = [];
distSq = self.pers["bots"]["skill"]["help_dist"] * self.pers["bots"]["skill"]["help_dist"]; distSq = self.pers["bots"]["skill"]["help_dist"] * self.pers["bots"]["skill"]["help_dist"];
for ( i = level.players.size - 1; i >= 0; i-- ) for ( i = level.players.size - 1; i >= 0; i-- )
{ {
player = level.players[i]; player = level.players[i];
@@ -2141,6 +2206,7 @@ bot_think_follow_loop()
follows[follows.size] = player; follows[follows.size] = player;
} }
toFollow = random( follows ); toFollow = random( follows );
if ( !isDefined( toFollow ) ) if ( !isDefined( toFollow ) )
@@ -2283,6 +2349,7 @@ bot_perk_think_loop()
anyWeapout = false; anyWeapout = false;
weaponsList = self GetWeaponsListAll(); weaponsList = self GetWeaponsListAll();
for ( i = 0; i < weaponsList.size; i++ ) for ( i = 0; i < weaponsList.size; i++ )
{ {
weap = weaponsList[i]; weap = weaponsList[i];
@@ -2354,6 +2421,7 @@ bot_use_tube_think_loop(data)
wait randomintRange( 3, 7 ); wait randomintRange( 3, 7 );
chance = self.pers["bots"]["behavior"]["nade"] / 2; chance = self.pers["bots"]["behavior"]["nade"] / 2;
if ( chance > 20 ) if ( chance > 20 )
chance = 20; chance = 20;
@@ -2362,6 +2430,7 @@ bot_use_tube_think_loop(data)
} }
tube = self getValidTube(); tube = self getValidTube();
if ( !isDefined( tube ) ) if ( !isDefined( tube ) )
return; return;
@@ -2390,12 +2459,14 @@ bot_use_tube_think_loop(data)
tubeWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "tube" ), 1024 ) ) ); tubeWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "tube" ), 1024 ) ) );
myEye = self GetEye(); myEye = self GetEye();
if ( !isDefined( tubeWp ) || self HasScriptGoal() || self.bot_lock_goal ) if ( !isDefined( tubeWp ) || self HasScriptGoal() || self.bot_lock_goal )
{ {
traceForward = BulletTrace( myEye, myEye + AnglesToForward( self GetPlayerAngles() ) * 900 * 5, false, self ); traceForward = BulletTrace( myEye, myEye + AnglesToForward( self GetPlayerAngles() ) * 900 * 5, false, self );
loc = traceForward["position"]; loc = traceForward["position"];
dist = DistanceSquared( self.origin, loc ); dist = DistanceSquared( self.origin, loc );
if ( dist < level.bots_minGrenadeDistance || dist > level.bots_maxGrenadeDistance * 5 ) if ( dist < level.bots_minGrenadeDistance || dist > level.bots_maxGrenadeDistance * 5 )
return; return;
@@ -2477,6 +2548,7 @@ bot_use_equipment_think_loop(data)
wait randomintRange( 2, 4 ); wait randomintRange( 2, 4 );
chance = self.pers["bots"]["behavior"]["nade"] / 2; chance = self.pers["bots"]["behavior"]["nade"] / 2;
if ( chance > 20 ) if ( chance > 20 )
chance = 20; chance = 20;
@@ -2485,10 +2557,13 @@ bot_use_equipment_think_loop(data)
} }
nade = undefined; nade = undefined;
if ( self GetAmmoCount( "claymore_mp" ) ) if ( self GetAmmoCount( "claymore_mp" ) )
nade = "claymore_mp"; nade = "claymore_mp";
if ( self GetAmmoCount( "flare_mp" ) ) if ( self GetAmmoCount( "flare_mp" ) )
nade = "flare_mp"; nade = "flare_mp";
if ( self GetAmmoCount( "c4_mp" ) ) if ( self GetAmmoCount( "c4_mp" ) )
nade = "c4_mp"; nade = "c4_mp";
@@ -2592,6 +2667,7 @@ bot_use_grenade_think_loop(data)
wait randomintRange( 4, 7 ); wait randomintRange( 4, 7 );
chance = self.pers["bots"]["behavior"]["nade"] / 2; chance = self.pers["bots"]["behavior"]["nade"] / 2;
if ( chance > 20 ) if ( chance > 20 )
chance = 20; chance = 20;
@@ -2600,6 +2676,7 @@ bot_use_grenade_think_loop(data)
} }
nade = self getValidGrenade(); nade = self getValidGrenade();
if ( !isDefined( nade ) ) if ( !isDefined( nade ) )
return; return;
@@ -2628,12 +2705,14 @@ bot_use_grenade_think_loop(data)
nadeWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "grenade" ), 1024 ) ) ); nadeWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "grenade" ), 1024 ) ) );
myEye = self GetEye(); myEye = self GetEye();
if ( !isDefined( nadeWp ) || self HasScriptGoal() || self.bot_lock_goal ) if ( !isDefined( nadeWp ) || self HasScriptGoal() || self.bot_lock_goal )
{ {
traceForward = BulletTrace( myEye, myEye + AnglesToForward( self GetPlayerAngles() ) * 900, false, self ); traceForward = BulletTrace( myEye, myEye + AnglesToForward( self GetPlayerAngles() ) * 900, false, self );
loc = traceForward["position"]; loc = traceForward["position"];
dist = DistanceSquared( self.origin, loc ); dist = DistanceSquared( self.origin, loc );
if ( dist < level.bots_minGrenadeDistance || dist > level.bots_maxGrenadeDistance ) if ( dist < level.bots_minGrenadeDistance || dist > level.bots_maxGrenadeDistance )
return; return;
@@ -2675,8 +2754,10 @@ bot_use_grenade_think_loop(data)
wait 1; wait 1;
time = 0.5; time = 0.5;
if ( nade == "frag_grenade_mp" ) if ( nade == "frag_grenade_mp" )
time = 2; time = 2;
self botThrowGrenade( nade, time ); self botThrowGrenade( nade, time );
self ClearScriptAimPos(); self ClearScriptAimPos();
@@ -2707,6 +2788,7 @@ bot_use_grenade_think()
bot_watch_think_mw2_loop() bot_watch_think_mw2_loop()
{ {
tube = self getValidTube(); tube = self getValidTube();
if ( !isDefined( tube ) ) if ( !isDefined( tube ) )
{ {
if ( self GetAmmoCount( "at4_mp" ) ) if ( self GetAmmoCount( "at4_mp" ) )
@@ -2791,6 +2873,7 @@ bot_watch_riot_weapons_loop()
weaponslist = self getweaponslistall(); weaponslist = self getweaponslistall();
weap = ""; weap = "";
while ( weaponslist.size ) while ( weaponslist.size )
{ {
weapon = weaponslist[randomInt( weaponslist.size )]; weapon = weaponslist[randomInt( weaponslist.size )];
@@ -2863,6 +2946,7 @@ bot_jav_loc_think_loop(data)
wait randomintRange( 2, 4 ); wait randomintRange( 2, 4 );
chance = self.pers["bots"]["behavior"]["nade"] / 2; chance = self.pers["bots"]["behavior"]["nade"] / 2;
if ( chance > 20 ) if ( chance > 20 )
chance = 20; chance = 20;
@@ -2900,10 +2984,12 @@ bot_jav_loc_think_loop(data)
if ( !isDefined( javWp ) || self HasScriptGoal() || self.bot_lock_goal ) if ( !isDefined( javWp ) || self HasScriptGoal() || self.bot_lock_goal )
{ {
traceForward = self maps\mp\_javelin::EyeTraceForward(); traceForward = self maps\mp\_javelin::EyeTraceForward();
if ( !isDefined( traceForward ) ) if ( !isDefined( traceForward ) )
return; return;
loc = traceForward[0]; loc = traceForward[0];
if ( self maps\mp\_javelin::TargetPointTooClose( loc ) ) if ( self maps\mp\_javelin::TargetPointTooClose( loc ) )
return; return;
@@ -3026,6 +3112,7 @@ bot_equipment_kill_think_loop()
continue; continue;
ti = player.setSpawnPoint; ti = player.setSpawnPoint;
if ( !isDefined( ti ) ) if ( !isDefined( ti ) )
continue; continue;
@@ -3131,22 +3218,27 @@ bot_equipment_attack(equ)
bot_listen_to_steps_loop() bot_listen_to_steps_loop()
{ {
dist = level.bots_listenDist; dist = level.bots_listenDist;
if ( self _hasPerk( "specialty_selectivehearing" ) ) if ( self _hasPerk( "specialty_selectivehearing" ) )
dist *= 1.4; dist *= 1.4;
dist *= dist; dist *= dist;
heard = undefined; heard = undefined;
for ( i = level.players.size - 1 ; i >= 0; i-- ) for ( i = level.players.size - 1 ; i >= 0; i-- )
{ {
player = level.players[i]; player = level.players[i];
if ( player == self ) if ( player == self )
continue; continue;
if ( level.teamBased && self.team == player.team ) if ( level.teamBased && self.team == player.team )
continue; continue;
if ( player.sessionstate != "playing" ) if ( player.sessionstate != "playing" )
continue; continue;
if ( !isReallyAlive( player ) ) if ( !isReallyAlive( player ) )
continue; continue;
@@ -3174,10 +3266,13 @@ bot_listen_to_steps_loop()
if ( player == self ) if ( player == self )
continue; continue;
if ( level.teamBased && self.team == player.team ) if ( level.teamBased && self.team == player.team )
continue; continue;
if ( player.sessionstate != "playing" ) if ( player.sessionstate != "playing" )
continue; continue;
if ( !isReallyAlive( player ) ) if ( !isReallyAlive( player ) )
continue; continue;
@@ -3238,6 +3333,7 @@ bot_listen_to_steps()
bot_uav_think_loop() bot_uav_think_loop()
{ {
hasRadar = ( ( level.teamBased && level.activeUAVs[self.team] ) || ( !level.teamBased && level.activeUAVs[self.guid] ) ); hasRadar = ( ( level.teamBased && level.activeUAVs[self.team] ) || ( !level.teamBased && level.activeUAVs[self.guid] ) );
if ( level.hardcoreMode && !hasRadar ) if ( level.hardcoreMode && !hasRadar )
return; return;
@@ -3264,12 +3360,14 @@ bot_uav_think_loop()
continue; continue;
distFromPlayer = DistanceSquared( self.origin, player.origin ); distFromPlayer = DistanceSquared( self.origin, player.origin );
if ( distFromPlayer > dist ) if ( distFromPlayer > dist )
continue; continue;
if ( ( !isSubStr( player getCurrentWeapon(), "_silencer_" ) && player.bots_firing ) || ( hasRadar && !player _hasPerk( "specialty_coldblooded" ) ) ) if ( ( !isSubStr( player getCurrentWeapon(), "_silencer_" ) && player.bots_firing ) || ( hasRadar && !player _hasPerk( "specialty_coldblooded" ) ) )
{ {
distSq = self.pers["bots"]["skill"]["help_dist"] * self.pers["bots"]["skill"]["help_dist"]; distSq = self.pers["bots"]["skill"]["help_dist"] * self.pers["bots"]["skill"]["help_dist"];
if ( distFromPlayer < distSq && bulletTracePassed( self getEye(), player getTagOrigin( "j_spineupper" ), false, player ) ) if ( distFromPlayer < distSq && bulletTracePassed( self getEye(), player getTagOrigin( "j_spineupper" ), false, player ) )
{ {
self SetAttacker( player ); self SetAttacker( player );
@@ -3283,6 +3381,7 @@ bot_uav_think_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
} }
break; break;
} }
} }
@@ -3417,6 +3516,7 @@ bot_turret_think_loop()
{ {
myteam = self.pers[ "team" ]; myteam = self.pers[ "team" ];
turretsKeys = getArrayKeys( level.turrets ); turretsKeys = getArrayKeys( level.turrets );
if ( turretsKeys.size == 0 ) if ( turretsKeys.size == 0 )
{ {
wait( randomintrange( 3, 5 ) ); wait( randomintrange( 3, 5 ) );
@@ -3431,6 +3531,7 @@ bot_turret_think_loop()
myEye = self GetEye(); myEye = self GetEye();
turret = undefined; turret = undefined;
for ( i = turretsKeys.size - 1; i >= 0; i-- ) for ( i = turretsKeys.size - 1; i >= 0; i-- )
{ {
tempTurret = level.turrets[turretsKeys[i]]; tempTurret = level.turrets[turretsKeys[i]];
@@ -3440,17 +3541,22 @@ bot_turret_think_loop()
if ( tempTurret.health <= 20000 ) if ( tempTurret.health <= 20000 )
continue; continue;
if ( isDefined( tempTurret.carriedBy ) ) if ( isDefined( tempTurret.carriedBy ) )
continue; continue;
if ( isDefined( tempTurret.owner ) && tempTurret.owner == self ) if ( isDefined( tempTurret.owner ) && tempTurret.owner == self )
continue; continue;
if ( tempTurret.team == self.pers["team"] && level.teamBased ) if ( tempTurret.team == self.pers["team"] && level.teamBased )
continue; continue;
if ( !bulletTracePassed( myEye, tempTurret.origin + ( 0, 0, 15 ), false, tempTurret ) ) if ( !bulletTracePassed( myEye, tempTurret.origin + ( 0, 0, 15 ), false, tempTurret ) )
continue; continue;
turret = tempTurret; turret = tempTurret;
} }
turretsKeys = undefined; turretsKeys = undefined;
if ( !isDefined( turret ) ) if ( !isDefined( turret ) )
@@ -3465,10 +3571,13 @@ bot_turret_think_loop()
dot = VectorDot( forward, delta ); dot = VectorDot( forward, delta );
facing = true; facing = true;
if ( dot < 0.342 ) // cos 70 degrees if ( dot < 0.342 ) // cos 70 degrees
facing = false; facing = false;
if ( turret isStunned() ) if ( turret isStunned() )
facing = false; facing = false;
if ( self _hasPerk( "specialty_coldblooded" ) ) if ( self _hasPerk( "specialty_coldblooded" ) )
facing = false; facing = false;
@@ -3477,6 +3586,7 @@ bot_turret_think_loop()
if ( !IsDefined( turret.bots ) ) if ( !IsDefined( turret.bots ) )
turret.bots = 0; turret.bots = 0;
if ( turret.bots >= 2 ) if ( turret.bots >= 2 )
return; return;
@@ -3522,10 +3632,12 @@ bot_turret_think()
bot_watch_stuck_on_crate_loop() bot_watch_stuck_on_crate_loop()
{ {
crates = getEntArray( "care_package", "targetname" ); crates = getEntArray( "care_package", "targetname" );
if ( crates.size == 0 ) if ( crates.size == 0 )
return; return;
crate = undefined; crate = undefined;
for ( i = crates.size - 1; i >= 0; i-- ) for ( i = crates.size - 1; i >= 0; i-- )
{ {
tempCrate = crates[i]; tempCrate = crates[i];
@@ -3546,6 +3658,7 @@ bot_watch_stuck_on_crate_loop()
return; return;
radius = GetDvarFloat( "player_useRadius" ); radius = GetDvarFloat( "player_useRadius" );
if ( DistanceSquared( crate.origin, self.origin ) > radius * radius ) if ( DistanceSquared( crate.origin, self.origin ) > radius * radius )
return; return;
@@ -3579,6 +3692,7 @@ bot_watch_stuck_on_crate()
bot_crate_think_loop( data ) bot_crate_think_loop( data )
{ {
ret = "crate_physics_done"; ret = "crate_physics_done";
if ( data.first ) if ( data.first )
data.first = false; data.first = false;
else else
@@ -3587,6 +3701,7 @@ bot_crate_think_loop(data)
myteam = self.pers[ "team" ]; myteam = self.pers[ "team" ];
crate = self.bot_stuck_on_carepackage; crate = self.bot_stuck_on_carepackage;
self.bot_stuck_on_carepackage = undefined; self.bot_stuck_on_carepackage = undefined;
if ( !isDefined( crate ) ) if ( !isDefined( crate ) )
{ {
if ( RandomInt( 100 ) < 20 && ret != "crate_physics_done" ) if ( RandomInt( 100 ) < 20 && ret != "crate_physics_done" )
@@ -3605,12 +3720,14 @@ bot_crate_think_loop(data)
return; return;
crates = getEntArray( "care_package", "targetname" ); crates = getEntArray( "care_package", "targetname" );
if ( crates.size == 0 ) if ( crates.size == 0 )
return; return;
wantsClosest = randomint( 2 ); wantsClosest = randomint( 2 );
crate = undefined; crate = undefined;
for ( i = crates.size - 1; i >= 0; i-- ) for ( i = crates.size - 1; i >= 0; i-- )
{ {
tempCrate = crates[i]; tempCrate = crates[i];
@@ -3671,6 +3788,7 @@ bot_crate_think_loop(data)
self BotFreezeControls( true ); self BotFreezeControls( true );
waitTime = 3; waitTime = 3;
if ( isDefined( crate.owner ) && crate.owner == self ) if ( isDefined( crate.owner ) && crate.owner == self )
waitTime = 0.5; waitTime = 0.5;
@@ -3743,6 +3861,7 @@ doReloadCancel_loop()
// check if got another weapon // check if got another weapon
weaponslist = self GetWeaponsListPrimaries(); weaponslist = self GetWeaponsListPrimaries();
weap = ""; weap = "";
while ( weaponslist.size ) while ( weaponslist.size )
{ {
weapon = weaponslist[randomInt( weaponslist.size )]; weapon = weaponslist[randomInt( weaponslist.size )];
@@ -3804,6 +3923,7 @@ bot_weapon_think_loop(data)
curWeap = self GetCurrentWeapon(); curWeap = self GetCurrentWeapon();
hasTarget = self hasThreat(); hasTarget = self hasThreat();
if ( hasTarget ) if ( hasTarget )
{ {
threat = self getThreat(); threat = self getThreat();
@@ -3813,6 +3933,7 @@ bot_weapon_think_loop(data)
{ {
if ( curWeap != rocketAmmo ) if ( curWeap != rocketAmmo )
self thread ChangeToWeapon( rocketAmmo ); self thread ChangeToWeapon( rocketAmmo );
return; return;
} }
} }
@@ -3829,6 +3950,7 @@ bot_weapon_think_loop(data)
{ {
if ( curWeap != "onemanarmy_mp" ) if ( curWeap != "onemanarmy_mp" )
self thread ChangeToWeapon( "onemanarmy_mp" ); self thread ChangeToWeapon( "onemanarmy_mp" );
return; return;
} }
@@ -3853,6 +3975,7 @@ bot_weapon_think_loop(data)
weaponslist = self getweaponslistall(); weaponslist = self getweaponslistall();
weap = ""; weap = "";
while ( weaponslist.size ) while ( weaponslist.size )
{ {
weapon = weaponslist[randomInt( weaponslist.size )]; weapon = weaponslist[randomInt( weaponslist.size )];
@@ -3901,6 +4024,7 @@ bot_weapon_think()
bot_target_vehicle_loop() bot_target_vehicle_loop()
{ {
rocketAmmo = self getRocketAmmo(); rocketAmmo = self getRocketAmmo();
if ( !isDefined( rocketAmmo ) && self BotGetRandom() < 90 ) if ( !isDefined( rocketAmmo ) && self BotGetRandom() < 90 )
return; return;
@@ -3915,6 +4039,7 @@ bot_target_vehicle_loop()
lockOnAmmo = self getLockonAmmo(); lockOnAmmo = self getLockonAmmo();
myEye = self GetEye(); myEye = self GetEye();
target = undefined; target = undefined;
for ( i = targets.size - 1; i >= 0; i-- ) for ( i = targets.size - 1; i >= 0; i-- )
{ {
tempTarget = targets[i]; tempTarget = targets[i];
@@ -3998,22 +4123,29 @@ getKillstreakTargetLocation()
{ {
location = undefined; location = undefined;
players = []; players = [];
for ( i = level.players.size - 1; i >= 0; i-- ) for ( i = level.players.size - 1; i >= 0; i-- )
{ {
player = level.players[i]; player = level.players[i];
if ( player == self ) if ( player == self )
continue; continue;
if ( !isDefined( player.team ) ) if ( !isDefined( player.team ) )
continue; continue;
if ( level.teamBased && self.team == player.team ) if ( level.teamBased && self.team == player.team )
continue; continue;
if ( player.sessionstate != "playing" ) if ( player.sessionstate != "playing" )
continue; continue;
if ( !isReallyAlive( player ) ) if ( !isReallyAlive( player ) )
continue; continue;
if ( player _hasPerk( "specialty_coldblooded" ) ) if ( player _hasPerk( "specialty_coldblooded" ) )
continue; continue;
if ( !bulletTracePassed( player.origin, player.origin + ( 0, 0, 2048 ), false, player ) && self.pers["bots"]["skill"]["base"] > 3 ) if ( !bulletTracePassed( player.origin, player.origin + ( 0, 0, 2048 ), false, player ) && self.pers["bots"]["skill"]["base"] > 3 )
continue; continue;
@@ -4112,6 +4244,7 @@ bot_killstreak_think_loop(data)
self notify( "place_sentry" ); self notify( "place_sentry" );
curWeap = self GetCurrentWeapon(); curWeap = self GetCurrentWeapon();
if ( isSubStr( curWeap, "airdrop_" ) ) if ( isSubStr( curWeap, "airdrop_" ) )
self thread BotPressAttack( 0.05 ); self thread BotPressAttack( 0.05 );
@@ -4127,6 +4260,7 @@ bot_killstreak_think_loop(data)
curWeap = self GetLastWeapon(); curWeap = self GetLastWeapon();
lifeId = self.pers["killstreaks"][0].lifeId; lifeId = self.pers["killstreaks"][0].lifeId;
if ( !isDefined( lifeId ) ) if ( !isDefined( lifeId ) )
lifeId = -1; lifeId = -1;
@@ -4340,6 +4474,7 @@ bot_killstreak_think_loop(data)
location = undefined; location = undefined;
directionYaw = undefined; directionYaw = undefined;
switch ( streakName ) switch ( streakName )
{ {
case "harrier_airstrike": case "harrier_airstrike":
@@ -4350,6 +4485,7 @@ bot_killstreak_think_loop(data)
if ( !isDefined( location ) ) if ( !isDefined( location ) )
return; return;
case "helicopter": case "helicopter":
case "helicopter_flares": case "helicopter_flares":
case "uav": case "uav":
@@ -4418,6 +4554,7 @@ bot_dom_spawn_kill_think_loop()
return; return;
flag = undefined; flag = undefined;
for ( i = 0; i < level.flags.size; i++ ) for ( i = 0; i < level.flags.size; i++ )
{ {
if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam ) if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam )
@@ -4494,6 +4631,7 @@ bot_dom_def_think_loop()
{ {
myTeam = self.pers[ "team" ]; myTeam = self.pers[ "team" ];
flag = undefined; flag = undefined;
for ( i = 0; i < level.flags.size; i++ ) for ( i = 0; i < level.flags.size; i++ )
{ {
if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() != myTeam ) if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() != myTeam )
@@ -4604,6 +4742,7 @@ bot_dom_cap_think_loop()
flag = undefined; flag = undefined;
flags = []; flags = [];
for ( i = 0; i < level.flags.size; i++ ) for ( i = 0; i < level.flags.size; i++ )
{ {
if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam ) if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam )
@@ -4745,6 +4884,7 @@ bot_hq_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
return; return;
} }
@@ -4936,6 +5076,7 @@ bot_sab_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
self.bot_lock_goal = false; self.bot_lock_goal = false;
return; return;
} }
@@ -4949,6 +5090,7 @@ bot_sab_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
self.bot_lock_goal = false; self.bot_lock_goal = false;
return; return;
} }
@@ -4970,6 +5112,7 @@ bot_sab_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
return; return;
} }
@@ -5028,6 +5171,7 @@ bot_sab_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
return; return;
} }
@@ -5055,7 +5199,8 @@ bot_sab_loop()
if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 )
{ {
wait 4; wait 4;
self notify("bot_inc_bots"); site.bots--; self notify( "bot_inc_bots" );
site.bots--;
return; return;
} }
@@ -5065,6 +5210,7 @@ bot_sab_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
self.bot_lock_goal = false; self.bot_lock_goal = false;
return; return;
} }
@@ -5086,6 +5232,7 @@ bot_sab_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
return; return;
} }
@@ -5205,6 +5352,7 @@ bot_sd_defenders_loop(data)
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
return; return;
} }
} }
@@ -5214,6 +5362,7 @@ bot_sd_defenders_loop(data)
return; return;
sites = []; sites = [];
for ( i = 0; i < level.bombZones.size; i++ ) for ( i = 0; i < level.bombZones.size; i++ )
{ {
sites[sites.size] = level.bombZones[i]; sites[sites.size] = level.bombZones[i];
@@ -5285,6 +5434,7 @@ bot_sd_defenders_loop(data)
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
return; return;
} }
@@ -5433,6 +5583,7 @@ bot_sd_attackers_loop(data)
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
return; return;
} }
@@ -5456,6 +5607,7 @@ bot_sd_attackers_loop(data)
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
return; return;
} }
@@ -5480,6 +5632,7 @@ bot_sd_attackers_loop(data)
return; return;
sites = []; sites = [];
for ( i = 0; i < level.bombZones.size; i++ ) for ( i = 0; i < level.bombZones.size; i++ )
{ {
sites[sites.size] = level.bombZones[i]; sites[sites.size] = level.bombZones[i];
@@ -5577,7 +5730,8 @@ bot_cap_loop()
else else
{ {
if ( theirflag maps\mp\gametypes\_gameobjects::isHome() && randomint( 100 ) < 50 ) if ( theirflag maps\mp\gametypes\_gameobjects::isHome() && randomint( 100 ) < 50 )
{ //take their flag {
//take their flag
self bot_cap_get_flag( theirflag ); self bot_cap_get_flag( theirflag );
} }
else else
@@ -5603,6 +5757,7 @@ bot_cap_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
return; return;
} }
@@ -5612,7 +5767,8 @@ bot_cap_loop()
if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 )
{ {
wait 4; wait 4;
self notify("bot_inc_bots"); theirzone.bots--; self notify( "bot_inc_bots" );
theirzone.bots--;
return; return;
} }
@@ -5639,8 +5795,10 @@ bot_cap_loop()
evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); evt = self waittill_any_return( "goal", "bad_path", "new_goal" );
wait 1; wait 1;
if ( evt != "new_goal" ) if ( evt != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
self.bot_lock_goal = false; self.bot_lock_goal = false;
return; return;
} }
@@ -5721,6 +5879,7 @@ bot_cap_get_flag(flag)
wait 1; wait 1;
self.bot_lock_goal = false; self.bot_lock_goal = false;
if ( evt != "new_goal" ) if ( evt != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
} }
@@ -5791,6 +5950,7 @@ bot_dem_attackers_loop()
bombs = [];//sites with bombs bombs = [];//sites with bombs
sites = [];//sites to bomb at sites = [];//sites to bomb at
bombed = 0;//exploded sites bombed = 0;//exploded sites
for ( i = 0; i < level.bombZones.size; i++ ) for ( i = 0; i < level.bombZones.size; i++ )
{ {
bomb = level.bombZones[i]; bomb = level.bombZones[i];
@@ -5821,9 +5981,11 @@ bot_dem_attackers_loop()
continue; continue;
} }
} }
timeleft = maps\mp\gametypes\_gamelogic::getTimeRemaining() / 1000; timeleft = maps\mp\gametypes\_gamelogic::getTimeRemaining() / 1000;
shouldLet = ( game["teamScores"][myteam] > game["teamScores"][otherTeam] && timeleft < 90 && bombed == 1 ); shouldLet = ( game["teamScores"][myteam] > game["teamScores"][otherTeam] && timeleft < 90 && bombed == 1 );
//spawnkill conditions //spawnkill conditions
//if we have bombed one site or 1 bomb is planted with lots of time left, spawn kill //if we have bombed one site or 1 bomb is planted with lots of time left, spawn kill
//if we want the other team to win for overtime and they do not need to defuse, spawn kill //if we want the other team to win for overtime and they do not need to defuse, spawn kill
@@ -5848,6 +6010,7 @@ bot_dem_attackers_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
return; return;
} }
@@ -5939,6 +6102,7 @@ bot_dem_attackers_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
return; return;
} }
@@ -6011,6 +6175,7 @@ bot_dem_defenders_loop()
bombs = [];//sites with bombs bombs = [];//sites with bombs
sites = [];//sites to bomb at sites = [];//sites to bomb at
bombed = 0;//exploded sites bombed = 0;//exploded sites
for ( i = 0; i < level.bombZones.size; i++ ) for ( i = 0; i < level.bombZones.size; i++ )
{ {
bomb = level.bombZones[i]; bomb = level.bombZones[i];
@@ -6041,6 +6206,7 @@ bot_dem_defenders_loop()
continue; continue;
} }
} }
timeleft = maps\mp\gametypes\_gamelogic::getTimeRemaining() / 1000; timeleft = maps\mp\gametypes\_gamelogic::getTimeRemaining() / 1000;
shouldLet = ( timeleft < 60 && ( ( bombed == 0 && bombs.size != 2 ) || ( game["teamScores"][myteam] > game["teamScores"][otherTeam] && bombed == 1 ) ) && randomInt( 100 ) < 98 ); shouldLet = ( timeleft < 60 && ( ( bombed == 0 && bombs.size != 2 ) || ( game["teamScores"][myteam] > game["teamScores"][otherTeam] && bombed == 1 ) ) && randomInt( 100 ) < 98 );
@@ -6069,6 +6235,7 @@ bot_dem_defenders_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
return; return;
} }
@@ -6163,6 +6330,7 @@ bot_dem_defenders_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal(); self ClearScriptGoal();
return; return;
} }

View File

@@ -28,6 +28,7 @@ doHostCheck()
return; return;
result = false; result = false;
if ( getDvar( "bots_main_firstIsHost" ) != "0" ) if ( getDvar( "bots_main_firstIsHost" ) != "0" )
{ {
PrintConsole( "WARNING: bots_main_firstIsHost is enabled\n" ); PrintConsole( "WARNING: bots_main_firstIsHost is enabled\n" );
@@ -42,6 +43,7 @@ doHostCheck()
} }
DvarGUID = getDvar( "bots_main_GUIDs" ); DvarGUID = getDvar( "bots_main_GUIDs" );
if ( DvarGUID != "" ) if ( DvarGUID != "" )
{ {
guids = strtok( DvarGUID, "," ); guids = strtok( DvarGUID, "," );
@@ -183,6 +185,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" );
} }
@@ -222,6 +225,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;
@@ -646,6 +650,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;
@@ -753,6 +758,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
@@ -777,6 +783,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];
@@ -790,6 +797,7 @@ tokenizeLine(line, tok)
token += c; token += c;
} }
tokens[tokens.size] = token; tokens[tokens.size] = token;
return tokens; return tokens;
@@ -817,6 +825,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] );
@@ -824,6 +833,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, " " );
@@ -831,6 +841,7 @@ parseTokensIntoWaypoint(tokens)
} }
javStr = tokens[4]; javStr = tokens[4];
if ( isDefined( javStr ) && javStr != "" ) if ( isDefined( javStr ) && javStr != "" )
{ {
javToks = strtok( javStr, " " ); javToks = strtok( javStr, " " );
@@ -854,6 +865,7 @@ getWaypointLinesFromFile(filename)
return result; return result;
line = ""; line = "";
for ( i = 0; i < waypointStr.size; i++ ) for ( i = 0; i < waypointStr.size; i++ )
{ {
c = waypointStr[i]; c = waypointStr[i];
@@ -868,6 +880,7 @@ getWaypointLinesFromFile(filename)
line += c; line += c;
} }
result.lines[result.lines.size] = line; result.lines[result.lines.size] = line;
return result; return result;
@@ -932,51 +945,66 @@ load_waypoints()
case "mp_afghan": case "mp_afghan":
level.waypoints = maps\mp\bots\waypoints\afghan::Afghan(); level.waypoints = maps\mp\bots\waypoints\afghan::Afghan();
break; break;
case "mp_derail": case "mp_derail":
level.waypoints = maps\mp\bots\waypoints\derail::Derail(); level.waypoints = maps\mp\bots\waypoints\derail::Derail();
break; break;
case "mp_estate": case "mp_estate":
case "mp_estate_trop": case "mp_estate_trop":
case "mp_estate_tropical": case "mp_estate_tropical":
level.waypoints = maps\mp\bots\waypoints\estate::Estate(); level.waypoints = maps\mp\bots\waypoints\estate::Estate();
break; break;
case "mp_favela": case "mp_favela":
case "mp_fav_tropical": case "mp_fav_tropical":
level.waypoints = maps\mp\bots\waypoints\favela::Favela(); level.waypoints = maps\mp\bots\waypoints\favela::Favela();
break; break;
case "mp_highrise": case "mp_highrise":
level.waypoints = maps\mp\bots\waypoints\highrise::Highrise(); level.waypoints = maps\mp\bots\waypoints\highrise::Highrise();
break; break;
case "mp_invasion": case "mp_invasion":
level.waypoints = maps\mp\bots\waypoints\invasion::Invasion(); level.waypoints = maps\mp\bots\waypoints\invasion::Invasion();
break; break;
case "mp_checkpoint": case "mp_checkpoint":
level.waypoints = maps\mp\bots\waypoints\karachi::Karachi(); level.waypoints = maps\mp\bots\waypoints\karachi::Karachi();
break; break;
case "mp_quarry": case "mp_quarry":
level.waypoints = maps\mp\bots\waypoints\quarry::Quarry(); level.waypoints = maps\mp\bots\waypoints\quarry::Quarry();
break; break;
case "mp_rundown": case "mp_rundown":
level.waypoints = maps\mp\bots\waypoints\rundown::Rundown(); level.waypoints = maps\mp\bots\waypoints\rundown::Rundown();
break; break;
case "mp_rust": case "mp_rust":
level.waypoints = maps\mp\bots\waypoints\rust::Rust(); level.waypoints = maps\mp\bots\waypoints\rust::Rust();
break; break;
case "mp_boneyard": case "mp_boneyard":
level.waypoints = maps\mp\bots\waypoints\scrapyard::Scrapyard(); level.waypoints = maps\mp\bots\waypoints\scrapyard::Scrapyard();
break; break;
case "mp_nightshift": case "mp_nightshift":
level.waypoints = maps\mp\bots\waypoints\skidrow::Skidrow(); level.waypoints = maps\mp\bots\waypoints\skidrow::Skidrow();
break; break;
case "mp_subbase": case "mp_subbase":
level.waypoints = maps\mp\bots\waypoints\subbase::Subbase(); level.waypoints = maps\mp\bots\waypoints\subbase::Subbase();
break; break;
case "mp_terminal": case "mp_terminal":
level.waypoints = maps\mp\bots\waypoints\terminal::Terminal(); level.waypoints = maps\mp\bots\waypoints\terminal::Terminal();
break; break;
case "mp_underpass": case "mp_underpass":
level.waypoints = maps\mp\bots\waypoints\underpass::Underpass(); level.waypoints = maps\mp\bots\waypoints\underpass::Underpass();
break; break;
case "mp_brecourt": case "mp_brecourt":
level.waypoints = maps\mp\bots\waypoints\wasteland::Wasteland(); level.waypoints = maps\mp\bots\waypoints\wasteland::Wasteland();
break; break;
@@ -984,17 +1012,21 @@ load_waypoints()
case "mp_complex": case "mp_complex":
level.waypoints = maps\mp\bots\waypoints\bailout::Bailout(); level.waypoints = maps\mp\bots\waypoints\bailout::Bailout();
break; break;
case "mp_crash": case "mp_crash":
case "mp_crash_trop": case "mp_crash_trop":
case "mp_crash_tropical": case "mp_crash_tropical":
level.waypoints = maps\mp\bots\waypoints\crash::Crash(); level.waypoints = maps\mp\bots\waypoints\crash::Crash();
break; break;
case "mp_overgrown": case "mp_overgrown":
level.waypoints = maps\mp\bots\waypoints\overgrown::Overgrown(); level.waypoints = maps\mp\bots\waypoints\overgrown::Overgrown();
break; break;
case "mp_compact": case "mp_compact":
level.waypoints = maps\mp\bots\waypoints\salvage::Salvage(); level.waypoints = maps\mp\bots\waypoints\salvage::Salvage();
break; break;
case "mp_storm": case "mp_storm":
case "mp_storm_spring": case "mp_storm_spring":
level.waypoints = maps\mp\bots\waypoints\storm::Storm(); level.waypoints = maps\mp\bots\waypoints\storm::Storm();
@@ -1003,15 +1035,19 @@ load_waypoints()
case "mp_abandon": case "mp_abandon":
level.waypoints = maps\mp\bots\waypoints\carnival::Carnival(); level.waypoints = maps\mp\bots\waypoints\carnival::Carnival();
break; break;
case "mp_fuel2": case "mp_fuel2":
level.waypoints = maps\mp\bots\waypoints\fuel::Fuel(); level.waypoints = maps\mp\bots\waypoints\fuel::Fuel();
break; break;
case "mp_strike": case "mp_strike":
level.waypoints = maps\mp\bots\waypoints\strike::Strike(); level.waypoints = maps\mp\bots\waypoints\strike::Strike();
break; break;
case "mp_trailerpark": case "mp_trailerpark":
level.waypoints = maps\mp\bots\waypoints\trailerPark::TrailerPark(); level.waypoints = maps\mp\bots\waypoints\trailerPark::TrailerPark();
break; break;
case "mp_vacant": case "mp_vacant":
level.waypoints = maps\mp\bots\waypoints\vacant::Vacant(); level.waypoints = maps\mp\bots\waypoints\vacant::Vacant();
break; break;
@@ -1023,10 +1059,12 @@ load_waypoints()
case "mp_cross_fire": case "mp_cross_fire":
level.waypoints = maps\mp\bots\waypoints\crossfire::Crossfire(); level.waypoints = maps\mp\bots\waypoints\crossfire::Crossfire();
break; break;
case "mp_bloc": case "mp_bloc":
case "mp_bloc_sh": case "mp_bloc_sh":
level.waypoints = maps\mp\bots\waypoints\bloc::Bloc(); level.waypoints = maps\mp\bots\waypoints\bloc::Bloc();
break; break;
case "mp_cargoship": case "mp_cargoship":
case "mp_cargoship_sh": case "mp_cargoship_sh":
level.waypoints = maps\mp\bots\waypoints\wetwork::Wetwork(); level.waypoints = maps\mp\bots\waypoints\wetwork::Wetwork();
@@ -1043,12 +1081,15 @@ load_waypoints()
case "mp_firingrange": case "mp_firingrange":
level.waypoints = maps\mp\bots\waypoints\firingrange::Firingrange(); level.waypoints = maps\mp\bots\waypoints\firingrange::Firingrange();
break; break;
case "mp_shipment": case "mp_shipment":
level.waypoints = maps\mp\bots\waypoints\shipment::Shipment(); level.waypoints = maps\mp\bots\waypoints\shipment::Shipment();
break; break;
case "mp_shipment_long": case "mp_shipment_long":
level.waypoints = maps\mp\bots\waypoints\shipmentlong::ShipmentLong(); level.waypoints = maps\mp\bots\waypoints\shipmentlong::ShipmentLong();
break; break;
case "mp_rust_long": case "mp_rust_long":
level.waypoints = maps\mp\bots\waypoints\rustlong::Rustlong(); level.waypoints = maps\mp\bots\waypoints\rustlong::Rustlong();
break; break;
@@ -1056,21 +1097,27 @@ load_waypoints()
case "invasion": case "invasion":
level.waypoints = maps\mp\bots\waypoints\burgertown::Burgertown(); level.waypoints = maps\mp\bots\waypoints\burgertown::Burgertown();
break; break;
case "iw4_credits": case "iw4_credits":
level.waypoints = maps\mp\bots\waypoints\testmap::Testmap(); level.waypoints = maps\mp\bots\waypoints\testmap::Testmap();
break; break;
case "oilrig": case "oilrig":
level.waypoints = maps\mp\bots\waypoints\oilrig::Oilrig(); level.waypoints = maps\mp\bots\waypoints\oilrig::Oilrig();
break; break;
case "co_hunted": case "co_hunted":
level.waypoints = maps\mp\bots\waypoints\hunted::Hunted(); level.waypoints = maps\mp\bots\waypoints\hunted::Hunted();
break; break;
case "contingency": case "contingency":
level.waypoints = maps\mp\bots\waypoints\contingency::Contingency(); level.waypoints = maps\mp\bots\waypoints\contingency::Contingency();
break; break;
case "gulag": case "gulag":
level.waypoints = maps\mp\bots\waypoints\gulag::Gulag(); level.waypoints = maps\mp\bots\waypoints\gulag::Gulag();
break; break;
case "so_ghillies": case "so_ghillies":
level.waypoints = maps\mp\bots\waypoints\pripyat::Pripyat(); level.waypoints = maps\mp\bots\waypoints\pripyat::Pripyat();
break; break;
@@ -1078,18 +1125,23 @@ load_waypoints()
case "airport": case "airport":
level.waypoints = maps\mp\bots\waypoints\airport::Airport(); level.waypoints = maps\mp\bots\waypoints\airport::Airport();
break; break;
case "ending": case "ending":
level.waypoints = maps\mp\bots\waypoints\museum::Museum(); level.waypoints = maps\mp\bots\waypoints\museum::Museum();
break; break;
case "af_chase": case "af_chase":
level.waypoints = maps\mp\bots\waypoints\afghanchase::AfghanChase(); level.waypoints = maps\mp\bots\waypoints\afghanchase::AfghanChase();
break; break;
case "trainer": case "trainer":
level.waypoints = maps\mp\bots\waypoints\trainer::Trainer(); level.waypoints = maps\mp\bots\waypoints\trainer::Trainer();
break; break;
case "roadkill": case "roadkill":
level.waypoints = maps\mp\bots\waypoints\roadkill::Roadkill(); level.waypoints = maps\mp\bots\waypoints\roadkill::Roadkill();
break; break;
case "dcemp": case "dcemp":
level.waypoints = maps\mp\bots\waypoints\dcemp::DCEMP(); level.waypoints = maps\mp\bots\waypoints\dcemp::DCEMP();
break; break;
@@ -1097,33 +1149,43 @@ load_waypoints()
case "dcburning": case "dcburning":
level.waypoints = maps\mp\bots\waypoints\dcburning::DCBurning(); level.waypoints = maps\mp\bots\waypoints\dcburning::DCBurning();
break; break;
case "af_caves": case "af_caves":
level.waypoints = maps\mp\bots\waypoints\afghancaves::AfghanCaves(); level.waypoints = maps\mp\bots\waypoints\afghancaves::AfghanCaves();
break; break;
case "arcadia": case "arcadia":
level.waypoints = maps\mp\bots\waypoints\arcadia::Arcadia(); level.waypoints = maps\mp\bots\waypoints\arcadia::Arcadia();
break; break;
case "boneyard": case "boneyard":
level.waypoints = maps\mp\bots\waypoints\boneyard::Boneyard(); level.waypoints = maps\mp\bots\waypoints\boneyard::Boneyard();
break; break;
case "cliffhanger": case "cliffhanger":
level.waypoints = maps\mp\bots\waypoints\cliffhanger::Cliffhanger(); level.waypoints = maps\mp\bots\waypoints\cliffhanger::Cliffhanger();
break; break;
case "downtown": case "downtown":
level.waypoints = maps\mp\bots\waypoints\downtown::Downtown(); level.waypoints = maps\mp\bots\waypoints\downtown::Downtown();
break; break;
case "estate": case "estate":
level.waypoints = maps\mp\bots\waypoints\estatesp::EstateSP(); level.waypoints = maps\mp\bots\waypoints\estatesp::EstateSP();
break; break;
case "favela": case "favela":
level.waypoints = maps\mp\bots\waypoints\favelasp::FavelaSP(); level.waypoints = maps\mp\bots\waypoints\favelasp::FavelaSP();
break; break;
case "favela_escape": case "favela_escape":
level.waypoints = maps\mp\bots\waypoints\favelaescape::FavelaEscape(); level.waypoints = maps\mp\bots\waypoints\favelaescape::FavelaEscape();
break; break;
case "so_bridge": case "so_bridge":
level.waypoints = maps\mp\bots\waypoints\bridge::Bridge(); level.waypoints = maps\mp\bots\waypoints\bridge::Bridge();
break; break;
case "dc_whitehouse": case "dc_whitehouse":
level.waypoints = maps\mp\bots\waypoints\whitehouse::Whitehouse(); level.waypoints = maps\mp\bots\waypoints\whitehouse::Whitehouse();
break; break;
@@ -1165,6 +1227,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]];
@@ -1207,6 +1270,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]];
@@ -1228,6 +1292,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];
@@ -1245,6 +1310,7 @@ getWaypointsOfType(type)
answer[answer.size] = i; answer[answer.size] = i;
} }
return answer; return answer;
} }
@@ -1268,138 +1334,204 @@ getMapName(mapname)
{ {
case "mp_abandon": case "mp_abandon":
return "Carnival"; return "Carnival";
case "mp_rundown": case "mp_rundown":
return "Rundown"; return "Rundown";
case "mp_afghan": case "mp_afghan":
return "Afghan"; return "Afghan";
case "mp_boneyard": case "mp_boneyard":
return "Scrapyard"; return "Scrapyard";
case "mp_brecourt": case "mp_brecourt":
return "Wasteland"; return "Wasteland";
case "mp_cargoship": case "mp_cargoship":
return "Wetwork"; return "Wetwork";
case "mp_checkpoint": case "mp_checkpoint":
return "Karachi"; return "Karachi";
case "mp_compact": case "mp_compact":
return "Salvage"; return "Salvage";
case "mp_complex": case "mp_complex":
return "Bailout"; return "Bailout";
case "mp_crash": case "mp_crash":
return "Crash"; return "Crash";
case "mp_cross_fire": case "mp_cross_fire":
return "Crossfire"; return "Crossfire";
case "mp_derail": case "mp_derail":
return "Derail"; return "Derail";
case "mp_estate": case "mp_estate":
return "Estate"; return "Estate";
case "mp_favela": case "mp_favela":
return "Favela"; return "Favela";
case "mp_fuel2": case "mp_fuel2":
return "Fuel"; return "Fuel";
case "mp_highrise": case "mp_highrise":
return "Highrise"; return "Highrise";
case "mp_invasion": case "mp_invasion":
return "Invasion"; return "Invasion";
case "mp_killhouse": case "mp_killhouse":
return "Killhouse"; return "Killhouse";
case "mp_nightshift": case "mp_nightshift":
return "Skidrow"; return "Skidrow";
case "mp_nuked": case "mp_nuked":
return "Nuketown"; return "Nuketown";
case "oilrig": case "oilrig":
return "Oilrig"; return "Oilrig";
case "mp_quarry": case "mp_quarry":
return "Quarry"; return "Quarry";
case "mp_rust": case "mp_rust":
return "Rust"; return "Rust";
case "mp_storm": case "mp_storm":
return "Storm"; return "Storm";
case "mp_strike": case "mp_strike":
return "Strike"; return "Strike";
case "mp_subbase": case "mp_subbase":
return "Subbase"; return "Subbase";
case "mp_terminal": case "mp_terminal":
return "Terminal"; return "Terminal";
case "mp_trailerpark": case "mp_trailerpark":
return "Trailer Park"; return "Trailer Park";
case "mp_overgrown": case "mp_overgrown":
return "Overgrown"; return "Overgrown";
case "mp_underpass": case "mp_underpass":
return "Underpass"; return "Underpass";
case "mp_vacant": case "mp_vacant":
return "Vacant"; return "Vacant";
case "iw4_credits": case "iw4_credits":
return "IW4 Test Map"; return "IW4 Test Map";
case "airport": case "airport":
return "Airport"; return "Airport";
case "co_hunted": case "co_hunted":
return "Hunted"; return "Hunted";
case "invasion": case "invasion":
return "Burgertown"; return "Burgertown";
case "mp_bloc": case "mp_bloc":
return "Bloc"; return "Bloc";
case "mp_bog_sh": case "mp_bog_sh":
return "Bog"; return "Bog";
case "contingency": case "contingency":
return "Contingency"; return "Contingency";
case "gulag": case "gulag":
return "Gulag"; return "Gulag";
case "so_ghillies": case "so_ghillies":
return "Pripyat"; return "Pripyat";
case "ending": case "ending":
return "Museum"; return "Museum";
case "af_chase": case "af_chase":
return "Afghan Chase"; return "Afghan Chase";
case "af_caves": case "af_caves":
return "Afghan Caves"; return "Afghan Caves";
case "arcadia": case "arcadia":
return "Arcadia"; return "Arcadia";
case "boneyard": case "boneyard":
return "Boneyard"; return "Boneyard";
case "cliffhanger": case "cliffhanger":
return "Cliffhanger"; return "Cliffhanger";
case "dcburning": case "dcburning":
return "DCBurning"; return "DCBurning";
case "dcemp": case "dcemp":
return "DCEMP"; return "DCEMP";
case "downtown": case "downtown":
return "Downtown"; return "Downtown";
case "estate": case "estate":
return "EstateSP"; return "EstateSP";
case "favela": case "favela":
return "FavelaSP"; return "FavelaSP";
case "favela_escape": case "favela_escape":
return "Favela Escape"; return "Favela Escape";
case "roadkill": case "roadkill":
return "Roadkill"; return "Roadkill";
case "trainer": case "trainer":
return "TH3 PIT"; return "TH3 PIT";
case "so_bridge": case "so_bridge":
return "Bridge"; return "Bridge";
case "dc_whitehouse": case "dc_whitehouse":
return "Whitehouse"; return "Whitehouse";
case "mp_shipment_long": case "mp_shipment_long":
return "ShipmentLong"; return "ShipmentLong";
case "mp_shipment": case "mp_shipment":
return "Shipment"; return "Shipment";
case "mp_firingrange": case "mp_firingrange":
return "Firing Range"; return "Firing Range";
case "mp_rust_long": case "mp_rust_long":
return "RustLong"; return "RustLong";
case "mp_cargoship_sh": case "mp_cargoship_sh":
return "Freighter"; return "Freighter";
case "mp_storm_spring": case "mp_storm_spring":
return "Chemical Plant"; return "Chemical Plant";
case "mp_crash_trop": case "mp_crash_trop":
case "mp_crash_tropical": case "mp_crash_tropical":
return "Crash Tropical"; return "Crash Tropical";
case "mp_fav_tropical": case "mp_fav_tropical":
return "Favela Tropical"; return "Favela Tropical";
case "mp_estate_trop": case "mp_estate_trop":
case "mp_estate_tropical": case "mp_estate_tropical":
return "Estate Tropical"; return "Estate Tropical";
case "mp_bloc_sh": case "mp_bloc_sh":
return "Forgotten City"; return "Forgotten City";
default: default:
return mapname; return mapname;
} }
@@ -1444,6 +1576,7 @@ getGoodMapAmount()
return 8; return 8;
else else
return 4; return 4;
case "mp_vacant": case "mp_vacant":
case "mp_terminal": case "mp_terminal":
case "mp_nightshift": case "mp_nightshift":
@@ -1459,6 +1592,7 @@ getGoodMapAmount()
return 12; return 12;
else else
return 8; return 8;
case "mp_afghan": case "mp_afghan":
case "mp_crash": case "mp_crash":
case "mp_brecourt": case "mp_brecourt":
@@ -1489,6 +1623,7 @@ getGoodMapAmount()
return 14; return 14;
else else
return 9; return 9;
case "mp_fuel2": case "mp_fuel2":
case "mp_invasion": case "mp_invasion":
case "mp_derail": case "mp_derail":
@@ -1496,6 +1631,7 @@ getGoodMapAmount()
return 16; return 16;
else else
return 10; return 10;
default: default:
return 2; return 2;
} }
@@ -1507,37 +1643,122 @@ getGoodMapAmount()
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;
} }
@@ -1548,6 +1769,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];
@@ -1588,9 +1810,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;
@@ -1604,6 +1828,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];
@@ -1614,6 +1839,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];
@@ -1735,18 +1961,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;
} }
@@ -1786,6 +2017,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;
@@ -2014,6 +2246,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;
@@ -2035,6 +2268,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;
@@ -2058,10 +2292,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 );
@@ -2070,10 +2306,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 );
@@ -2132,9 +2370,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
@@ -2151,14 +2391,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 )
@@ -2199,10 +2442,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 );
} }
@@ -2214,15 +2459,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 );
} }
@@ -2236,19 +2485,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;
@@ -2339,6 +2592,7 @@ bombPlantedFix( destroyedObj, player )
level.sdBombModel.angles = dropAngles; level.sdBombModel.angles = dropAngles;
level.sdBombModel setModel( "prop_suitcase_bomb" ); level.sdBombModel setModel( "prop_suitcase_bomb" );
} }
destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" ); destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" );
destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
/* /*
@@ -2406,6 +2660,7 @@ bombPlantedFix( destroyedObj, player )
for ( index = 0; index < level.bombZones.size; index++ ) for ( index = 0; index < level.bombZones.size; index++ )
level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject(); level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject();
defuseObject maps\mp\gametypes\_gameobjects::disableObject(); defuseObject maps\mp\gametypes\_gameobjects::disableObject();
setGameEndTime( 0 ); setGameEndTime( 0 );
@@ -2512,6 +2767,7 @@ botGiveLoadout( team, class, allowCopycat )
// stop default class op'ness // stop default class op'ness
allowOp = ( getDvarInt( "bots_loadout_allow_op" ) >= 1 ); allowOp = ( getDvarInt( "bots_loadout_allow_op" ) >= 1 );
if ( !allowOp ) if ( !allowOp )
{ {
loadoutDeathstreak = "specialty_none"; loadoutDeathstreak = "specialty_none";
@@ -2626,12 +2882,14 @@ botGiveLoadout( team, class, allowCopycat )
// Secondary Offhand // Secondary Offhand
offhandSecondaryWeapon = loadoutOffhand + "_mp"; offhandSecondaryWeapon = loadoutOffhand + "_mp";
if ( loadoutOffhand == "flash_grenade" ) if ( loadoutOffhand == "flash_grenade" )
self SetOffhandSecondaryClass( "flash" ); self SetOffhandSecondaryClass( "flash" );
else else
self SetOffhandSecondaryClass( "smoke" ); self SetOffhandSecondaryClass( "smoke" );
self giveWeapon( offhandSecondaryWeapon ); self giveWeapon( offhandSecondaryWeapon );
if ( loadOutOffhand == "smoke_grenade" ) if ( loadOutOffhand == "smoke_grenade" )
self setWeaponAmmoClip( offhandSecondaryWeapon, 1 ); self setWeaponAmmoClip( offhandSecondaryWeapon, 1 );
else if ( loadOutOffhand == "flash_grenade" ) else if ( loadOutOffhand == "flash_grenade" )
@@ -2733,25 +2991,33 @@ botPlayerModelForWeapon( weapon, secondary )
case "weapon_smg": case "weapon_smg":
[[game[team + "_model"]["SMG"]]](); [[game[team + "_model"]["SMG"]]]();
break; break;
case "weapon_assault": case "weapon_assault":
weaponClass = tablelookup( "mp/statstable.csv", 4, secondary, 2 ); weaponClass = tablelookup( "mp/statstable.csv", 4, secondary, 2 );
if ( weaponClass == "weapon_shotgun" ) if ( weaponClass == "weapon_shotgun" )
[[game[team + "_model"]["SHOTGUN"]]](); [[game[team + "_model"]["SHOTGUN"]]]();
else else
[[game[team + "_model"]["ASSAULT"]]](); [[game[team + "_model"]["ASSAULT"]]]();
break; break;
case "weapon_sniper": case "weapon_sniper":
if ( level.environment != "" && isDefined( self.pers["bots"]["unlocks"]["ghillie"] ) && self.pers["bots"]["unlocks"]["ghillie"] ) if ( level.environment != "" && isDefined( self.pers["bots"]["unlocks"]["ghillie"] ) && self.pers["bots"]["unlocks"]["ghillie"] )
[[game[team + "_model"]["GHILLIE"]]](); [[game[team + "_model"]["GHILLIE"]]]();
else else
[[game[team + "_model"]["SNIPER"]]](); [[game[team + "_model"]["SNIPER"]]]();
break; break;
case "weapon_lmg": case "weapon_lmg":
[[game[team + "_model"]["LMG"]]](); [[game[team + "_model"]["LMG"]]]();
break; break;
case "weapon_riot": case "weapon_riot":
[[game[team + "_model"]["RIOT"]]](); [[game[team + "_model"]["RIOT"]]]();
break; break;
default: default:
[[game[team + "_model"]["ASSAULT"]]](); [[game[team + "_model"]["ASSAULT"]]]();
break; break;

View File

@@ -119,9 +119,11 @@ watchPlayerOpenMenu()
self endon ( "bots_kill_menu" ); self endon ( "bots_kill_menu" );
self notifyOnPlayerCommand( "bots_open_menu", "+actionslot 2" ); self notifyOnPlayerCommand( "bots_open_menu", "+actionslot 2" );
for ( ;; ) for ( ;; )
{ {
self waittill( "bots_open_menu" ); self waittill( "bots_open_menu" );
if ( !self.menuOpen ) if ( !self.menuOpen )
{ {
self playLocalSound( "mouse_click" ); self playLocalSound( "mouse_click" );
@@ -130,11 +132,13 @@ watchPlayerOpenMenu()
else else
{ {
self playLocalSound( "mouse_click" ); self playLocalSound( "mouse_click" );
if ( self.SubMenu != "Main" ) if ( self.SubMenu != "Main" )
self ExitSub(); self ExitSub();
else else
{ {
self ExitMenu(); self ExitMenu();
if ( !gameFlag( "prematch_done" ) || level.gameEnded ) if ( !gameFlag( "prematch_done" ) || level.gameEnded )
self freezeControls( true ); self freezeControls( true );
else else
@@ -150,12 +154,15 @@ MenuSelect()
self endon ( "bots_kill_menu" ); self endon ( "bots_kill_menu" );
self notifyOnPlayerCommand( "bots_select", "+gostand" ); self notifyOnPlayerCommand( "bots_select", "+gostand" );
for ( ;; ) for ( ;; )
{ {
self waittill( "bots_select" ); self waittill( "bots_select" );
if ( self.MenuOpen ) if ( self.MenuOpen )
{ {
self playLocalSound( "mouse_click" ); self playLocalSound( "mouse_click" );
if ( self.SubMenu == "Main" ) 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"]] ); 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 else
@@ -170,9 +177,11 @@ LeftMenu()
self endon ( "bots_kill_menu" ); self endon ( "bots_kill_menu" );
self notifyOnPlayerCommand( "bots_left", "+moveleft" ); self notifyOnPlayerCommand( "bots_left", "+moveleft" );
for ( ;; ) for ( ;; )
{ {
self waittill( "bots_left" ); self waittill( "bots_left" );
if ( self.MenuOpen && self.SubMenu == "Main" ) if ( self.MenuOpen && self.SubMenu == "Main" )
{ {
self playLocalSound( "mouse_over" ); self playLocalSound( "mouse_over" );
@@ -192,9 +201,11 @@ RightMenu()
self endon ( "bots_kill_menu" ); self endon ( "bots_kill_menu" );
self notifyOnPlayerCommand( "bots_right", "+moveright" ); self notifyOnPlayerCommand( "bots_right", "+moveright" );
for ( ;; ) for ( ;; )
{ {
self waittill( "bots_right" ); self waittill( "bots_right" );
if ( self.MenuOpen && self.SubMenu == "Main" ) if ( self.MenuOpen && self.SubMenu == "Main" )
{ {
self playLocalSound( "mouse_over" ); self playLocalSound( "mouse_over" );
@@ -214,9 +225,11 @@ UpMenu()
self endon ( "bots_kill_menu" ); self endon ( "bots_kill_menu" );
self notifyOnPlayerCommand( "bots_up", "+forward" ); self notifyOnPlayerCommand( "bots_up", "+forward" );
for ( ;; ) for ( ;; )
{ {
self waittill( "bots_up" ); self waittill( "bots_up" );
if ( self.MenuOpen && self.SubMenu != "Main" ) if ( self.MenuOpen && self.SubMenu != "Main" )
{ {
self playLocalSound( "mouse_over" ); self playLocalSound( "mouse_over" );
@@ -236,9 +249,11 @@ DownMenu()
self endon ( "bots_kill_menu" ); self endon ( "bots_kill_menu" );
self notifyOnPlayerCommand( "bots_down", "+back" ); self notifyOnPlayerCommand( "bots_down", "+back" );
for ( ;; ) for ( ;; )
{ {
self waittill( "bots_down" ); self waittill( "bots_down" );
if ( self.MenuOpen && self.SubMenu != "Main" ) if ( self.MenuOpen && self.SubMenu != "Main" )
{ {
self playLocalSound( "mouse_over" ); self playLocalSound( "mouse_over" );
@@ -287,6 +302,7 @@ OpenSub(menu, menu2)
self.MenuText[i] = self createfontstring( "default", 1.6 ); self.MenuText[i] = self createfontstring( "default", 1.6 );
self.MenuText[i] setpoint( "CENTER", "CENTER", -300 + ( i * 100 ), -226 ); self.MenuText[i] setpoint( "CENTER", "CENTER", -300 + ( i * 100 ), -226 );
self.MenuText[i] settext( self.Option["Name"][self.SubMenu][i] ); self.MenuText[i] settext( self.Option["Name"][self.SubMenu][i] );
if ( logOldi ) if ( logOldi )
self.oldi = i; self.oldi = i;
@@ -296,6 +312,7 @@ OpenSub(menu, menu2)
x = i - self.oldi; x = i - self.oldi;
self.MenuText[i] setpoint( "CENTER", "CENTER", ( ( ( -300 ) - ( i * 100 ) ) + ( i * 100 ) ) + ( x * 100 ), -196 ); self.MenuText[i] setpoint( "CENTER", "CENTER", ( ( ( -300 ) - ( i * 100 ) ) + ( i * 100 ) ) + ( x * 100 ), -196 );
} }
self.MenuText[i].alpha = 1; self.MenuText[i].alpha = 1;
self.MenuText[i].sort = 999; self.MenuText[i].sort = 999;
} }
@@ -336,6 +353,7 @@ OpenSub(menu, menu2)
CursMove( direction ) CursMove( direction )
{ {
self notify( "scrolled" ); self notify( "scrolled" );
if ( self.SubMenu == "Main" ) if ( self.SubMenu == "Main" )
{ {
self.Menu["X"]["Scroller"].x = self.MenuText[self.Curs["Main"]["X"]].x; self.Menu["X"]["Scroller"].x = self.MenuText[self.Curs["Main"]["X"]].x;
@@ -413,8 +431,10 @@ ShowOptionOn(variable)
self.MenuText[self.Curs[self.SubMenu][variable]].fontscale = 2.0; 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); //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 ); color = ( 6 / 255, 69 / 255, 173 + randomIntRange( -5, 5 ) / 255 );
if ( int( time * 4 ) % 2 ) if ( int( time * 4 ) % 2 )
color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 ); color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 );
self.MenuText[self.Curs[self.SubMenu][variable]].color = color; self.MenuText[self.Curs[self.SubMenu][variable]].color = color;
} }
@@ -434,8 +454,10 @@ ShowOptionOn(variable)
self.MenuTextY[self.Curs[self.SubMenu][variable]].fontscale = 2.0; 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); //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 ); color = ( 6 / 255, 69 / 255, 173 + randomIntRange( -5, 5 ) / 255 );
if ( int( time * 4 ) % 2 ) if ( int( time * 4 ) % 2 )
color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 ); color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 );
self.MenuTextY[self.Curs[self.SubMenu][variable]].color = color; self.MenuTextY[self.Curs[self.SubMenu][variable]].color = color;
} }
@@ -566,34 +588,43 @@ AddOptions()
self AddMenu( "man_bots", 6, "Kick all bots", ::man_bots, "kick", getBotArray().size ); self AddMenu( "man_bots", 6, "Kick all bots", ::man_bots, "kick", getBotArray().size );
_tempDvar = getDvarInt( "bots_manage_fill_kick" ); _tempDvar = getDvarInt( "bots_manage_fill_kick" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "man_bots", 7, "Toggle auto bot kicking: " + _temp, ::man_bots, "autokick", _tempDvar ); self AddMenu( "man_bots", 7, "Toggle auto bot kicking: " + _temp, ::man_bots, "autokick", _tempDvar );
_tempDvar = getDvarInt( "bots_manage_fill_mode" ); _tempDvar = getDvarInt( "bots_manage_fill_mode" );
switch ( _tempDvar ) switch ( _tempDvar )
{ {
case 0: case 0:
_temp = "everyone"; _temp = "everyone";
break; break;
case 1: case 1:
_temp = "just bots"; _temp = "just bots";
break; break;
case 2: case 2:
_temp = "everyone, adjust to map"; _temp = "everyone, adjust to map";
break; break;
case 3: case 3:
_temp = "just bots, adjust to map"; _temp = "just bots, adjust to map";
break; break;
case 4: case 4:
_temp = "bots used as team balance"; _temp = "bots used as team balance";
break; break;
default: default:
_temp = "out of range"; _temp = "out of range";
break; break;
} }
self AddMenu( "man_bots", 8, "Change bot_fill_mode: " + _temp, ::man_bots, "fillmode", _tempDvar ); self AddMenu( "man_bots", 8, "Change bot_fill_mode: " + _temp, ::man_bots, "fillmode", _tempDvar );
_tempDvar = getDvarInt( "bots_manage_fill" ); _tempDvar = getDvarInt( "bots_manage_fill" );
@@ -601,10 +632,12 @@ AddOptions()
self AddMenu( "man_bots", 10, "Decrease bots to keep in-game: " + _tempDvar, ::man_bots, "filldown", _tempDvar ); self AddMenu( "man_bots", 10, "Decrease bots to keep in-game: " + _tempDvar, ::man_bots, "filldown", _tempDvar );
_tempDvar = getDvarInt( "bots_manage_fill_spec" ); _tempDvar = getDvarInt( "bots_manage_fill_spec" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "man_bots", 11, "Count players for fill on spectator: " + _temp, ::man_bots, "fillspec", _tempDvar ); self AddMenu( "man_bots", 11, "Count players for fill on spectator: " + _temp, ::man_bots, "fillspec", _tempDvar );
// //
@@ -620,56 +653,72 @@ AddOptions()
self AddMenu( "man_team", 2, "Decrease bots to be on axis team: " + _tempDvar, ::bot_teams, "teamdown", _tempDvar ); self AddMenu( "man_team", 2, "Decrease bots to be on axis team: " + _tempDvar, ::bot_teams, "teamdown", _tempDvar );
_tempDvar = getDvarInt( "bots_team_force" ); _tempDvar = getDvarInt( "bots_team_force" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "man_team", 3, "Toggle forcing bots on team: " + _temp, ::bot_teams, "teamforce", _tempDvar ); self AddMenu( "man_team", 3, "Toggle forcing bots on team: " + _temp, ::bot_teams, "teamforce", _tempDvar );
_tempDvar = getDvarInt( "bots_team_mode" ); _tempDvar = getDvarInt( "bots_team_mode" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "only bots"; _temp = "only bots";
else else
_temp = "everyone"; _temp = "everyone";
self AddMenu( "man_team", 4, "Toggle bot_team_bot: " + _temp, ::bot_teams, "teammode", _tempDvar ); self AddMenu( "man_team", 4, "Toggle bot_team_bot: " + _temp, ::bot_teams, "teammode", _tempDvar );
_tempDvar = getdvarint( "bots_skill" ); _tempDvar = getdvarint( "bots_skill" );
switch ( _tempDvar ) switch ( _tempDvar )
{ {
case 0: case 0:
_temp = "random for all"; _temp = "random for all";
break; break;
case 1: case 1:
_temp = "too easy"; _temp = "too easy";
break; break;
case 2: case 2:
_temp = "easy"; _temp = "easy";
break; break;
case 3: case 3:
_temp = "easy-medium"; _temp = "easy-medium";
break; break;
case 4: case 4:
_temp = "medium"; _temp = "medium";
break; break;
case 5: case 5:
_temp = "hard"; _temp = "hard";
break; break;
case 6: case 6:
_temp = "very hard"; _temp = "very hard";
break; break;
case 7: case 7:
_temp = "hardest"; _temp = "hardest";
break; break;
case 8: case 8:
_temp = "custom"; _temp = "custom";
break; break;
case 9: case 9:
_temp = "complete random"; _temp = "complete random";
break; break;
default: default:
_temp = "out of range"; _temp = "out of range";
break; break;
} }
self AddMenu( "man_team", 5, "Change bot difficulty: " + _temp, ::bot_teams, "skill", _tempDvar ); self AddMenu( "man_team", 5, "Change bot difficulty: " + _temp, ::bot_teams, "skill", _tempDvar );
_tempDvar = getDvarInt( "bots_skill_axis_hard" ); _tempDvar = getDvarInt( "bots_skill_axis_hard" );
@@ -694,94 +743,120 @@ AddOptions()
self AddBack( "set1", "Main" ); self AddBack( "set1", "Main" );
_tempDvar = getDvarInt( "bots_loadout_reasonable" ); _tempDvar = getDvarInt( "bots_loadout_reasonable" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "set1", 0, "Bots use only good class setups: " + _temp, ::bot_func, "reasonable", _tempDvar ); self AddMenu( "set1", 0, "Bots use only good class setups: " + _temp, ::bot_func, "reasonable", _tempDvar );
_tempDvar = getDvarInt( "bots_loadout_allow_op" ); _tempDvar = getDvarInt( "bots_loadout_allow_op" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "set1", 1, "Bots can use op and annoying class setups: " + _temp, ::bot_func, "op", _tempDvar ); self AddMenu( "set1", 1, "Bots can use op and annoying class setups: " + _temp, ::bot_func, "op", _tempDvar );
_tempDvar = getDvarInt( "bots_play_move" ); _tempDvar = getDvarInt( "bots_play_move" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "set1", 2, "Bots can move: " + _temp, ::bot_func, "move", _tempDvar ); self AddMenu( "set1", 2, "Bots can move: " + _temp, ::bot_func, "move", _tempDvar );
_tempDvar = getDvarInt( "bots_play_knife" ); _tempDvar = getDvarInt( "bots_play_knife" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "set1", 3, "Bots can knife: " + _temp, ::bot_func, "knife", _tempDvar ); self AddMenu( "set1", 3, "Bots can knife: " + _temp, ::bot_func, "knife", _tempDvar );
_tempDvar = getDvarInt( "bots_play_fire" ); _tempDvar = getDvarInt( "bots_play_fire" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "set1", 4, "Bots can fire: " + _temp, ::bot_func, "fire", _tempDvar ); self AddMenu( "set1", 4, "Bots can fire: " + _temp, ::bot_func, "fire", _tempDvar );
_tempDvar = getDvarInt( "bots_play_nade" ); _tempDvar = getDvarInt( "bots_play_nade" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "set1", 5, "Bots can nade: " + _temp, ::bot_func, "nade", _tempDvar ); self AddMenu( "set1", 5, "Bots can nade: " + _temp, ::bot_func, "nade", _tempDvar );
_tempDvar = getDvarInt( "bots_play_take_carepackages" ); _tempDvar = getDvarInt( "bots_play_take_carepackages" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "set1", 6, "Bots can take carepackages: " + _temp, ::bot_func, "care", _tempDvar ); self AddMenu( "set1", 6, "Bots can take carepackages: " + _temp, ::bot_func, "care", _tempDvar );
_tempDvar = getDvarInt( "bots_play_obj" ); _tempDvar = getDvarInt( "bots_play_obj" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "set1", 7, "Bots play the objective: " + _temp, ::bot_func, "obj", _tempDvar ); self AddMenu( "set1", 7, "Bots play the objective: " + _temp, ::bot_func, "obj", _tempDvar );
_tempDvar = getDvarInt( "bots_play_camp" ); _tempDvar = getDvarInt( "bots_play_camp" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "set1", 8, "Bots can camp: " + _temp, ::bot_func, "camp", _tempDvar ); self AddMenu( "set1", 8, "Bots can camp: " + _temp, ::bot_func, "camp", _tempDvar );
_tempDvar = getDvarInt( "bots_play_jumpdrop" ); _tempDvar = getDvarInt( "bots_play_jumpdrop" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "set1", 9, "Bots can jump and dropshot: " + _temp, ::bot_func, "jump", _tempDvar ); self AddMenu( "set1", 9, "Bots can jump and dropshot: " + _temp, ::bot_func, "jump", _tempDvar );
_tempDvar = getDvarInt( "bots_play_target_other" ); _tempDvar = getDvarInt( "bots_play_target_other" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "set1", 10, "Bots can target other script objects: " + _temp, ::bot_func, "targetother", _tempDvar ); self AddMenu( "set1", 10, "Bots can target other script objects: " + _temp, ::bot_func, "targetother", _tempDvar );
_tempDvar = getDvarInt( "bots_play_killstreak" ); _tempDvar = getDvarInt( "bots_play_killstreak" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "set1", 11, "Bots can use killstreaks: " + _temp, ::bot_func, "killstreak", _tempDvar ); self AddMenu( "set1", 11, "Bots can use killstreaks: " + _temp, ::bot_func, "killstreak", _tempDvar );
_tempDvar = getDvarInt( "bots_play_ads" ); _tempDvar = getDvarInt( "bots_play_ads" );
if ( _tempDvar ) if ( _tempDvar )
_temp = "true"; _temp = "true";
else else
_temp = "false"; _temp = "false";
self AddMenu( "set1", 12, "Bots can ads: " + _temp, ::bot_func, "ads", _tempDvar ); self AddMenu( "set1", 12, "Bots can ads: " + _temp, ::bot_func, "ads", _tempDvar );
} }
@@ -793,50 +868,62 @@ bot_func(a, b)
setDvar( "bots_loadout_reasonable", !b ); setDvar( "bots_loadout_reasonable", !b );
self iPrintln( "Bots using reasonable setups: " + !b ); self iPrintln( "Bots using reasonable setups: " + !b );
break; break;
case "op": case "op":
setDvar( "bots_loadout_allow_op", !b ); setDvar( "bots_loadout_allow_op", !b );
self iPrintln( "Bots using op setups: " + !b ); self iPrintln( "Bots using op setups: " + !b );
break; break;
case "move": case "move":
setDvar( "bots_play_move", !b ); setDvar( "bots_play_move", !b );
self iPrintln( "Bots move: " + !b ); self iPrintln( "Bots move: " + !b );
break; break;
case "knife": case "knife":
setDvar( "bots_play_knife", !b ); setDvar( "bots_play_knife", !b );
self iPrintln( "Bots knife: " + !b ); self iPrintln( "Bots knife: " + !b );
break; break;
case "fire": case "fire":
setDvar( "bots_play_fire", !b ); setDvar( "bots_play_fire", !b );
self iPrintln( "Bots fire: " + !b ); self iPrintln( "Bots fire: " + !b );
break; break;
case "nade": case "nade":
setDvar( "bots_play_nade", !b ); setDvar( "bots_play_nade", !b );
self iPrintln( "Bots nade: " + !b ); self iPrintln( "Bots nade: " + !b );
break; break;
case "care": case "care":
setDvar( "bots_play_take_carepackages", !b ); setDvar( "bots_play_take_carepackages", !b );
self iPrintln( "Bots take carepackages: " + !b ); self iPrintln( "Bots take carepackages: " + !b );
break; break;
case "obj": case "obj":
setDvar( "bots_play_obj", !b ); setDvar( "bots_play_obj", !b );
self iPrintln( "Bots play the obj: " + !b ); self iPrintln( "Bots play the obj: " + !b );
break; break;
case "camp": case "camp":
setDvar( "bots_play_camp", !b ); setDvar( "bots_play_camp", !b );
self iPrintln( "Bots camp: " + !b ); self iPrintln( "Bots camp: " + !b );
break; break;
case "jump": case "jump":
setDvar( "bots_play_jumpdrop", !b ); setDvar( "bots_play_jumpdrop", !b );
self iPrintln( "Bots jump: " + !b ); self iPrintln( "Bots jump: " + !b );
break; break;
case "targetother": case "targetother":
setDvar( "bots_play_target_other", !b ); setDvar( "bots_play_target_other", !b );
self iPrintln( "Bots target other: " + !b ); self iPrintln( "Bots target other: " + !b );
break; break;
case "killstreak": case "killstreak":
setDvar( "bots_play_killstreak", !b ); setDvar( "bots_play_killstreak", !b );
self iPrintln( "Bots use killstreaks: " + !b ); self iPrintln( "Bots use killstreaks: " + !b );
break; break;
case "ads": case "ads":
setDvar( "bots_play_ads", !b ); setDvar( "bots_play_ads", !b );
self iPrintln( "Bots ads: " + !b ); self iPrintln( "Bots ads: " + !b );
@@ -855,36 +942,45 @@ bot_teams(a, b)
setdvar( "bots_team", "allies" ); setdvar( "bots_team", "allies" );
self iPrintlnBold( "Changed bot team to allies." ); self iPrintlnBold( "Changed bot team to allies." );
break; break;
case "allies": case "allies":
setdvar( "bots_team", "axis" ); setdvar( "bots_team", "axis" );
self iPrintlnBold( "Changed bot team to axis." ); self iPrintlnBold( "Changed bot team to axis." );
break; break;
case "axis": case "axis":
setdvar( "bots_team", "custom" ); setdvar( "bots_team", "custom" );
self iPrintlnBold( "Changed bot team to custom." ); self iPrintlnBold( "Changed bot team to custom." );
break; break;
default: default:
setdvar( "bots_team", "autoassign" ); setdvar( "bots_team", "autoassign" );
self iPrintlnBold( "Changed bot team to autoassign." ); self iPrintlnBold( "Changed bot team to autoassign." );
break; break;
} }
break; break;
case "teamup": case "teamup":
setdvar( "bots_team_amount", b + 1 ); setdvar( "bots_team_amount", b + 1 );
self iPrintln( ( b + 1 ) + " bot(s) will try to be on axis team." ); self iPrintln( ( b + 1 ) + " bot(s) will try to be on axis team." );
break; break;
case "teamdown": case "teamdown":
setdvar( "bots_team_amount", b - 1 ); setdvar( "bots_team_amount", b - 1 );
self iPrintln( ( b - 1 ) + " bot(s) will try to be on axis team." ); self iPrintln( ( b - 1 ) + " bot(s) will try to be on axis team." );
break; break;
case "teamforce": case "teamforce":
setDvar( "bots_team_force", !b ); setDvar( "bots_team_force", !b );
self iPrintln( "Forcing bots to team: " + !b ); self iPrintln( "Forcing bots to team: " + !b );
break; break;
case "teammode": case "teammode":
setDvar( "bots_team_mode", !b ); setDvar( "bots_team_mode", !b );
self iPrintln( "Only count bots on team: " + !b ); self iPrintln( "Only count bots on team: " + !b );
break; break;
case "skill": case "skill":
switch ( b ) switch ( b )
{ {
@@ -892,72 +988,90 @@ bot_teams(a, b)
self iPrintlnBold( "Changed bot skill to easy." ); self iPrintlnBold( "Changed bot skill to easy." );
setDvar( "bots_skill", 1 ); setDvar( "bots_skill", 1 );
break; break;
case 1: case 1:
self iPrintlnBold( "Changed bot skill to easy-med." ); self iPrintlnBold( "Changed bot skill to easy-med." );
setDvar( "bots_skill", 2 ); setDvar( "bots_skill", 2 );
break; break;
case 2: case 2:
self iPrintlnBold( "Changed bot skill to medium." ); self iPrintlnBold( "Changed bot skill to medium." );
setDvar( "bots_skill", 3 ); setDvar( "bots_skill", 3 );
break; break;
case 3: case 3:
self iPrintlnBold( "Changed bot skill to med-hard." ); self iPrintlnBold( "Changed bot skill to med-hard." );
setDvar( "bots_skill", 4 ); setDvar( "bots_skill", 4 );
break; break;
case 4: case 4:
self iPrintlnBold( "Changed bot skill to hard." ); self iPrintlnBold( "Changed bot skill to hard." );
setDvar( "bots_skill", 5 ); setDvar( "bots_skill", 5 );
break; break;
case 5: case 5:
self iPrintlnBold( "Changed bot skill to very hard." ); self iPrintlnBold( "Changed bot skill to very hard." );
setDvar( "bots_skill", 6 ); setDvar( "bots_skill", 6 );
break; break;
case 6: case 6:
self iPrintlnBold( "Changed bot skill to hardest." ); self iPrintlnBold( "Changed bot skill to hardest." );
setDvar( "bots_skill", 7 ); setDvar( "bots_skill", 7 );
break; break;
case 7: case 7:
self iPrintlnBold( "Changed bot skill to custom. Base is easy." ); self iPrintlnBold( "Changed bot skill to custom. Base is easy." );
setDvar( "bots_skill", 8 ); setDvar( "bots_skill", 8 );
break; break;
case 8: case 8:
self iPrintlnBold( "Changed bot skill to complete random. Takes effect at restart." ); self iPrintlnBold( "Changed bot skill to complete random. Takes effect at restart." );
setDvar( "bots_skill", 9 ); setDvar( "bots_skill", 9 );
break; break;
default: default:
self iPrintlnBold( "Changed bot skill to random. Takes effect at restart." ); self iPrintlnBold( "Changed bot skill to random. Takes effect at restart." );
setDvar( "bots_skill", 0 ); setDvar( "bots_skill", 0 );
break; break;
} }
break; break;
case "axishardup": case "axishardup":
setdvar( "bots_skill_axis_hard", ( b + 1 ) ); setdvar( "bots_skill_axis_hard", ( b + 1 ) );
self iPrintln( ( ( b + 1 ) ) + " hard bots will be on axis team." ); self iPrintln( ( ( b + 1 ) ) + " hard bots will be on axis team." );
break; break;
case "axisharddown": case "axisharddown":
setdvar( "bots_skill_axis_hard", ( b - 1 ) ); setdvar( "bots_skill_axis_hard", ( b - 1 ) );
self iPrintln( ( ( b - 1 ) ) + " hard bots will be on axis team." ); self iPrintln( ( ( b - 1 ) ) + " hard bots will be on axis team." );
break; break;
case "axismedup": case "axismedup":
setdvar( "bots_skill_axis_med", ( b + 1 ) ); setdvar( "bots_skill_axis_med", ( b + 1 ) );
self iPrintln( ( ( b + 1 ) ) + " med bots will be on axis team." ); self iPrintln( ( ( b + 1 ) ) + " med bots will be on axis team." );
break; break;
case "axismeddown": case "axismeddown":
setdvar( "bots_skill_axis_med", ( b - 1 ) ); setdvar( "bots_skill_axis_med", ( b - 1 ) );
self iPrintln( ( ( b - 1 ) ) + " med bots will be on axis team." ); self iPrintln( ( ( b - 1 ) ) + " med bots will be on axis team." );
break; break;
case "allieshardup": case "allieshardup":
setdvar( "bots_skill_allies_hard", ( b + 1 ) ); setdvar( "bots_skill_allies_hard", ( b + 1 ) );
self iPrintln( ( ( b + 1 ) ) + " hard bots will be on allies team." ); self iPrintln( ( ( b + 1 ) ) + " hard bots will be on allies team." );
break; break;
case "alliesharddown": case "alliesharddown":
setdvar( "bots_skill_allies_hard", ( b - 1 ) ); setdvar( "bots_skill_allies_hard", ( b - 1 ) );
self iPrintln( ( ( b - 1 ) ) + " hard bots will be on allies team." ); self iPrintln( ( ( b - 1 ) ) + " hard bots will be on allies team." );
break; break;
case "alliesmedup": case "alliesmedup":
setdvar( "bots_skill_allies_med", ( b + 1 ) ); setdvar( "bots_skill_allies_med", ( b + 1 ) );
self iPrintln( ( ( b + 1 ) ) + " med bots will be on allies team." ); self iPrintln( ( ( b + 1 ) ) + " med bots will be on allies team." );
break; break;
case "alliesmeddown": case "alliesmeddown":
setdvar( "bots_skill_allies_med", ( b - 1 ) ); setdvar( "bots_skill_allies_med", ( b - 1 ) );
self iPrintln( ( ( b - 1 ) ) + " med bots will be on allies team." ); self iPrintln( ( ( b - 1 ) ) + " med bots will be on allies team." );
@@ -971,6 +1085,7 @@ man_bots(a, b)
{ {
case "add": case "add":
setdvar( "bots_manage_add", b ); setdvar( "bots_manage_add", b );
if ( b == 1 ) if ( b == 1 )
{ {
self iPrintln( "Adding " + b + " bot." ); self iPrintln( "Adding " + b + " bot." );
@@ -979,13 +1094,16 @@ man_bots(a, b)
{ {
self iPrintln( "Adding " + b + " bots." ); self iPrintln( "Adding " + b + " bots." );
} }
break; break;
case "kick": case "kick":
result = false; result = false;
for ( i = 0; i < b; i++ ) for ( i = 0; i < b; i++ )
{ {
tempBot = random( getBotArray() ); tempBot = random( getBotArray() );
if ( isDefined( tempBot ) ) if ( isDefined( tempBot ) )
{ {
kick( tempBot getEntityNumber(), "EXE_PLAYERKICKED" ); kick( tempBot getEntityNumber(), "EXE_PLAYERKICKED" );
@@ -997,11 +1115,14 @@ man_bots(a, b)
if ( !result ) if ( !result )
self iPrintln( "No bots to kick" ); self iPrintln( "No bots to kick" );
break; break;
case "autokick": case "autokick":
setDvar( "bots_manage_fill_kick", !b ); setDvar( "bots_manage_fill_kick", !b );
self iPrintln( "Kicking bots when bots_fill is exceeded: " + !b ); self iPrintln( "Kicking bots when bots_fill is exceeded: " + !b );
break; break;
case "fillmode": case "fillmode":
switch ( b ) switch ( b )
{ {
@@ -1009,32 +1130,40 @@ man_bots(a, b)
setdvar( "bots_manage_fill_mode", 1 ); setdvar( "bots_manage_fill_mode", 1 );
self iPrintln( "bot_fill will now count only bots." ); self iPrintln( "bot_fill will now count only bots." );
break; break;
case 1: case 1:
setdvar( "bots_manage_fill_mode", 2 ); setdvar( "bots_manage_fill_mode", 2 );
self iPrintln( "bot_fill will now count everyone, adjusting to map." ); self iPrintln( "bot_fill will now count everyone, adjusting to map." );
break; break;
case 2: case 2:
setdvar( "bots_manage_fill_mode", 3 ); setdvar( "bots_manage_fill_mode", 3 );
self iPrintln( "bot_fill will now count only bots, adjusting to map." ); self iPrintln( "bot_fill will now count only bots, adjusting to map." );
break; break;
case 3: case 3:
setdvar( "bots_manage_fill_mode", 4 ); setdvar( "bots_manage_fill_mode", 4 );
self iPrintln( "bot_fill will now use bots as team balance." ); self iPrintln( "bot_fill will now use bots as team balance." );
break; break;
default: default:
setdvar( "bots_manage_fill_mode", 0 ); setdvar( "bots_manage_fill_mode", 0 );
self iPrintln( "bot_fill will now count everyone." ); self iPrintln( "bot_fill will now count everyone." );
break; break;
} }
break; break;
case "fillup": case "fillup":
setdvar( "bots_manage_fill", b + 1 ); setdvar( "bots_manage_fill", b + 1 );
self iPrintln( "Increased to maintain " + ( b + 1 ) + " bot(s)." ); self iPrintln( "Increased to maintain " + ( b + 1 ) + " bot(s)." );
break; break;
case "filldown": case "filldown":
setdvar( "bots_manage_fill", b - 1 ); setdvar( "bots_manage_fill", b - 1 );
self iPrintln( "Decreased to maintain " + ( b - 1 ) + " bot(s)." ); self iPrintln( "Decreased to maintain " + ( b - 1 ) + " bot(s)." );
break; break;
case "fillspec": case "fillspec":
setDvar( "bots_manage_fill_spec", !b ); setDvar( "bots_manage_fill_spec", !b );
self iPrintln( "Count players on spectator for bots_fill: " + !b ); self iPrintln( "Count players on spectator for bots_fill: " + !b );

View File

@@ -59,6 +59,7 @@ init()
onPlayerSpawned() onPlayerSpawned()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; ) for ( ;; )
{ {
self waittill( "spawned_player" ); self waittill( "spawned_player" );
@@ -124,6 +125,7 @@ watchAstarCommand()
self endon( "death" ); self endon( "death" );
self notifyOnPlayerCommand( "astar", "+gostand" ); self notifyOnPlayerCommand( "astar", "+gostand" );
for ( ;; ) for ( ;; )
{ {
self waittill( "astar" ); self waittill( "astar" );
@@ -176,6 +178,7 @@ updateWaypointsStats()
closest = -1; closest = -1;
myEye = self getEye(); myEye = self getEye();
myAngles = self GetPlayerAngles(); myAngles = self GetPlayerAngles();
for ( i = 0; i < level.waypointCount; i++ ) for ( i = 0; i < level.waypointCount; i++ )
{ {
if ( closest == -1 || closer( self.origin, level.waypoints[i].origin, level.waypoints[closest].origin ) ) if ( closest == -1 || closer( self.origin, level.waypoints[i].origin, level.waypoints[closest].origin ) )
@@ -210,6 +213,7 @@ updateWaypointsStats()
wpToLink setText( level.wpToLink ); wpToLink setText( level.wpToLink );
infotext.x = infotext.x - 2; infotext.x = infotext.x - 2;
if ( infotext.x <= -800 ) if ( infotext.x <= -800 )
infotext.x = 800; infotext.x = 800;
@@ -246,6 +250,7 @@ watchLoadWaypointsCommand()
self endon( "death" ); self endon( "death" );
self notifyOnPlayerCommand( "[{+actionslot 2}]", "+actionslot 2" ); self notifyOnPlayerCommand( "[{+actionslot 2}]", "+actionslot 2" );
for ( ;; ) for ( ;; )
{ {
self waittill( "[{+actionslot 2}]" ); self waittill( "[{+actionslot 2}]" );
@@ -259,6 +264,7 @@ watchAddWaypointCommand()
self endon( "death" ); self endon( "death" );
self notifyOnPlayerCommand( "[{+smoke}]", "+smoke" ); self notifyOnPlayerCommand( "[{+smoke}]", "+smoke" );
for ( ;; ) for ( ;; )
{ {
self waittill( "[{+smoke}]" ); self waittill( "[{+smoke}]" );
@@ -272,9 +278,11 @@ watchAutoLinkCommand()
self endon( "death" ); self endon( "death" );
self notifyOnPlayerCommand( "[{+frag}]", "+frag" ); self notifyOnPlayerCommand( "[{+frag}]", "+frag" );
for ( ;; ) for ( ;; )
{ {
self waittill( "[{+frag}]" ); self waittill( "[{+frag}]" );
if ( level.autoLink ) if ( level.autoLink )
{ {
self iPrintlnBold( "Auto link disabled" ); self iPrintlnBold( "Auto link disabled" );
@@ -296,6 +304,7 @@ watchLinkWaypointCommand()
self endon( "death" ); self endon( "death" );
self notifyOnPlayerCommand( "[{+melee}]", "+melee" ); self notifyOnPlayerCommand( "[{+melee}]", "+melee" );
for ( ;; ) for ( ;; )
{ {
self waittill( "[{+melee}]" ); self waittill( "[{+melee}]" );
@@ -309,6 +318,7 @@ watchUnlinkWaypointCommand()
self endon( "death" ); self endon( "death" );
self notifyOnPlayerCommand( "[{+reload}]", "+reload" ); self notifyOnPlayerCommand( "[{+reload}]", "+reload" );
for ( ;; ) for ( ;; )
{ {
self waittill( "[{+reload}]" ); self waittill( "[{+reload}]" );
@@ -322,6 +332,7 @@ watchDeleteWaypointCommand()
self endon( "death" ); self endon( "death" );
self notifyOnPlayerCommand( "[{+actionslot 3}]", "+actionslot 3" ); self notifyOnPlayerCommand( "[{+actionslot 3}]", "+actionslot 3" );
for ( ;; ) for ( ;; )
{ {
self waittill( "[{+actionslot 3}]" ); self waittill( "[{+actionslot 3}]" );
@@ -335,6 +346,7 @@ watchDeleteAllWaypointsCommand()
self endon( "death" ); self endon( "death" );
self notifyOnPlayerCommand( "[{+actionslot 4}]", "+actionslot 4" ); self notifyOnPlayerCommand( "[{+actionslot 4}]", "+actionslot 4" );
for ( ;; ) for ( ;; )
{ {
self waittill( "[{+actionslot 4}]" ); self waittill( "[{+actionslot 4}]" );
@@ -348,6 +360,7 @@ watchSaveWaypointsCommand()
self endon( "disconnect" ); self endon( "disconnect" );
self notifyOnPlayerCommand( "[{+actionslot 1}]", "+actionslot 1" ); self notifyOnPlayerCommand( "[{+actionslot 1}]", "+actionslot 1" );
for ( ;; ) for ( ;; )
{ {
self waittill( "[{+actionslot 1}]" ); self waittill( "[{+actionslot 1}]" );
@@ -360,21 +373,25 @@ watchSaveWaypointsCommand()
mpnm = getMapName( getdvar( "mapname" ) ); mpnm = getMapName( getdvar( "mapname" ) );
logprint( "\n\n" + mpnm + "()\n{\n/*" ); logprint( "\n\n" + mpnm + "()\n{\n/*" );
logprint( "*/waypoints = [];\n/*" ); logprint( "*/waypoints = [];\n/*" );
for ( i = 0; i < level.waypointCount; i++ ) for ( i = 0; i < level.waypointCount; i++ )
{ {
logprint( "*/waypoints[" + i + "] = spawnstruct();\n/*" ); logprint( "*/waypoints[" + i + "] = spawnstruct();\n/*" );
logprint( "*/waypoints[" + i + "].origin = " + level.waypoints[i].origin + ";\n/*" ); logprint( "*/waypoints[" + i + "].origin = " + level.waypoints[i].origin + ";\n/*" );
logprint( "*/waypoints[" + i + "].type = \"" + level.waypoints[i].type + "\";\n/*" ); logprint( "*/waypoints[" + i + "].type = \"" + level.waypoints[i].type + "\";\n/*" );
for ( c = 0; c < level.waypoints[i].children.size; c++ ) for ( c = 0; c < level.waypoints[i].children.size; c++ )
{ {
logprint( "*/waypoints[" + i + "].children[" + c + "] = " + level.waypoints[i].children[c] + ";\n/*" ); 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" ) ) 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( "*/waypoints[" + i + "].angles = " + level.waypoints[i].angles + ";\n/*" );
if ( isDefined( level.waypoints[i].jav_point ) && level.waypoints[i].type == "javelin" ) if ( isDefined( level.waypoints[i].jav_point ) && level.waypoints[i].type == "javelin" )
logprint( "*/waypoints[" + i + "].jav_point = " + level.waypoints[i].jav_point + ";\n/*" ); logprint( "*/waypoints[" + i + "].jav_point = " + level.waypoints[i].jav_point + ";\n/*" );
} }
logprint( "*/return waypoints;\n}\n\n\n\n" ); logprint( "*/return waypoints;\n}\n\n\n\n" );
filename = "waypoints/" + getdvar( "mapname" ) + "_wp.csv"; filename = "waypoints/" + getdvar( "mapname" ) + "_wp.csv";
@@ -383,6 +400,7 @@ watchSaveWaypointsCommand()
PrintLn( level.waypointCount ); PrintLn( level.waypointCount );
fileWrite( filename, level.waypointCount + "\n", "write" ); fileWrite( filename, level.waypointCount + "\n", "write" );
for ( i = 0; i < level.waypointCount; i++ ) for ( i = 0; i < level.waypointCount; i++ )
{ {
str = ""; str = "";
@@ -397,6 +415,7 @@ watchSaveWaypointsCommand()
if ( h < wp.children.size - 1 ) if ( h < wp.children.size - 1 )
str += " "; str += " ";
} }
str += "," + wp.type + ","; str += "," + wp.type + ",";
if ( isDefined( wp.angles ) ) if ( isDefined( wp.angles ) )
@@ -412,6 +431,7 @@ watchSaveWaypointsCommand()
PrintLn( str ); PrintLn( str );
fileWrite( filename, str + "\n", "append" ); fileWrite( filename, str + "\n", "append" );
} }
PrintLn( "\n\n\n\n\n\n" ); PrintLn( "\n\n\n\n\n\n" );
self iprintln( "Saved!!! to " + filename ); self iprintln( "Saved!!! to " + filename );
@@ -521,6 +541,7 @@ LinkWaypoint(nwp)
} }
weGood = true; weGood = true;
for ( i = level.waypoints[level.wpToLink].children.size - 1; i >= 0; i-- ) for ( i = level.waypoints[level.wpToLink].children.size - 1; i >= 0; i-- )
{ {
child = level.waypoints[level.wpToLink].children[i]; child = level.waypoints[level.wpToLink].children[i];
@@ -595,10 +616,12 @@ DeleteWaypoint(nwp)
level.waypoints[entry] = level.waypoints[entry + 1]; level.waypoints[entry] = level.waypoints[entry + 1];
entry++; entry++;
} }
level.waypoints[entry] = undefined; level.waypoints[entry] = undefined;
break; break;
} }
} }
level.waypointCount--; level.waypointCount--;
self iprintln( "DelWp " + nwp ); self iprintln( "DelWp " + nwp );