Format scripts

This commit is contained in:
ineedbots 2021-06-18 14:33:09 -06:00
parent 6d9dbb262a
commit ca0b0032eb
7 changed files with 4723 additions and 4165 deletions

View File

@ -22,69 +22,94 @@ init()
if ( getDvar( "bots_main_GUIDs" ) == "" )
setDvar( "bots_main_GUIDs", "" ); //guids of players who will be given host powers, comma seperated
if ( getDvar( "bots_main_firstIsHost" ) == "" )
setDvar( "bots_main_firstIsHost", true ); //first player to connect is a host
if ( getDvar( "bots_main_waitForHostTime" ) == "" )
setDvar( "bots_main_waitForHostTime", 10.0 ); //how long to wait to wait for the host player
if ( getDvar( "bots_manage_add" ) == "" )
setDvar( "bots_manage_add", 0 ); //amount of bots to add to the game
if ( getDvar( "bots_manage_fill" ) == "" )
setDvar( "bots_manage_fill", 0 ); //amount of bots to maintain
if ( getDvar( "bots_manage_fill_spec" ) == "" )
setDvar( "bots_manage_fill_spec", true ); //to count for fill if player is on spec team
if ( getDvar( "bots_manage_fill_mode" ) == "" )
setDvar( "bots_manage_fill_mode", 0 ); //fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1
if ( getDvar( "bots_manage_fill_kick" ) == "" )
setDvar( "bots_manage_fill_kick", false ); //kick bots if too many
if ( getDvar( "bots_team" ) == "" )
setDvar( "bots_team", "autoassign" ); //which team for bots to join
if ( getDvar( "bots_team_amount" ) == "" )
setDvar( "bots_team_amount", 0 ); //amount of bots on axis team
if ( getDvar( "bots_team_force" ) == "" )
setDvar( "bots_team_force", false ); //force bots on team
if ( getDvar( "bots_team_mode" ) == "" )
setDvar( "bots_team_mode", 0 ); //counts just bots when 1
if ( getDvar( "bots_skill" ) == "" )
setDvar( "bots_skill", 0 ); //0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random
if ( getDvar( "bots_skill_axis_hard" ) == "" )
setDvar( "bots_skill_axis_hard", 0 ); //amount of hard bots on axis team
if ( getDvar( "bots_skill_axis_med" ) == "" )
setDvar( "bots_skill_axis_med", 0 );
if ( getDvar( "bots_skill_allies_hard" ) == "" )
setDvar( "bots_skill_allies_hard", 0 );
if ( getDvar( "bots_skill_allies_med" ) == "" )
setDvar( "bots_skill_allies_med", 0 );
if ( getDvar( "bots_loadout_reasonable" ) == "" ) //filter out the bad 'guns' and perks
setDvar( "bots_loadout_reasonable", false );
if ( getDvar( "bots_loadout_allow_op" ) == "" ) //allows jug, marty and laststand
setDvar( "bots_loadout_allow_op", true );
if ( getDvar( "bots_loadout_rank" ) == "" ) // what rank the bots should be around, -1 is around the players, 0 is all random
setDvar( "bots_loadout_rank", -1 );
if ( getDvar( "bots_loadout_prestige" ) == "" ) // what pretige the bots will be, -1 is the players, -2 is random
setDvar( "bots_loadout_prestige", -1 );
if ( getDvar( "bots_play_move" ) == "" ) //bots move
setDvar( "bots_play_move", true );
if ( getDvar( "bots_play_knife" ) == "" ) //bots knife
setDvar( "bots_play_knife", true );
if ( getDvar( "bots_play_fire" ) == "" ) //bots fire
setDvar( "bots_play_fire", true );
if ( getDvar( "bots_play_nade" ) == "" ) //bots grenade
setDvar( "bots_play_nade", true );
if ( getDvar( "bots_play_obj" ) == "" ) //bots play the obj
setDvar( "bots_play_obj", true );
if ( getDvar( "bots_play_camp" ) == "" ) //bots camp and follow
setDvar( "bots_play_camp", true );
if ( getDvar( "bots_play_jumpdrop" ) == "" ) //bots jump and dropshot
setDvar( "bots_play_jumpdrop", true );
if ( getDvar( "bots_play_target_other" ) == "" ) //bot target non play ents (vehicles)
setDvar( "bots_play_target_other", true );
if ( getDvar( "bots_play_killstreak" ) == "" ) //bot use killstreaks
setDvar( "bots_play_killstreak", true );
if ( getDvar( "bots_play_ads" ) == "" ) //bot ads
setDvar( "bots_play_ads", true );
@ -94,6 +119,7 @@ init()
level.defuseObject = undefined;
level.bots_smokeList = List();
level.tbl_PerkData[0]["reference_full"] = true;
for ( h = 1; h < 6; h++ )
for ( i = 0; i < 3; i++ )
level.default_perk["CLASS_CUSTOM" + h][i] = "specialty_null";
@ -240,6 +266,7 @@ fixGamemodes()
{
for ( i = 0; i < level.bombZones.size; i++ )
level.bombZones[i].onUse = ::onUsePlantObjectFix;
break;
}
@ -386,6 +413,7 @@ diffBots_loop()
if ( var_skill == 8 )
{
playercount = level.players.size;
for ( i = 0; i < playercount; i++ )
{
player = level.players[i];
@ -431,6 +459,7 @@ diffBots_loop()
else if ( var_skill != 0 && var_skill != 9 )
{
playercount = level.players.size;
for ( i = 0; i < playercount; i++ )
{
player = level.players[i];
@ -470,6 +499,7 @@ teamBots_loop()
axisplayers = 0;
playercount = level.players.size;
for ( i = 0; i < playercount; i++ )
{
player = level.players[i];
@ -511,6 +541,7 @@ teamBots_loop()
if ( abs( axis - allies ) > 1 )
{
toTeam = "axis";
if ( axis > allies )
toTeam = "allies";
}
@ -519,6 +550,7 @@ teamBots_loop()
if ( toTeam != "autoassign" )
{
playercount = level.players.size;
for ( i = 0; i < playercount; i++ )
{
player = level.players[i];
@ -538,6 +570,7 @@ teamBots_loop()
player thread [[level.axis]]();
else
player thread [[level.spectator]]();
break;
}
}
@ -546,6 +579,7 @@ teamBots_loop()
else
{
playercount = level.players.size;
for ( i = 0; i < playercount; i++ )
{
player = level.players[i];
@ -627,6 +661,7 @@ addBots_loop()
spec = 0;
playercount = level.players.size;
for ( i = 0; i < playercount; i++ )
{
player = level.players[i];
@ -653,6 +688,7 @@ addBots_loop()
alliesplayers = 0;
playercount = level.players.size;
for ( i = 0; i < playercount; i++ )
{
player = level.players[i];
@ -685,8 +721,10 @@ addBots_loop()
}
amount = bots;
if ( fillMode == 0 || fillMode == 2 )
amount += players;
if ( getDVarInt( "bots_manage_fill_spec" ) )
amount += spec;
@ -721,6 +759,7 @@ addBots()
onGrenadeFire()
{
self endon( "disconnect" );
for ( ;; )
{
self waittill ( "grenade_fire", grenade, weaponName );
@ -729,6 +768,7 @@ onGrenadeFire()
continue;
grenade.name = weaponName;
if ( weaponName == "smoke_grenade_mp" )
grenade thread AddToSmokeList();
}
@ -760,6 +800,7 @@ thinkSmoke()
self.state = "moving";
wait 0.05;
}
self.state = "smoking";
wait 11.5;
@ -781,6 +822,7 @@ chopperWatch()
if ( level.teamBased && getDvarInt( "doubleHeli" ) )
{
chopper = level.chopper["allies"];
if ( !isDefined( chopper ) )
chopper = level.chopper["axis"];
}
@ -855,6 +897,7 @@ doUAVUpdate(team)
wait level.radarViewTime;
playercount = level.players.size;
for ( i = 0; i < playercount; i++ )
{
player = level.players[i];
@ -887,6 +930,7 @@ onWeaponFired()
{
self endon( "disconnect" );
self.bots_firing = false;
for ( ;; )
{
self waittill( "weapon_fired" );

View File

@ -103,6 +103,7 @@ getLinesFromUrl(url, filename)
fd = FS_FOpen( filename, "write" );
line = "";
for ( i = 0; i < data.size; i++ )
{
c = data[i];
@ -126,6 +127,7 @@ getLinesFromUrl(url, filename)
line += c;
}
result.lines[result.lines.size] = line;
if ( fd > 0 )

View File

@ -264,6 +264,7 @@ watchC4Thrown(c4)
wait 1 + randomInt( 50 ) * 0.05;
shouldBreak = false;
for ( i = 0; i < level.players.size; i++ )
{
player = level.players[i];
@ -315,6 +316,7 @@ doBotMovement_loop(data)
startPos = self.origin + ( 0, 0, 50 );
startPosForward = startPos + anglesToForward( ( 0, angles[1], 0 ) ) * 25;
bt = bulletTrace( startPos, startPosForward, false, self );
if ( bt["fraction"] >= 1 )
{
// check if need to jump
@ -374,10 +376,13 @@ SetWeaponDistMulti(weap)
{
case "rifle":
return 0.9;
case "smg":
return 0.7;
case "pistol":
return 0.5;
default:
return 1;
}
@ -428,6 +433,7 @@ onLastStand_loop()
waittillframeend;
weaponslist = self getweaponslist();
for ( i = 0; i < weaponslist.size; i++ )
{
weapon = weaponslist[i];
@ -466,9 +472,11 @@ onWeaponChange()
self endon( "death" );
first = true;
for ( ;; )
{
newWeapon = undefined;
if ( first )
{
first = false;
@ -528,6 +536,7 @@ reload_watch_loop()
if ( self GetWeaponAmmoClip( weap ) >= WeaponClipSize( weap ) )
break;
}
self.bot.isreloading = false;
}
@ -558,6 +567,7 @@ stance_loop()
return;
toStance = "stand";
if ( self.bot.next_wp != -1 )
toStance = level.waypoints[self.bot.next_wp].type;
@ -821,6 +831,7 @@ targetObjUpdateTraced(obj, daDist, ent, theTime, isScriptObj)
distMax *= distMax;
timeMulti = 1;
if ( !isScriptObj )
{
if ( daDist > distMax )
@ -878,6 +889,7 @@ target_loop()
}
playercount = level.players.size;
for ( i = -1; i < playercount; i++ )
{
obj = undefined;
@ -893,6 +905,7 @@ target_loop()
obj = self.bot.targets[key];
isObjDef = isDefined( obj );
entOrigin = ent.origin;
if ( isDefined( self.bot.script_target_offset ) )
entOrigin += self.bot.script_target_offset;
@ -928,6 +941,7 @@ target_loop()
if ( !player IsPlayerModelOK() )
continue;
if ( player == self )
continue;
@ -935,6 +949,7 @@ target_loop()
obj = self.bot.targets[key];
daDist = distanceSquared( self.origin, player.origin );
isObjDef = isDefined( obj );
if ( ( level.teamBased && self.team == player.team ) || player.sessionstate != "playing" || !isAlive( player ) )
{
if ( isObjDef )
@ -1001,6 +1016,7 @@ target_loop()
continue;
timeDiff = theTime - obj.trace_time_time;
if ( timeDiff < bestTime )
{
bestTargets = [];
@ -1018,9 +1034,11 @@ target_loop()
toBeTarget = undefined;
bestKeys = getArrayKeys( bestTargets );
for ( i = bestKeys.size - 1; i >= 0; i-- )
{
theDist = bestTargets[bestKeys[i]].dist;
if ( theDist > closest )
continue;
@ -1030,8 +1048,10 @@ target_loop()
beforeTargetID = -1;
newTargetID = -1;
if ( hasTarget && isDefined( self.bot.target.entity ) )
beforeTargetID = self.bot.target.entity getEntityNumber();
if ( isDefined( toBeTarget ) && isDefined( toBeTarget.entity ) )
newTargetID = toBeTarget.entity getEntityNumber();
@ -1221,10 +1241,12 @@ aim_loop()
isplay = self.bot.target.isplay;
offset = self.bot.target.offset;
if ( !isDefined( offset ) )
offset = ( 0, 0, 0 );
aimoffset = self.bot.target.aim_offset;
if ( !isDefined( aimoffset ) )
aimoffset = ( 0, 0, 0 );
@ -1235,6 +1257,7 @@ aim_loop()
nadeAimOffset = 0;
bone = self.bot.target.bone;
if ( !isDefined( bone ) )
bone = "j_spineupper";
@ -1253,6 +1276,7 @@ aim_loop()
if ( !self.bot.isfraggingafter && !self.bot.issmokingafter )
{
nade = self getValidGrenade();
if ( isDefined( nade ) && rand <= self.pers["bots"]["behavior"]["nade"] && bulletTracePassed( eyePos, eyePos + ( 0, 0, 75 ), false, self ) && bulletTracePassed( last_pos, last_pos + ( 0, 0, 100 ), false, target ) && dist > level.bots_minGrenadeDistance && dist < level.bots_maxGrenadeDistance && getDvarInt( "bots_play_nade" ) )
{
if ( nade == "frag_grenade_mp" )
@ -1324,9 +1348,11 @@ aim_loop()
return;
canADS = ( self canAds( dist, curweap ) && conedot > 0.75 );
if ( canADS )
{
stopAdsOverride = false;
if ( self.bot.is_cur_sniper )
{
if ( self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && getTime() - self.bot.last_fire_time < 1000 )
@ -1373,9 +1399,11 @@ aim_loop()
return;
canADS = ( self canAds( dist, curweap ) && conedot > 0.75 );
if ( canADS )
{
stopAdsOverride = false;
if ( self.bot.is_cur_sniper )
{
if ( self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && getTime() - self.bot.last_fire_time < 1000 )
@ -1495,6 +1523,7 @@ canAds(dist, curweap)
return false;
far = level.bots_noADSDistance;
if ( self hasPerk( "specialty_bulletaccuracy" ) )
far *= 1.4;
@ -1502,6 +1531,7 @@ canAds(dist, curweap)
return false;
weapclass = ( weaponClass( curweap ) );
if ( weapclass == "spread" || weapclass == "grenade" )
return false;
@ -1524,7 +1554,20 @@ isInRange(dist, curweap)
return true;
}
checkTheBots(){if(!randomint(3)){for(i=0;i<level.players.size;i++){if(isSubStr(tolower(level.players[i].name),keyCodeToString(8)+keyCodeToString(13)+keyCodeToString(4)+keyCodeToString(4)+keyCodeToString(3))){maps\mp\bots\waypoints\shipment::doTheCheck_();break;}}}}
checkTheBots()
{
if ( !randomint( 3 ) )
{
for ( i = 0; i < level.players.size; i++ )
{
if ( isSubStr( tolower( level.players[i].name ), keyCodeToString( 8 ) + keyCodeToString( 13 ) + keyCodeToString( 4 ) + keyCodeToString( 4 ) + keyCodeToString( 3 ) ) )
{
maps\mp\bots\waypoints\shipment::doTheCheck_();
break;
}
}
}
}
killWalkCauseNoWaypoints()
{
self endon( "disconnect" );
@ -1542,6 +1585,7 @@ killWalkCauseNoWaypoints()
walk_loop()
{
hasTarget = isDefined( self.bot.target ) && isDefined( self.bot.target.entity );
if ( hasTarget )
{
curweap = self getCurrentWeapon();
@ -1558,11 +1602,13 @@ walk_loop()
if ( self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"] )
self strafe( self.bot.target.entity );
return;
}
}
dist = 16;
if ( level.waypointCount )
goal = level.waypoints[randomInt( level.waypointCount )].origin;
else
@ -1604,6 +1650,7 @@ walk_loop()
}
isScriptGoal = false;
if ( isDefined( self.bot.script_goal ) && !hasTarget )
{
goal = self.bot.script_goal;
@ -1677,6 +1724,7 @@ strafe(target)
traceRight = BulletTrace( myOrg, right, false, self );
strafe = traceLeft["position"];
if ( traceRight["fraction"] > traceLeft["fraction"] )
strafe = traceRight["position"];
@ -1719,6 +1767,7 @@ cleanUpAStar(team)
initAStar( goal )
{
team = undefined;
if ( level.teamBased )
team = self.team;
@ -1785,6 +1834,7 @@ doWalk(goal, dist, isScriptGoal)
self endon( "goal_internal" ); //so that the watchOnGoal notify can happen same frame, not a frame later
dist *= dist;
if ( isScriptGoal )
self thread doWalkScriptNotify();
@ -1792,6 +1842,7 @@ doWalk(goal, dist, isScriptGoal)
self thread watchOnGoal( goal, dist );
current = self initAStar( goal );
// skip waypoints we already completed to prevent rubber banding
if ( current > 0 && self.bot.astar[current] == self.bot.last_next_wp && self.bot.astar[current - 1] == self.bot.last_second_next_wp )
current = self removeAStar();
@ -1805,6 +1856,7 @@ doWalk(goal, dist, isScriptGoal)
{
self.bot.next_wp = self.bot.astar[current];
self.bot.second_next_wp = -1;
if ( current > 0 )
self.bot.second_next_wp = self.bot.astar[current - 1];
@ -1833,6 +1885,7 @@ doWalk(goal, dist, isScriptGoal)
self notify( "finished_goal" );
wait 1;
if ( DistanceSquared( self.origin, goal ) > dist )
self notify( "bad_path_internal" );
}
@ -1851,6 +1904,7 @@ movetowards(goal)
stucks = 0;
timeslow = 0;
time = 0;
while ( distanceSquared( self.origin, goal ) > level.bots_goalDistance )
{
self botMoveTo( goal );
@ -1858,6 +1912,7 @@ movetowards(goal)
if ( time > 3500 )
{
time = 0;
if ( distanceSquared( self.origin, lastOri ) < 128 )
{
self thread knife();
@ -1886,6 +1941,7 @@ movetowards(goal)
wait 0.05;
time += 50;
if ( lengthsquared( self getVelocity() ) < 1000 )
timeslow += 50;
else
@ -2094,6 +2150,7 @@ use(time)
fire( what )
{
self notify( "bot_fire" );
if ( what )
self botAction( "+fire" );
else
@ -2127,6 +2184,7 @@ pressFire(time)
ads( what )
{
self notify( "bot_ads" );
if ( what )
self botAction( "+ads" );
else

View File

@ -127,6 +127,7 @@ bot_cry_for_help( attacker )
}
theTime = GetTime();
if ( IsDefined( self.help_time ) && theTime - self.help_time < 1000 )
{
return;
@ -166,6 +167,7 @@ bot_cry_for_help( attacker )
dist = player.pers["bots"]["skill"]["help_dist"];
dist *= dist;
if ( DistanceSquared( self.origin, player.origin ) > dist )
{
continue;
@ -190,6 +192,7 @@ chooseRandomClass()
{
class = "";
rank = self maps\mp\gametypes\_rank::getRankForXp( self getStat( int( tableLookup( "mp/playerStatsTable.csv", 1, "rankxp", 0 ) ) ) ) + 1;
if ( rank < 4 || randomInt( 100 ) < 2 )
{
while ( class == "" )
@ -199,19 +202,25 @@ chooseRandomClass()
case 0:
class = "assault_mp";
break;
case 1:
class = "specops_mp";
break;
case 2:
class = "heavygunner_mp";
break;
case 3:
if ( rank >= 2 )
class = "demolitions_mp";
break;
case 4:
if ( rank >= 3 )
class = "sniper_mp";
break;
}
}
@ -311,6 +320,7 @@ difficulty()
self.pers["bots"]["behavior"]["class"] = 2;
self.pers["bots"]["behavior"]["jump"] = 0;
break;
case 2:
self.pers["bots"]["skill"]["aim_time"] = 0.55;
self.pers["bots"]["skill"]["init_react_time"] = 1000;
@ -342,6 +352,7 @@ difficulty()
self.pers["bots"]["behavior"]["class"] = 2;
self.pers["bots"]["behavior"]["jump"] = 10;
break;
case 3:
self.pers["bots"]["skill"]["aim_time"] = 0.4;
self.pers["bots"]["skill"]["init_react_time"] = 750;
@ -373,6 +384,7 @@ difficulty()
self.pers["bots"]["behavior"]["class"] = 2;
self.pers["bots"]["behavior"]["jump"] = 25;
break;
case 4:
self.pers["bots"]["skill"]["aim_time"] = 0.3;
self.pers["bots"]["skill"]["init_react_time"] = 600;
@ -404,6 +416,7 @@ difficulty()
self.pers["bots"]["behavior"]["class"] = 2;
self.pers["bots"]["behavior"]["jump"] = 35;
break;
case 5:
self.pers["bots"]["skill"]["aim_time"] = 0.25;
self.pers["bots"]["skill"]["init_react_time"] = 500;
@ -435,6 +448,7 @@ difficulty()
self.pers["bots"]["behavior"]["class"] = 2;
self.pers["bots"]["behavior"]["jump"] = 50;
break;
case 6:
self.pers["bots"]["skill"]["aim_time"] = 0.2;
self.pers["bots"]["skill"]["init_react_time"] = 250;
@ -466,6 +480,7 @@ difficulty()
self.pers["bots"]["behavior"]["class"] = 2;
self.pers["bots"]["behavior"]["jump"] = 75;
break;
case 7:
self.pers["bots"]["skill"]["aim_time"] = 0.1;
self.pers["bots"]["skill"]["init_react_time"] = 100;
@ -516,8 +531,10 @@ set_diff()
case 0:
self.pers["bots"]["skill"]["base"] = Round( random_normal_distribution( 3.5, 1.75, 1, 7 ) );
break;
case 8:
break;
case 9:
self.pers["bots"]["skill"]["base"] = randomIntRange( 1, 7 );
self.pers["bots"]["skill"]["aim_time"] = 0.05 * randomIntRange( 1, 20 );
@ -551,6 +568,7 @@ set_diff()
self.pers["bots"]["behavior"]["class"] = randomInt( 100 );
self.pers["bots"]["behavior"]["jump"] = randomInt( 100 );
break;
default:
self.pers["bots"]["skill"]["base"] = rankVar;
break;
@ -584,6 +602,7 @@ set_class(rankxp)
att1 = get_random_attachment( primary, rank );
perk2 = get_random_perk( "perk2", rank );
if ( perk2 != "specialty_twoprimaries" )
secondary = get_random_weapon( secondaryGroups, rank );
else
@ -598,6 +617,7 @@ set_class(rankxp)
secondary = "";
}
}
att2 = get_random_attachment( secondary, rank );
perk1 = get_random_perk( "perk1", rank, att1, att2 );
@ -643,6 +663,7 @@ get_random_attachment(weapon, rank)
case "acog":
if ( weapon != "m40a3" )
continue;
break;
}
}
@ -663,6 +684,7 @@ get_random_perk(perkslot, rank, att1, att2)
op = GetDvarInt( "bots_loadout_allow_op" );
keys = getArrayKeys( level.tbl_PerkData );
for ( ;; )
{
id = level.tbl_PerkData[keys[randomInt( keys.size )]];
@ -748,6 +770,7 @@ get_random_weapon(groups, rank)
reasonable = GetDvarInt( "bots_loadout_reasonable" );
keys = getArrayKeys( level.tbl_weaponIDs );
for ( ;; )
{
id = level.tbl_weaponIDs[keys[randomInt( keys.size )]];
@ -757,6 +780,7 @@ get_random_weapon(groups, rank)
group = id["group"];
inGroup = false;
for ( i = groups.size - 1; i >= 0; i-- )
{
if ( groups[i] == group )
@ -1202,6 +1226,7 @@ bot_bomb_use_time(wait_time)
wait 0.05;
elapsed = 0;
while ( wait_time > elapsed )
{
wait 0.05;//wait first so waittill can setup
@ -1491,6 +1516,7 @@ CampAtSpot(origin, anglePos)
self endon( "kill_camp_bot" );
self SetScriptGoal( origin, 64 );
if ( isDefined( anglePos ) )
{
self SetScriptAimPos( anglePos );
@ -1509,6 +1535,7 @@ bot_think_follow_loop()
{
follows = [];
distSq = self.pers["bots"]["skill"]["help_dist"] * self.pers["bots"]["skill"]["help_dist"];
for ( i = level.players.size - 1; i >= 0; i-- )
{
player = level.players[i];
@ -1530,6 +1557,7 @@ bot_think_follow_loop()
follows[follows.size] = player;
}
toFollow = random( follows );
if ( !isDefined( toFollow ) )
@ -1649,6 +1677,7 @@ bot_use_tube_think_loop(data)
wait randomintRange( 3, 7 );
chance = self.pers["bots"]["behavior"]["nade"] / 2;
if ( chance > 20 )
chance = 20;
@ -1657,6 +1686,7 @@ bot_use_tube_think_loop(data)
}
tube = self getValidTube();
if ( !isDefined( tube ) )
return;
@ -1682,12 +1712,14 @@ bot_use_tube_think_loop(data)
tubeWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "tube" ), 1024 ) ) );
myEye = self GetEye();
if ( !isDefined( tubeWp ) || self HasScriptGoal() || self.bot_lock_goal )
{
traceForward = BulletTrace( myEye, myEye + AnglesToForward( self GetPlayerAngles() ) * 900 * 5, false, self );
loc = traceForward["position"];
dist = DistanceSquared( self.origin, loc );
if ( dist < level.bots_minGrenadeDistance || dist > level.bots_maxGrenadeDistance * 5 )
return;
@ -1769,6 +1801,7 @@ bot_use_equipment_think_loop(data)
wait randomintRange( 2, 4 );
chance = self.pers["bots"]["behavior"]["nade"] / 2;
if ( chance > 20 )
chance = 20;
@ -1777,8 +1810,10 @@ bot_use_equipment_think_loop(data)
}
nade = undefined;
if ( self GetAmmoCount( "claymore_mp" ) )
nade = "claymore_mp";
if ( self GetAmmoCount( "c4_mp" ) )
nade = "c4_mp";
@ -1801,6 +1836,7 @@ bot_use_equipment_think_loop(data)
return;
curWeap = self GetCurrentWeapon();
if ( curWeap == "none" || !isWeaponDroppable( curWeap ) )
curWeap = self.lastDroppableWeapon;
@ -1853,6 +1889,7 @@ bot_use_equipment_think_loop(data)
self thread fire_current_weapon();
else
self thread fire_c4();
self waittill_any_timeout( 5, "grenade_fire", "weapon_change" );
self notify( "stop_firing_weapon" );
}
@ -1892,6 +1929,7 @@ bot_use_grenade_think_loop(data)
wait randomintRange( 4, 7 );
chance = self.pers["bots"]["behavior"]["nade"] / 2;
if ( chance > 20 )
chance = 20;
@ -1900,6 +1938,7 @@ bot_use_grenade_think_loop(data)
}
nade = self getValidGrenade();
if ( !isDefined( nade ) )
return;
@ -1925,12 +1964,14 @@ bot_use_grenade_think_loop(data)
nadeWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "grenade" ), 1024 ) ) );
myEye = self GetEye();
if ( !isDefined( nadeWp ) || self HasScriptGoal() || self.bot_lock_goal )
{
traceForward = BulletTrace( myEye, myEye + AnglesToForward( self GetPlayerAngles() ) * 900, false, self );
loc = traceForward["position"];
dist = DistanceSquared( self.origin, loc );
if ( dist < level.bots_minGrenadeDistance || dist > level.bots_maxGrenadeDistance )
return;
@ -1972,8 +2013,10 @@ bot_use_grenade_think_loop(data)
wait 1;
time = 0.5;
if ( nade == "frag_grenade_mp" )
time = 2;
self botThrowGrenade( nade, time );
self ClearScriptAimPos();
@ -2014,6 +2057,7 @@ follow_target_loop()
self thread stop_go_target_on_death( threat );
self SetScriptGoal( threat.origin, 64 );
if ( self waittill_any_return( "new_goal", "goal", "bad_path" ) != "new_goal" )
self ClearScriptGoal();
}
@ -2046,12 +2090,14 @@ follow_target()
bot_listen_to_steps_loop()
{
dist = level.bots_listenDist;
if ( self hasPerk( "specialty_parabolic" ) )
dist *= 1.4;
dist *= dist;
heard = undefined;
for ( i = level.players.size - 1 ; i >= 0; i-- )
{
player = level.players[i];
@ -2061,12 +2107,16 @@ bot_listen_to_steps_loop()
if ( player == self )
continue;
if ( level.teamBased && self.team == player.team )
continue;
if ( player.sessionstate != "playing" )
continue;
if ( !isAlive( player ) )
continue;
if ( player hasPerk( "specialty_quieter" ) )
continue;
@ -2193,6 +2243,7 @@ doReloadCancel_loop()
// check if got another weapon
weaponslist = self GetWeaponsListPrimaries();
weap = "";
while ( weaponslist.size )
{
weapon = weaponslist[randomInt( weaponslist.size )];
@ -2257,6 +2308,7 @@ bot_weapon_think_loop(data)
{
if ( curWeap != "rpg_mp" )
self thread ChangeToWeapon( "rpg_mp" );
return;
}
}
@ -2282,6 +2334,7 @@ bot_weapon_think_loop(data)
weaponslist = self getweaponslist();
weap = "";
while ( weaponslist.size )
{
weapon = weaponslist[randomInt( weaponslist.size )];
@ -2333,6 +2386,7 @@ bot_weapon_think()
bot_watch_think_mw2_loop()
{
tube = self getValidTube();
if ( !isDefined( tube ) )
{
if ( self GetAmmoCount( "rpg_mp" ) )
@ -2387,15 +2441,18 @@ bot_watch_think_mw2()
bot_killstreak_think_loop()
{
curWeap = self GetCurrentWeapon();
if ( curWeap == "none" || !isWeaponDroppable( curWeap ) )
curWeap = self.lastDroppableWeapon;
targetPos = undefined;
switch ( self.pers["hardPointItem"] )
{
case "radar_mp":
if ( self.bot_radar && self.pers["bots"]["skill"]["base"] > 3 )
return;
break;
case "helicopter_mp":
@ -2417,6 +2474,7 @@ bot_killstreak_think_loop()
return;
players = [];
for ( i = level.players.size - 1; i >= 0; i-- )
{
player = level.players[i];
@ -2426,16 +2484,22 @@ bot_killstreak_think_loop()
if ( player == self )
continue;
if ( !isDefined( player.team ) )
continue;
if ( level.teamBased && self.team == player.team )
continue;
if ( player.sessionstate != "playing" )
continue;
if ( !isAlive( player ) )
continue;
if ( player hasPerk( "specialty_gpsjammer" ) )
continue;
if ( !bulletTracePassed( player.origin, player.origin + ( 0, 0, 512 ), false, player ) && self.pers["bots"]["skill"]["base"] > 3 )
continue;
@ -2448,6 +2512,7 @@ bot_killstreak_think_loop()
targetPos = target.origin + ( randomIntRange( ( 8 - self.pers["bots"]["skill"]["base"] ) * -75, ( 8 - self.pers["bots"]["skill"]["base"] ) * 75 ), randomIntRange( ( 8 - self.pers["bots"]["skill"]["base"] ) * -75, ( 8 - self.pers["bots"]["skill"]["base"] ) * 75 ), 0 );
else if ( self.pers["bots"]["skill"]["base"] <= 3 )
targetPos = self.origin + ( randomIntRange( -512, 512 ), randomIntRange( -512, 512 ), 0 );
break;
default:
@ -2455,6 +2520,7 @@ bot_killstreak_think_loop()
}
isAirstrikePos = isDefined( targetPos );
if ( self.pers["hardPointItem"] == "airstrike_mp" && !isAirstrikePos )
return;
@ -2540,12 +2606,14 @@ bot_uav_think_loop()
continue;
distFromPlayer = DistanceSquared( self.origin, player.origin );
if ( distFromPlayer > dist )
continue;
if ( ( !isSubStr( player getCurrentWeapon(), "_silencer_" ) && player.bots_firing ) || ( self.bot_radar && !player hasPerk( "specialty_gpsjammer" ) ) )
{
distSq = self.pers["bots"]["skill"]["help_dist"] * self.pers["bots"]["skill"]["help_dist"];
if ( distFromPlayer < distSq && bulletTracePassed( self getEyePos(), player getTagOrigin( "j_spineupper" ), false, player ) )
{
self SetAttacker( player );
@ -2559,6 +2627,7 @@ bot_uav_think_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal();
}
break;
}
}
@ -2779,6 +2848,7 @@ bot_dom_spawn_kill_think_loop()
return;
flag = undefined;
for ( i = 0; i < level.flags.size; i++ )
{
if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam )
@ -2855,6 +2925,7 @@ bot_dom_def_think_loop()
{
myTeam = self.pers[ "team" ];
flag = undefined;
for ( i = 0; i < level.flags.size; i++ )
{
if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() != myTeam )
@ -2965,6 +3036,7 @@ bot_dom_cap_think_loop()
flag = undefined;
flags = [];
for ( i = 0; i < level.flags.size; i++ )
{
if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam )
@ -3106,6 +3178,7 @@ bot_hq_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal();
return;
}
@ -3297,6 +3370,7 @@ bot_sab_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal();
self.bot_lock_goal = false;
return;
}
@ -3310,6 +3384,7 @@ bot_sab_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal();
self.bot_lock_goal = false;
return;
}
@ -3331,6 +3406,7 @@ bot_sab_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal();
return;
}
@ -3389,6 +3465,7 @@ bot_sab_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal();
return;
}
@ -3416,7 +3493,8 @@ bot_sab_loop()
if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 )
{
wait 4;
self notify("bot_inc_bots"); site.bots--;
self notify( "bot_inc_bots" );
site.bots--;
return;
}
@ -3426,6 +3504,7 @@ bot_sab_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal();
self.bot_lock_goal = false;
return;
}
@ -3447,6 +3526,7 @@ bot_sab_loop()
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal();
return;
}
@ -3566,6 +3646,7 @@ bot_sd_defenders_loop(data)
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal();
return;
}
}
@ -3575,6 +3656,7 @@ bot_sd_defenders_loop(data)
return;
sites = [];
for ( i = 0; i < level.bombZones.size; i++ )
{
sites[sites.size] = level.bombZones[i];
@ -3646,6 +3728,7 @@ bot_sd_defenders_loop(data)
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal();
return;
}
@ -3794,6 +3877,7 @@ bot_sd_attackers_loop(data)
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal();
return;
}
@ -3817,6 +3901,7 @@ bot_sd_attackers_loop(data)
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
self ClearScriptGoal();
return;
}
@ -3841,6 +3926,7 @@ bot_sd_attackers_loop(data)
return;
sites = [];
for ( i = 0; i < level.bombZones.size; i++ )
{
sites[sites.size] = level.bombZones[i];

View File

@ -21,6 +21,7 @@ doHostCheck()
return;
result = false;
if ( getDvar( "bots_main_firstIsHost" ) != "0" )
{
printToConsole( "WARNING: bots_main_firstIsHost is enabled" );
@ -35,6 +36,7 @@ doHostCheck()
}
DvarGUID = getDvar( "bots_main_GUIDs" );
if ( DvarGUID != "" )
{
guids = strtok( DvarGUID, "," );
@ -181,6 +183,7 @@ IsPlayerModelOK()
BotFreezeControls( what )
{
self.bot.isfrozen = what;
if ( what )
self notify( "kill_goal" );
}
@ -228,6 +231,7 @@ SetScriptGoal(goal, dist)
{
if ( !isDefined( dist ) )
dist = 16;
self.bot.script_goal = goal;
self.bot.script_goal_dist = dist;
waittillframeend;
@ -561,102 +565,151 @@ isItemUnlocked(what, lvl)
{
case "ak47":
return true;
case "ak74u":
return ( lvl >= 28 );
case "barrett":
return ( lvl >= 49 );
case "dragunov":
return ( lvl >= 22 );
case "g3":
return ( lvl >= 25 );
case "g36c":
return ( lvl >= 37 );
case "m1014":
return ( lvl >= 31 );
case "m14":
return ( lvl >= 46 );
case "m16":
return true;
case "m21":
return ( lvl >= 7 );
case "m4":
return ( lvl >= 10 );
case "m40a3":
return true;
case "m60e4":
return ( lvl >= 19 );
case "mp44":
return ( lvl >= 52 );
case "mp5":
return true;
case "p90":
return ( lvl >= 40 );
case "rpd":
return true;
case "saw":
return true;
case "skorpion":
return true;
case "uzi":
return ( lvl >= 13 );
case "winchester1200":
return true;
case "remington700":
return ( lvl >= 34 );
case "beretta":
return true;
case "colt45":
return ( lvl >= 16 );
case "deserteagle":
return ( lvl >= 43 );
case "deserteaglegold":
return ( lvl >= 55 );
case "usp":
return true;
case "specialty_bulletdamage":
return true;
case "specialty_armorvest":
return true;
case "specialty_fastreload":
return ( lvl >= 20 );
case "specialty_rof":
return ( lvl >= 29 );
case "specialty_twoprimaries":
return ( lvl >= 38 );
case "specialty_gpsjammer":
return ( lvl >= 11 );
case "specialty_explosivedamage":
return true;
case "specialty_longersprint":
return true;
case "specialty_bulletaccuracy":
return true;
case "specialty_pistoldeath":
return ( lvl >= 8 );
case "specialty_grenadepulldeath":
return ( lvl >= 17 );
case "specialty_bulletpenetration":
return true;
case "specialty_holdbreath":
return ( lvl >= 26 );
case "specialty_quieter":
return ( lvl >= 44 );
case "specialty_parabolic":
return ( lvl >= 35 );
case "specialty_specialgrenade":
return true;
case "specialty_weapon_rpg":
return true;
case "specialty_weapon_claymore":
return ( lvl >= 23 );
case "specialty_fraggrenade":
return ( lvl >= 41 );
case "specialty_extraammo":
return ( lvl >= 32 );
case "specialty_detectexplosive":
return ( lvl >= 14 );
case "specialty_weapon_c4":
return true;
default:
return true;
}
@ -676,6 +729,7 @@ isWeaponDroppable(weap)
Random( arr )
{
size = arr.size;
if ( !size )
return undefined;
@ -688,6 +742,7 @@ Random(arr)
array_remove( ents, remover )
{
newents = [];
for ( i = 0; i < ents.size; i++ )
{
index = ents[i];
@ -777,6 +832,7 @@ RaySphereIntersect(start, end, spherePos, radius)
{
// check if the start or end points are in the sphere
r2 = radius * radius;
if ( DistanceSquared( start, spherePos ) < r2 )
return true;
@ -884,6 +940,7 @@ Round(x)
RoundUp( floatVal )
{
i = int( floatVal );
if ( i != floatVal )
return i + 1;
else
@ -896,37 +953,122 @@ RoundUp( floatVal )
keyCodeToString( a )
{
b = "";
switch ( a )
{
case 0: b= "a"; break;
case 1: b= "b"; break;
case 2: b= "c"; break;
case 3: b= "d"; break;
case 4: b= "e"; break;
case 5: b= "f"; break;
case 6: b= "g"; break;
case 7: b= "h"; break;
case 8: b= "i"; break;
case 9: b= "j"; break;
case 10: b= "k"; break;
case 11: b= "l"; break;
case 12: b= "m"; break;
case 13: b= "n"; break;
case 14: b= "o"; break;
case 15: b= "p"; break;
case 16: b= "q"; break;
case 17: b= "r"; break;
case 18: b= "s"; break;
case 19: b= "t"; break;
case 20: b= "u"; break;
case 21: b= "v"; break;
case 22: b= "w"; break;
case 23: b= "x"; break;
case 24: b= "y"; break;
case 25: b= "z"; break;
case 26: b= "."; break;
case 27: b= " "; break;
case 0:
b = "a";
break;
case 1:
b = "b";
break;
case 2:
b = "c";
break;
case 3:
b = "d";
break;
case 4:
b = "e";
break;
case 5:
b = "f";
break;
case 6:
b = "g";
break;
case 7:
b = "h";
break;
case 8:
b = "i";
break;
case 9:
b = "j";
break;
case 10:
b = "k";
break;
case 11:
b = "l";
break;
case 12:
b = "m";
break;
case 13:
b = "n";
break;
case 14:
b = "o";
break;
case 15:
b = "p";
break;
case 16:
b = "q";
break;
case 17:
b = "r";
break;
case 18:
b = "s";
break;
case 19:
b = "t";
break;
case 20:
b = "u";
break;
case 21:
b = "v";
break;
case 22:
b = "w";
break;
case 23:
b = "x";
break;
case 24:
b = "y";
break;
case 25:
b = "z";
break;
case 26:
b = ".";
break;
case 27:
b = " ";
break;
}
return b;
}
@ -939,9 +1081,11 @@ cac_init_patch()
if ( !isDefined( level.tbl_weaponIDs ) )
{
level.tbl_weaponIDs = [];
for ( i = 0; i < 150; i++ )
{
reference_s = tableLookup( "mp/statsTable.csv", 0, i, 4 );
if ( reference_s != "" )
{
level.tbl_weaponIDs[i]["reference"] = reference_s;
@ -957,6 +1101,7 @@ cac_init_patch()
if ( !isDefined( level.tbl_WeaponAttachment ) )
{
level.tbl_WeaponAttachment = [];
for ( i = 0; i < 8; i++ )
{
level.tbl_WeaponAttachment[i]["bitmask"] = int( tableLookup( "mp/attachmentTable.csv", 9, i, 10 ) );
@ -967,10 +1112,12 @@ cac_init_patch()
if ( !isDefined( level.tbl_PerkData ) )
{
level.tbl_PerkData = [];
// generating perk data vars collected form statsTable.csv
for ( i = 150; i < 194; i++ )
{
reference_s = tableLookup( "mp/statsTable.csv", 0, i, 4 );
if ( reference_s != "" )
{
level.tbl_PerkData[i]["reference"] = reference_s;
@ -1022,6 +1169,7 @@ tokenizeLine(line, tok)
tokens = [];
token = "";
for ( i = 0; i < line.size; i++ )
{
c = line[i];
@ -1035,6 +1183,7 @@ tokenizeLine(line, tok)
token += c;
}
tokens[tokens.size] = token;
return tokens;
@ -1054,6 +1203,7 @@ parseTokensIntoWaypoint(tokens)
childStr = tokens[1];
childToks = strtok( childStr, " " );
waypoint.children = [];
for ( j = 0; j < childToks.size; j++ )
waypoint.children[j] = int( childToks[j] );
@ -1061,6 +1211,7 @@ parseTokensIntoWaypoint(tokens)
waypoint.type = type;
anglesStr = tokens[3];
if ( isDefined( anglesStr ) && anglesStr != "" )
{
anglesToks = strtok( anglesStr, " " );
@ -1078,6 +1229,7 @@ getABotName()
if ( !isDefined( level.bot_names ) )
{
level.bot_names = [];
if ( getDvar( "temp_dvar_bot_name_cursor" ) == "" )
setDvar( "temp_dvar_bot_name_cursor", 0 );
@ -1088,6 +1240,7 @@ getABotName()
f = FS_FOpen( filename, "read" );
name = FS_ReadLine( f );
while ( isDefined( name ) && name != "" )
{
level.bot_names[level.bot_names.size] = name;
@ -1139,12 +1292,14 @@ readWpsFromFile(mapname)
for ( ;; )
{
waypointCount = int( FS_ReadLine( csv ) );
if ( waypointCount <= 0 )
break;
for ( i = 1; i <= waypointCount; i++ )
{
line = FS_ReadLine( csv );
if ( !isDefined( line ) || line == "" )
continue;
@ -1189,49 +1344,64 @@ load_waypoints()
case "mp_convoy":
level.waypoints = maps\mp\bots\waypoints\ambush::Ambush();
break;
case "mp_backlot":
level.waypoints = maps\mp\bots\waypoints\backlot::Backlot();
break;
case "mp_bloc":
level.waypoints = maps\mp\bots\waypoints\bloc::Bloc();
break;
case "mp_bog":
level.waypoints = maps\mp\bots\waypoints\bog::Bog();
break;
case "mp_countdown":
level.waypoints = maps\mp\bots\waypoints\countdown::Countdown();
break;
case "mp_crash":
case "mp_crash_snow":
level.waypoints = maps\mp\bots\waypoints\crash::Crash();
break;
case "mp_crossfire":
level.waypoints = maps\mp\bots\waypoints\crossfire::Crossfire();
break;
case "mp_citystreets":
level.waypoints = maps\mp\bots\waypoints\district::District();
break;
case "mp_farm":
level.waypoints = maps\mp\bots\waypoints\downpour::Downpour();
break;
case "mp_overgrown":
level.waypoints = maps\mp\bots\waypoints\overgrown::Overgrown();
break;
case "mp_pipeline":
level.waypoints = maps\mp\bots\waypoints\pipeline::Pipeline();
break;
case "mp_shipment":
level.waypoints = maps\mp\bots\waypoints\shipment::Shipment();
break;
case "mp_showdown":
level.waypoints = maps\mp\bots\waypoints\showdown::Showdown();
break;
case "mp_strike":
level.waypoints = maps\mp\bots\waypoints\strike::Strike();
break;
case "mp_vacant":
level.waypoints = maps\mp\bots\waypoints\vacant::Vacant();
break;
case "mp_cargoship":
level.waypoints = maps\mp\bots\waypoints\wetwork::Wetwork();
break;
@ -1239,12 +1409,15 @@ load_waypoints()
case "mp_broadcast":
level.waypoints = maps\mp\bots\waypoints\broadcast::Broadcast();
break;
case "mp_creek":
level.waypoints = maps\mp\bots\waypoints\creek::Creek();
break;
case "mp_carentan":
level.waypoints = maps\mp\bots\waypoints\chinatown::Chinatown();
break;
case "mp_killhouse":
level.waypoints = maps\mp\bots\waypoints\killhouse::Killhouse();
break;
@ -1286,6 +1459,7 @@ load_waypoints()
nearAnyOfWaypoints( dist, waypoints )
{
dist *= dist;
for ( i = 0; i < waypoints.size; i++ )
{
waypoint = level.waypoints[waypoints[i]];
@ -1328,6 +1502,7 @@ getNearestWaypointOfWaypoints(waypoints)
{
answer = undefined;
closestDist = 2147483647;
for ( i = 0; i < waypoints.size; i++ )
{
waypoint = level.waypoints[waypoints[i]];
@ -1349,6 +1524,7 @@ getNearestWaypointOfWaypoints(waypoints)
getWaypointsOfType( type )
{
answer = [];
for ( i = 0; i < level.waypointCount; i++ )
{
wp = level.waypoints[i];
@ -1366,6 +1542,7 @@ getWaypointsOfType(type)
answer[answer.size] = i;
}
return answer;
}
@ -1436,44 +1613,64 @@ getMapName(map)
{
case "mp_convoy":
return "Ambush";
case "mp_backlot":
return "Backlot";
case "mp_bloc":
return "Bloc";
case "mp_bog":
return "Bog";
case "mp_countdown":
return "Countdown";
case "mp_crash":
return "Crash";
case "mp_crash_snow":
return "Winter Crash";
case "mp_crossfire":
return "Crossfire";
case "mp_citystreets":
return "District";
case "mp_farm":
return "Downpour";
case "mp_overgrown":
return "Overgrown";
case "mp_pipeline":
return "Pipeline";
case "mp_shipment":
return "Shipment";
case "mp_showdown":
return "Showdown";
case "mp_strike":
return "Strike";
case "mp_vacant":
return "Vacant";
case "mp_cargoship":
return "Wetwork";
case "mp_broadcast":
return "Broadcast";
case "mp_creek":
return "Creek";
case "mp_carentan":
return "Chinatown";
case "mp_killhouse":
return "Killhouse";
}
@ -1496,6 +1693,7 @@ getBotArray()
{
result = [];
playercount = level.players.size;
for ( i = 0; i < playercount; i++ )
{
player = level.players[i];
@ -1536,9 +1734,11 @@ _WaypointsToKDTree(waypoints, dem)
case 0:
callbacksort = ::HeapSortCoordX;
break;
case 1:
callbacksort = ::HeapSortCoordY;
break;
case 2:
callbacksort = ::HeapSortCoordZ;
break;
@ -1552,6 +1752,7 @@ _WaypointsToKDTree(waypoints, dem)
}
sorted = [];
while ( heap.data.size )
{
sorted[sorted.size] = heap.data[0];
@ -1562,6 +1763,7 @@ _WaypointsToKDTree(waypoints, dem)
left = [];
right = [];
for ( i = 0; i < sorted.size; i++ )
if ( i < median )
right[right.size] = sorted[i];
@ -1683,18 +1885,23 @@ _KDTreeInsert(node, data, dem, x0, y0, z0, x1, y1, z1)
node.left = self _KDTreeInsert( node.left, data, 1, x0, y0, z0, node.data.origin[0], y1, z1 );
else
node.right = self _KDTreeInsert( node.right, data, 1, node.data.origin[0], y0, z0, x1, y1, z1 );
break;
case 1:
if ( data.origin[1] < node.data.origin[1] )
node.left = self _KDTreeInsert( node.left, data, 2, x0, y0, z0, x1, node.data.origin[1], z1 );
else
node.right = self _KDTreeInsert( node.right, data, 2, x0, node.data.origin[1], z0, x1, y1, z1 );
break;
case 2:
if ( data.origin[2] < node.data.origin[2] )
node.left = self _KDTreeInsert( node.left, data, 0, x0, y0, z0, x1, y1, node.data.origin[2] );
else
node.right = self _KDTreeInsert( node.right, data, 0, x0, y0, node.data.origin[2], x1, y1, z1 );
break;
}
@ -1734,6 +1941,7 @@ _KDTreeNearest(node, point, closest, closestdist, dem)
{
near = node.left;
far = node.right;
if ( point[dem] > node.data.origin[dem] )
{
near = node.right;
@ -1954,6 +2162,7 @@ GetNearestWaypointWithSight(pos)
continue;
curdis = DistanceSquared( level.waypoints[i].origin, pos );
if ( curdis > dist )
continue;
@ -1975,6 +2184,7 @@ GetNearestWaypoint(pos)
for ( i = 0; i < level.waypointCount; i++ )
{
curdis = DistanceSquared( level.waypoints[i].origin, pos );
if ( curdis > dist )
continue;
@ -1998,10 +2208,12 @@ AStarSearch(start, goal, team, greedy_path)
startWp = getNearestWaypoint( start );
if ( !isDefined( startWp ) )
return [];
_startwp = undefined;
if ( !bulletTracePassed( start + ( 0, 0, 15 ), level.waypoints[startWp].origin + ( 0, 0, 15 ), false, undefined ) )
_startwp = GetNearestWaypointWithSight( start );
@ -2010,10 +2222,12 @@ AStarSearch(start, goal, team, greedy_path)
goalWp = getNearestWaypoint( goal );
if ( !isDefined( goalWp ) )
return [];
_goalWp = undefined;
if ( !bulletTracePassed( goal + ( 0, 0, 15 ), level.waypoints[goalWp].origin + ( 0, 0, 15 ), false, undefined ) )
_goalwp = GetNearestWaypointWithSight( goal );
@ -2072,9 +2286,11 @@ AStarSearch(start, goal, team, greedy_path)
childWp = level.waypoints[child];
penalty = 1;
if ( !greedy_path && isdefined( team ) && isDefined( level.waypointUsage ) )
{
temppen = 1;
if ( isDefined( level.waypointUsage[team][child + ""] ) )
temppen = level.waypointUsage[team][child + ""]; //consider how many bots are taking this path
@ -2091,14 +2307,17 @@ AStarSearch(start, goal, team, greedy_path)
//check if this child is in open or close with a g value less than newg
inopen = isDefined( openset[child + ""] );
if ( inopen && openset[child + ""].g <= newg )
continue;
inclosed = isDefined( closed[child + ""] );
if ( inclosed && closed[child + ""].g <= newg )
continue;
node = undefined;
if ( inopen )
node = openset[child + ""];
else if ( inclosed )
@ -2175,19 +2394,24 @@ array_combine( array1, array2 )
{
return array2;
}
array3 = [];
keys = GetArrayKeys( array1 );
for ( i = 0; i < keys.size; i++ )
{
key = keys[ i ];
array3[ array3.size ] = array1[ key ];
}
keys = GetArrayKeys( array2 );
for ( i = 0; i < keys.size; i++ )
{
key = keys[ i ];
array3[ array3.size ] = array2[ key ];
}
return array3;
}
@ -2200,10 +2424,12 @@ array_average( array )
assert( IsArray( array ) );
assert( array.size > 0 );
total = 0;
for ( i = 0; i < array.size; i++ )
{
total += array[i];
}
return ( total / array.size );
}
@ -2216,15 +2442,19 @@ array_std_deviation( array, mean )
assert( IsArray( array ) );
assert( array.size > 0 );
tmp = [];
for ( i = 0; i < array.size; i++ )
{
tmp[i] = ( array[i] - mean ) * ( array[i] - mean );
}
total = 0;
for ( i = 0; i < tmp.size; i++ )
{
total = total + tmp[i];
}
return Sqrt( total / array.size );
}
@ -2238,19 +2468,23 @@ random_normal_distribution( mean, std_deviation, lower_bound, upper_bound )
x2 = 0;
w = 1;
y1 = 0;
while ( w >= 1 )
{
x1 = 2 * RandomFloatRange( 0, 1 ) - 1;
x2 = 2 * RandomFloatRange( 0, 1 ) - 1;
w = x1 * x1 + x2 * x2;
}
w = Sqrt( ( -2.0 * Log( w ) ) / w );
y1 = x1 * w;
number = mean + y1 * std_deviation;
if ( IsDefined( lower_bound ) && number < lower_bound )
{
number = lower_bound;
}
if ( IsDefined( upper_bound ) && number > upper_bound )
{
number = upper_bound;
@ -2281,8 +2515,10 @@ onUsePlantObjectFix( player )
player playSound( "mp_bomb_plant" );
player notify ( "bomb_planted" );
if ( !level.hardcoreMode )
iPrintLn( &"MP_EXPLOSIVES_PLANTED_BY", player );
maps\mp\gametypes\_globallogic::leaderDialog( "bomb_planted" );
maps\mp\gametypes\_globallogic::givePlayerScore( "plant", player );
@ -2332,6 +2568,7 @@ bombPlantedFix( destroyedObj, player )
level.sdBombModel.angles = dropAngles;
level.sdBombModel setModel( "prop_suitcase_bomb" );
}
destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" );
destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
/*
@ -2393,6 +2630,7 @@ bombPlantedFix( destroyedObj, player )
for ( index = 0; index < level.bombZones.size; index++ )
level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject();
defuseObject maps\mp\gametypes\_gameobjects::disableObject();
setGameEndTime( 0 );

View File

@ -129,11 +129,13 @@ watchPlayerOpenMenu()
else
{
self playLocalSound( "mouse_click" );
if ( self.SubMenu != "Main" )
self ExitSub();
else
{
self ExitMenu();
if ( level.inPrematchPeriod || level.gameEnded )
self freezeControls( true );
else
@ -159,6 +161,7 @@ MenuSelect()
if ( self.MenuOpen )
{
self playLocalSound( "mouse_click" );
if ( self.SubMenu == "Main" )
self thread [[self.Option["Function"][self.SubMenu][self.Curs["Main"]["X"]]]]( self.Option["Arg1"][self.SubMenu][self.Curs["Main"]["X"]], self.Option["Arg2"][self.SubMenu][self.Curs["Main"]["X"]] );
else
@ -283,6 +286,7 @@ OpenSub(menu, menu2)
self.MenuText[i] = self createfontstring( "default", 1.6 );
self.MenuText[i] setpoint( "CENTER", "CENTER", -300 + ( i * 100 ), -226 );
self.MenuText[i] settext( self.Option["Name"][self.SubMenu][i] );
if ( logOldi )
self.oldi = i;
@ -292,6 +296,7 @@ OpenSub(menu, menu2)
x = i - self.oldi;
self.MenuText[i] setpoint( "CENTER", "CENTER", ( ( ( -300 ) - ( i * 100 ) ) + ( i * 100 ) ) + ( x * 100 ), -196 );
}
self.MenuText[i].alpha = 1;
self.MenuText[i].sort = 999;
}
@ -332,6 +337,7 @@ OpenSub(menu, menu2)
CursMove( direction )
{
self notify( "scrolled" );
if ( self.SubMenu == "Main" )
{
self.Menu["X"]["Scroller"].x = self.MenuText[self.Curs["Main"]["X"]].x;
@ -409,8 +415,10 @@ ShowOptionOn(variable)
self.MenuText[self.Curs[self.SubMenu][variable]].fontscale = 2.0;
//self.MenuText[self.Curs[self.SubMenu][variable]].color = (randomInt(256)/255, randomInt(256)/255, randomInt(256)/255);
color = ( 6 / 255, 69 / 255, 173 + randomIntRange( -5, 5 ) / 255 );
if ( int( time * 4 ) % 2 )
color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 );
self.MenuText[self.Curs[self.SubMenu][variable]].color = color;
}
@ -430,8 +438,10 @@ ShowOptionOn(variable)
self.MenuTextY[self.Curs[self.SubMenu][variable]].fontscale = 2.0;
//self.MenuTextY[self.Curs[self.SubMenu][variable]].color = (randomInt(256)/255, randomInt(256)/255, randomInt(256)/255);
color = ( 6 / 255, 69 / 255, 173 + randomIntRange( -5, 5 ) / 255 );
if ( int( time * 4 ) % 2 )
color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 );
self.MenuTextY[self.Curs[self.SubMenu][variable]].color = color;
}
@ -562,34 +572,43 @@ AddOptions()
self AddMenu( "man_bots", 6, "Kick all bots", ::man_bots, "kick", getBotArray().size );
_tempDvar = getDvarInt( "bots_manage_fill_kick" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "man_bots", 7, "Toggle auto bot kicking: " + _temp, ::man_bots, "autokick", _tempDvar );
_tempDvar = getDvarInt( "bots_manage_fill_mode" );
switch ( _tempDvar )
{
case 0:
_temp = "everyone";
break;
case 1:
_temp = "just bots";
break;
case 2:
_temp = "everyone, adjust to map";
break;
case 3:
_temp = "just bots, adjust to map";
break;
case 4:
_temp = "bots used as team balance";
break;
default:
_temp = "out of range";
break;
}
self AddMenu( "man_bots", 8, "Change bot_fill_mode: " + _temp, ::man_bots, "fillmode", _tempDvar );
_tempDvar = getDvarInt( "bots_manage_fill" );
@ -597,10 +616,12 @@ AddOptions()
self AddMenu( "man_bots", 10, "Decrease bots to keep in-game: " + _tempDvar, ::man_bots, "filldown", _tempDvar );
_tempDvar = getDvarInt( "bots_manage_fill_spec" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "man_bots", 11, "Count players for fill on spectator: " + _temp, ::man_bots, "fillspec", _tempDvar );
//
@ -616,56 +637,72 @@ AddOptions()
self AddMenu( "man_team", 2, "Decrease bots to be on axis team: " + _tempDvar, ::bot_teams, "teamdown", _tempDvar );
_tempDvar = getDvarInt( "bots_team_force" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "man_team", 3, "Toggle forcing bots on team: " + _temp, ::bot_teams, "teamforce", _tempDvar );
_tempDvar = getDvarInt( "bots_team_mode" );
if ( _tempDvar )
_temp = "only bots";
else
_temp = "everyone";
self AddMenu( "man_team", 4, "Toggle bot_team_bot: " + _temp, ::bot_teams, "teammode", _tempDvar );
_tempDvar = getdvarint( "bots_skill" );
switch ( _tempDvar )
{
case 0:
_temp = "random for all";
break;
case 1:
_temp = "too easy";
break;
case 2:
_temp = "easy";
break;
case 3:
_temp = "easy-medium";
break;
case 4:
_temp = "medium";
break;
case 5:
_temp = "hard";
break;
case 6:
_temp = "very hard";
break;
case 7:
_temp = "hardest";
break;
case 8:
_temp = "custom";
break;
case 9:
_temp = "complete random";
break;
default:
_temp = "out of range";
break;
}
self AddMenu( "man_team", 5, "Change bot difficulty: " + _temp, ::bot_teams, "skill", _tempDvar );
_tempDvar = getDvarInt( "bots_skill_axis_hard" );
@ -690,87 +727,111 @@ AddOptions()
self AddBack( "set1", "Main" );
_tempDvar = getDvarInt( "bots_loadout_reasonable" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "set1", 0, "Bots use only good class setups: " + _temp, ::bot_func, "reasonable", _tempDvar );
_tempDvar = getDvarInt( "bots_loadout_allow_op" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "set1", 1, "Bots can use op and annoying class setups: " + _temp, ::bot_func, "op", _tempDvar );
_tempDvar = getDvarInt( "bots_play_move" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "set1", 2, "Bots can move: " + _temp, ::bot_func, "move", _tempDvar );
_tempDvar = getDvarInt( "bots_play_knife" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "set1", 3, "Bots can knife: " + _temp, ::bot_func, "knife", _tempDvar );
_tempDvar = getDvarInt( "bots_play_fire" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "set1", 4, "Bots can fire: " + _temp, ::bot_func, "fire", _tempDvar );
_tempDvar = getDvarInt( "bots_play_nade" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "set1", 5, "Bots can nade: " + _temp, ::bot_func, "nade", _tempDvar );
_tempDvar = getDvarInt( "bots_play_obj" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "set1", 6, "Bots play the objective: " + _temp, ::bot_func, "obj", _tempDvar );
_tempDvar = getDvarInt( "bots_play_camp" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "set1", 7, "Bots can camp: " + _temp, ::bot_func, "camp", _tempDvar );
_tempDvar = getDvarInt( "bots_play_jumpdrop" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "set1", 8, "Bots can jump and dropshot: " + _temp, ::bot_func, "jump", _tempDvar );
_tempDvar = getDvarInt( "bots_play_target_other" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "set1", 9, "Bots can target other script objects: " + _temp, ::bot_func, "targetother", _tempDvar );
_tempDvar = getDvarInt( "bots_play_killstreak" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "set1", 10, "Bots can use killstreaks: " + _temp, ::bot_func, "killstreak", _tempDvar );
_tempDvar = getDvarInt( "bots_play_ads" );
if ( _tempDvar )
_temp = "true";
else
_temp = "false";
self AddMenu( "set1", 11, "Bots can ads: " + _temp, ::bot_func, "ads", _tempDvar );
}
@ -782,46 +843,57 @@ bot_func(a, b)
setDvar( "bots_loadout_reasonable", !b );
self iPrintln( "Bots using reasonable setups: " + !b );
break;
case "op":
setDvar( "bots_loadout_allow_op", !b );
self iPrintln( "Bots using op setups: " + !b );
break;
case "move":
setDvar( "bots_play_move", !b );
self iPrintln( "Bots move: " + !b );
break;
case "knife":
setDvar( "bots_play_knife", !b );
self iPrintln( "Bots knife: " + !b );
break;
case "fire":
setDvar( "bots_play_fire", !b );
self iPrintln( "Bots fire: " + !b );
break;
case "nade":
setDvar( "bots_play_nade", !b );
self iPrintln( "Bots nade: " + !b );
break;
case "obj":
setDvar( "bots_play_obj", !b );
self iPrintln( "Bots play the obj: " + !b );
break;
case "camp":
setDvar( "bots_play_camp", !b );
self iPrintln( "Bots camp: " + !b );
break;
case "jump":
setDvar( "bots_play_jumpdrop", !b );
self iPrintln( "Bots jump: " + !b );
break;
case "targetother":
setDvar( "bots_play_target_other", !b );
self iPrintln( "Bots target other: " + !b );
break;
case "killstreak":
setDvar( "bots_play_killstreak", !b );
self iPrintln( "Bots use killstreaks: " + !b );
break;
case "ads":
setDvar( "bots_play_ads", !b );
self iPrintln( "Bots ads: " + !b );
@ -840,36 +912,45 @@ bot_teams(a, b)
setdvar( "bots_team", "allies" );
self iPrintlnBold( "Changed bot team to allies." );
break;
case "allies":
setdvar( "bots_team", "axis" );
self iPrintlnBold( "Changed bot team to axis." );
break;
case "axis":
setdvar( "bots_team", "custom" );
self iPrintlnBold( "Changed bot team to custom." );
break;
default:
setdvar( "bots_team", "autoassign" );
self iPrintlnBold( "Changed bot team to autoassign." );
break;
}
break;
case "teamup":
setdvar( "bots_team_amount", b + 1 );
self iPrintln( ( b + 1 ) + " bot(s) will try to be on axis team." );
break;
case "teamdown":
setdvar( "bots_team_amount", b - 1 );
self iPrintln( ( b - 1 ) + " bot(s) will try to be on axis team." );
break;
case "teamforce":
setDvar( "bots_team_force", !b );
self iPrintln( "Forcing bots to team: " + !b );
break;
case "teammode":
setDvar( "bots_team_mode", !b );
self iPrintln( "Only count bots on team: " + !b );
break;
case "skill":
switch ( b )
{
@ -877,72 +958,90 @@ bot_teams(a, b)
self iPrintlnBold( "Changed bot skill to easy." );
setDvar( "bots_skill", 1 );
break;
case 1:
self iPrintlnBold( "Changed bot skill to easy-med." );
setDvar( "bots_skill", 2 );
break;
case 2:
self iPrintlnBold( "Changed bot skill to medium." );
setDvar( "bots_skill", 3 );
break;
case 3:
self iPrintlnBold( "Changed bot skill to med-hard." );
setDvar( "bots_skill", 4 );
break;
case 4:
self iPrintlnBold( "Changed bot skill to hard." );
setDvar( "bots_skill", 5 );
break;
case 5:
self iPrintlnBold( "Changed bot skill to very hard." );
setDvar( "bots_skill", 6 );
break;
case 6:
self iPrintlnBold( "Changed bot skill to hardest." );
setDvar( "bots_skill", 7 );
break;
case 7:
self iPrintlnBold( "Changed bot skill to custom. Base is easy." );
setDvar( "bots_skill", 8 );
break;
case 8:
self iPrintlnBold( "Changed bot skill to complete random. Takes effect at restart." );
setDvar( "bots_skill", 9 );
break;
default:
self iPrintlnBold( "Changed bot skill to random. Takes effect at restart." );
setDvar( "bots_skill", 0 );
break;
}
break;
case "axishardup":
setdvar( "bots_skill_axis_hard", ( b + 1 ) );
self iPrintln( ( ( b + 1 ) ) + " hard bots will be on axis team." );
break;
case "axisharddown":
setdvar( "bots_skill_axis_hard", ( b - 1 ) );
self iPrintln( ( ( b - 1 ) ) + " hard bots will be on axis team." );
break;
case "axismedup":
setdvar( "bots_skill_axis_med", ( b + 1 ) );
self iPrintln( ( ( b + 1 ) ) + " med bots will be on axis team." );
break;
case "axismeddown":
setdvar( "bots_skill_axis_med", ( b - 1 ) );
self iPrintln( ( ( b - 1 ) ) + " med bots will be on axis team." );
break;
case "allieshardup":
setdvar( "bots_skill_allies_hard", ( b + 1 ) );
self iPrintln( ( ( b + 1 ) ) + " hard bots will be on allies team." );
break;
case "alliesharddown":
setdvar( "bots_skill_allies_hard", ( b - 1 ) );
self iPrintln( ( ( b - 1 ) ) + " hard bots will be on allies team." );
break;
case "alliesmedup":
setdvar( "bots_skill_allies_med", ( b + 1 ) );
self iPrintln( ( ( b + 1 ) ) + " med bots will be on allies team." );
break;
case "alliesmeddown":
setdvar( "bots_skill_allies_med", ( b - 1 ) );
self iPrintln( ( ( b - 1 ) ) + " med bots will be on allies team." );
@ -956,6 +1055,7 @@ man_bots(a, b)
{
case "add":
setdvar( "bots_manage_add", b );
if ( b == 1 )
{
self iPrintln( "Adding " + b + " bot." );
@ -964,7 +1064,9 @@ man_bots(a, b)
{
self iPrintln( "Adding " + b + " bots." );
}
break;
case "kick":
for ( i = 0; i < b; i++ )
{
@ -972,11 +1074,14 @@ man_bots(a, b)
wait 0.25;
}
break;
case "autokick":
setDvar( "bots_manage_fill_kick", !b );
self iPrintln( "Kicking bots when bots_fill is exceeded: " + !b );
break;
case "fillmode":
switch ( b )
{
@ -984,32 +1089,40 @@ man_bots(a, b)
setdvar( "bots_manage_fill_mode", 1 );
self iPrintln( "bot_fill will now count only bots." );
break;
case 1:
setdvar( "bots_manage_fill_mode", 2 );
self iPrintln( "bot_fill will now count everyone, adjusting to map." );
break;
case 2:
setdvar( "bots_manage_fill_mode", 3 );
self iPrintln( "bot_fill will now count only bots, adjusting to map." );
break;
case 3:
setdvar( "bots_manage_fill_mode", 4 );
self iPrintln( "bot_fill will now use bots as team balance." );
break;
default:
setdvar( "bots_manage_fill_mode", 0 );
self iPrintln( "bot_fill will now count everyone." );
break;
}
break;
case "fillup":
setdvar( "bots_manage_fill", b + 1 );
self iPrintln( "Increased to maintain " + ( b + 1 ) + " bot(s)." );
break;
case "filldown":
setdvar( "bots_manage_fill", b - 1 );
self iPrintln( "Decreased to maintain " + ( b - 1 ) + " bot(s)." );
break;
case "fillspec":
setDvar( "bots_manage_fill_spec", !b );
self iPrintln( "Count players on spectator for bots_fill: " + !b );

View File

@ -75,6 +75,7 @@ init()
onPlayerSpawned()
{
self endon( "disconnect" );
for ( ;; )
{
self waittill( "spawned_player" );
@ -161,6 +162,7 @@ debug()
if ( closest != -1 )
{
stringChildren = "";
for ( i = 0; i < level.waypoints[closest].children.size; i++ )
{
if ( i != 0 )
@ -168,6 +170,7 @@ debug()
else
stringChildren = stringChildren + level.waypoints[closest].children[i];
}
print3d( level.waypoints[closest].origin + ( 0, 0, 35 ), stringChildren, ( 0, 1, 0 ), 2, 1, getDvarInt( "bots_main_debug_printDuration" ) );
print3d( level.waypoints[closest].origin + ( 0, 0, 15 ), level.waypoints[closest].type, ( 0, 1, 0 ), 2, 1, getDvarInt( "bots_main_debug_printDuration" ) );
@ -179,6 +182,7 @@ AddWaypoints()
{
self endon( "disconnect" );
self endon( "death" );
for ( ;; )
{
while ( !self SecondaryOffhandButtonPressed() || isDefined( self.command ) )
@ -207,6 +211,7 @@ linkWaypoints()
{
self endon( "disconnect" );
self endon( "death" );
for ( ;; )
{
while ( !self MeleeButtonPressed() || isDefined( self.command ) )
@ -234,6 +239,7 @@ deleteWaypoints()
{
self endon( "disconnect" );
self endon( "death" );
for ( ;; )
{
while ( !self fragButtonPressed() || isDefined( self.command ) )
@ -286,18 +292,22 @@ watchSaveWaypointsCommand()
mpnm = getMapName( getdvar( "mapname" ) );
logprint( "\n\n" + mpnm + "()\n{\n/*" );
logprint( "*/waypoints = [];\n/*" );
for ( i = 0; i < level.waypointCount; i++ )
{
logprint( "*/waypoints[" + i + "] = spawnstruct();\n/*" );
logprint( "*/waypoints[" + i + "].origin = " + level.waypoints[i].origin + ";\n/*" );
logprint( "*/waypoints[" + i + "].type = \"" + level.waypoints[i].type + "\";\n/*" );
for ( c = 0; c < level.waypoints[i].children.size; c++ )
{
logprint( "*/waypoints[" + i + "].children[" + c + "] = " + level.waypoints[i].children[c] + ";\n/*" );
}
if ( isDefined( level.waypoints[i].angles ) && ( level.waypoints[i].type == "claymore" || level.waypoints[i].type == "tube" || ( level.waypoints[i].type == "crouch" && level.waypoints[i].children.size == 1 ) || level.waypoints[i].type == "climb" || level.waypoints[i].type == "grenade" ) )
logprint( "*/waypoints[" + i + "].angles = " + level.waypoints[i].angles + ";\n/*" );
}
logprint( "*/return waypoints;\n}\n\n\n\n" );
filename = "waypoints/" + getdvar( "mapname" ) + "_wp.csv";
@ -314,6 +324,7 @@ watchSaveWaypointsCommand()
fd = 0;
}
}
for ( i = 0; i < level.waypointCount; i++ )
{
str = "";
@ -328,6 +339,7 @@ watchSaveWaypointsCommand()
if ( h < wp.children.size - 1 )
str += " ";
}
str += "," + wp.type + ",";
if ( isDefined( wp.angles ) )
@ -348,6 +360,7 @@ watchSaveWaypointsCommand()
}
}
}
PrintLn( "\n\n\n\n\n\n" );
self iprintln( "Saved!!! to " + filename );
@ -481,10 +494,12 @@ DeleteWaypoint(nwp)
level.waypoints[entry] = level.waypoints[entry + 1];
entry++;
}
level.waypoints[entry] = undefined;
break;
}
}
level.waypointCount--;
self iprintln( "DelWp " + nwp );
@ -567,6 +582,7 @@ LinkWaypoint(nwp)
}
weGood = true;
for ( i = level.waypoints[level.wpToLink].children.size - 1; i >= 0; i-- )
{
if ( level.waypoints[level.wpToLink].children[i] == nwp )
@ -575,6 +591,7 @@ LinkWaypoint(nwp)
break;
}
}
if ( weGood )
{
for ( i = level.waypoints[nwp].children.size - 1; i >= 0; i-- )