mirror of
https://github.com/ineedbots/t4_bot_warfare.git
synced 2025-04-22 07:55:43 +00:00
Working
This commit is contained in:
parent
cc76a76214
commit
465c917248
@ -120,7 +120,7 @@ onPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon,
|
||||
if(self is_bot())
|
||||
{
|
||||
//self maps\mp\bots\_bot_internal::onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset);
|
||||
//self maps\mp\bots\_bot_script::onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset);
|
||||
self maps\mp\bots\_bot_script::onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset);
|
||||
}
|
||||
|
||||
self [[level.prevCallbackPlayerDamage]](eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset);
|
||||
@ -134,7 +134,7 @@ onPlayerKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHi
|
||||
if(self is_bot())
|
||||
{
|
||||
//self maps\mp\bots\_bot_internal::onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration);
|
||||
//self maps\mp\bots\_bot_script::onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration);
|
||||
self maps\mp\bots\_bot_script::onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration);
|
||||
}
|
||||
|
||||
self [[level.prevCallbackPlayerKilled]](eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration);
|
||||
@ -280,7 +280,7 @@ connected()
|
||||
self thread fixPerksAndScriptKick();
|
||||
|
||||
//self thread maps\mp\bots\_bot_internal::connected();
|
||||
//self thread maps\mp\bots\_bot_script::connected();
|
||||
self thread maps\mp\bots\_bot_script::connected();
|
||||
|
||||
level.bots[level.bots.size] = self;
|
||||
self thread onDisconnect();
|
||||
@ -296,7 +296,7 @@ added()
|
||||
self endon("disconnect");
|
||||
|
||||
//self thread maps\mp\bots\_bot_internal::added();
|
||||
//self thread maps\mp\bots\_bot_script::added();
|
||||
self thread maps\mp\bots\_bot_script::added();
|
||||
}
|
||||
|
||||
/*
|
||||
|
1822
main_shared/maps/mp/bots/_bot_internal.gsc
Normal file
1822
main_shared/maps/mp/bots/_bot_internal.gsc
Normal file
File diff suppressed because it is too large
Load Diff
829
main_shared/maps/mp/bots/_bot_script.gsc
Normal file
829
main_shared/maps/mp/bots/_bot_script.gsc
Normal file
@ -0,0 +1,829 @@
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes\_hud_util;
|
||||
#include maps\mp\bots\_bot_utility;
|
||||
|
||||
/*
|
||||
When the bot gets added into the game.
|
||||
*/
|
||||
added()
|
||||
{
|
||||
self endon("disconnect");
|
||||
|
||||
rankxp = self bot_get_rank();
|
||||
self setStat( int(tableLookup( "mp/playerStatsTable.csv", 1, "rankxp", 0 )), rankxp );
|
||||
|
||||
self set_diff();
|
||||
|
||||
//self set_class(rankxp);
|
||||
}
|
||||
|
||||
/*
|
||||
When the bot connects to the game.
|
||||
*/
|
||||
connected()
|
||||
{
|
||||
self endon("disconnect");
|
||||
|
||||
self.killerLocation = undefined;
|
||||
|
||||
self thread difficulty();
|
||||
self thread teamWatch();
|
||||
self thread classWatch();
|
||||
//self thread onBotSpawned();
|
||||
//self thread onSpawned();
|
||||
}
|
||||
|
||||
/*
|
||||
The callback for when the bot gets killed.
|
||||
*/
|
||||
onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration)
|
||||
{
|
||||
self.killerLocation = undefined;
|
||||
|
||||
if(!IsDefined( self ) || !isDefined(self.team))
|
||||
return;
|
||||
|
||||
if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" )
|
||||
return;
|
||||
|
||||
if ( iDamage <= 0 )
|
||||
return;
|
||||
|
||||
if(!IsDefined( eAttacker ) || !isDefined(eAttacker.team))
|
||||
return;
|
||||
|
||||
if(eAttacker == self)
|
||||
return;
|
||||
|
||||
if(level.teamBased && eAttacker.team == self.team)
|
||||
return;
|
||||
|
||||
if ( !IsDefined( eInflictor ) || eInflictor.classname != "player")
|
||||
return;
|
||||
|
||||
if(!isAlive(eAttacker))
|
||||
return;
|
||||
|
||||
self.killerLocation = eAttacker.origin;
|
||||
}
|
||||
|
||||
/*
|
||||
The callback for when the bot gets damaged.
|
||||
*/
|
||||
onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset)
|
||||
{
|
||||
if(!IsDefined( self ) || !isDefined(self.team))
|
||||
return;
|
||||
|
||||
if(!isAlive(self))
|
||||
return;
|
||||
|
||||
if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" )
|
||||
return;
|
||||
|
||||
if ( iDamage <= 0 )
|
||||
return;
|
||||
|
||||
if(!IsDefined( eAttacker ) || !isDefined(eAttacker.team))
|
||||
return;
|
||||
|
||||
if(eAttacker == self)
|
||||
return;
|
||||
|
||||
if(level.teamBased && eAttacker.team == self.team)
|
||||
return;
|
||||
|
||||
if ( !IsDefined( eInflictor ) || eInflictor.classname != "player")
|
||||
return;
|
||||
|
||||
if(!isAlive(eAttacker))
|
||||
return;
|
||||
|
||||
if (!isSubStr(sWeapon, "silenced_") && !isSubStr(sWeapon, "flash_"))
|
||||
self bot_cry_for_help( eAttacker );
|
||||
|
||||
self SetAttacker( eAttacker );
|
||||
}
|
||||
|
||||
/*
|
||||
When the bot gets attacked, have the bot ask for help from teammates.
|
||||
*/
|
||||
bot_cry_for_help( attacker )
|
||||
{
|
||||
if ( !level.teamBased )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
theTime = GetTime();
|
||||
if ( IsDefined( self.help_time ) && theTime - self.help_time < 1000 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
self.help_time = theTime;
|
||||
|
||||
for ( i = level.players.size - 1; i >= 0; i-- )
|
||||
{
|
||||
player = level.players[i];
|
||||
|
||||
if ( !player is_bot() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!isDefined(player.team))
|
||||
continue;
|
||||
|
||||
if ( !IsAlive( player ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( player == self )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( player.team != self.team )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
dist = player.pers["bots"]["skill"]["help_dist"];
|
||||
dist *= dist;
|
||||
if ( DistanceSquared( self.origin, player.origin ) > dist )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( RandomInt( 100 ) < 50 )
|
||||
{
|
||||
self SetAttacker( attacker );
|
||||
|
||||
if ( RandomInt( 100 ) > 70 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Selects a class for the bot.
|
||||
*/
|
||||
classWatch()
|
||||
{
|
||||
self endon("disconnect");
|
||||
|
||||
for(;;)
|
||||
{
|
||||
while(!isdefined(self.pers["team"]) || level.oldschool)
|
||||
wait .05;
|
||||
|
||||
wait 0.5;
|
||||
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 == "")
|
||||
{
|
||||
switch(randomInt(5))
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
class = "custom"+(randomInt(5)+1);
|
||||
}
|
||||
|
||||
self notify("menuresponse", game["menu_changeclass"], class);
|
||||
self.bot_change_class = true;
|
||||
|
||||
while(isdefined(self.pers["team"]) && isdefined(self.pers["class"]) && isDefined(self.bot_change_class))
|
||||
wait .05;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Makes sure the bot is on a team.
|
||||
*/
|
||||
teamWatch()
|
||||
{
|
||||
self endon("disconnect");
|
||||
|
||||
for(;;)
|
||||
{
|
||||
while(!isdefined(self.pers["team"]))
|
||||
wait .05;
|
||||
|
||||
wait 0.05;
|
||||
self notify("menuresponse", game["menu_team"], getDvar("bots_team"));
|
||||
|
||||
while(isdefined(self.pers["team"]))
|
||||
wait .05;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Updates the bot's difficulty variables.
|
||||
*/
|
||||
difficulty()
|
||||
{
|
||||
self endon("disconnect");
|
||||
|
||||
for(;;)
|
||||
{
|
||||
wait 1;
|
||||
|
||||
rankVar = GetDvarInt("bots_skill");
|
||||
|
||||
if(rankVar == 9)
|
||||
continue;
|
||||
|
||||
switch(self.pers["bots"]["skill"]["base"])
|
||||
{
|
||||
case 1:
|
||||
self.pers["bots"]["skill"]["aim_time"] = 0.6;
|
||||
self.pers["bots"]["skill"]["init_react_time"] = 1500;
|
||||
self.pers["bots"]["skill"]["reaction_time"] = 1000;
|
||||
self.pers["bots"]["skill"]["no_trace_ads_time"] = 500;
|
||||
self.pers["bots"]["skill"]["no_trace_look_time"] = 600;
|
||||
self.pers["bots"]["skill"]["remember_time"] = 750;
|
||||
self.pers["bots"]["skill"]["fov"] = 0.7;
|
||||
self.pers["bots"]["skill"]["dist"] = 1000;
|
||||
self.pers["bots"]["skill"]["spawn_time"] = 0.75;
|
||||
self.pers["bots"]["skill"]["help_dist"] = 0;
|
||||
self.pers["bots"]["skill"]["semi_time"] = 0.9;
|
||||
self.pers["bots"]["skill"]["shoot_after_time"] = 1;
|
||||
self.pers["bots"]["skill"]["aim_offset_time"] = 1.5;
|
||||
self.pers["bots"]["skill"]["aim_offset_amount"] = 4;
|
||||
self.pers["bots"]["skill"]["bone_update_interval"] = 2;
|
||||
self.pers["bots"]["skill"]["bones"] = "j_spineupper,j_ankle_le,j_ankle_ri";
|
||||
|
||||
self.pers["bots"]["behavior"]["strafe"] = 0;
|
||||
self.pers["bots"]["behavior"]["nade"] = 10;
|
||||
self.pers["bots"]["behavior"]["sprint"] = 10;
|
||||
self.pers["bots"]["behavior"]["camp"] = 5;
|
||||
self.pers["bots"]["behavior"]["follow"] = 5;
|
||||
self.pers["bots"]["behavior"]["crouch"] = 70;
|
||||
self.pers["bots"]["behavior"]["switch"] = 2;
|
||||
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;
|
||||
self.pers["bots"]["skill"]["reaction_time"] = 800;
|
||||
self.pers["bots"]["skill"]["no_trace_ads_time"] = 1000;
|
||||
self.pers["bots"]["skill"]["no_trace_look_time"] = 1250;
|
||||
self.pers["bots"]["skill"]["remember_time"] = 1500;
|
||||
self.pers["bots"]["skill"]["fov"] = 0.65;
|
||||
self.pers["bots"]["skill"]["dist"] = 1500;
|
||||
self.pers["bots"]["skill"]["spawn_time"] = 0.65;
|
||||
self.pers["bots"]["skill"]["help_dist"] = 500;
|
||||
self.pers["bots"]["skill"]["semi_time"] = 0.75;
|
||||
self.pers["bots"]["skill"]["shoot_after_time"] = 0.75;
|
||||
self.pers["bots"]["skill"]["aim_offset_time"] = 1;
|
||||
self.pers["bots"]["skill"]["aim_offset_amount"] = 3;
|
||||
self.pers["bots"]["skill"]["bone_update_interval"] = 1.5;
|
||||
self.pers["bots"]["skill"]["bones"] = "j_spineupper,j_ankle_le,j_ankle_ri,j_head";
|
||||
|
||||
self.pers["bots"]["behavior"]["strafe"] = 10;
|
||||
self.pers["bots"]["behavior"]["nade"] = 15;
|
||||
self.pers["bots"]["behavior"]["sprint"] = 15;
|
||||
self.pers["bots"]["behavior"]["camp"] = 5;
|
||||
self.pers["bots"]["behavior"]["follow"] = 5;
|
||||
self.pers["bots"]["behavior"]["crouch"] = 60;
|
||||
self.pers["bots"]["behavior"]["switch"] = 2;
|
||||
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;
|
||||
self.pers["bots"]["skill"]["reaction_time"] = 500;
|
||||
self.pers["bots"]["skill"]["no_trace_ads_time"] = 1000;
|
||||
self.pers["bots"]["skill"]["no_trace_look_time"] = 1500;
|
||||
self.pers["bots"]["skill"]["remember_time"] = 2000;
|
||||
self.pers["bots"]["skill"]["fov"] = 0.6;
|
||||
self.pers["bots"]["skill"]["dist"] = 2250;
|
||||
self.pers["bots"]["skill"]["spawn_time"] = 0.5;
|
||||
self.pers["bots"]["skill"]["help_dist"] = 750;
|
||||
self.pers["bots"]["skill"]["semi_time"] = 0.65;
|
||||
self.pers["bots"]["skill"]["shoot_after_time"] = 0.65;
|
||||
self.pers["bots"]["skill"]["aim_offset_time"] = 0.75;
|
||||
self.pers["bots"]["skill"]["aim_offset_amount"] = 2.5;
|
||||
self.pers["bots"]["skill"]["bone_update_interval"] = 1;
|
||||
self.pers["bots"]["skill"]["bones"] = "j_spineupper,j_spineupper,j_ankle_le,j_ankle_ri,j_head";
|
||||
|
||||
self.pers["bots"]["behavior"]["strafe"] = 20;
|
||||
self.pers["bots"]["behavior"]["nade"] = 20;
|
||||
self.pers["bots"]["behavior"]["sprint"] = 20;
|
||||
self.pers["bots"]["behavior"]["camp"] = 5;
|
||||
self.pers["bots"]["behavior"]["follow"] = 5;
|
||||
self.pers["bots"]["behavior"]["crouch"] = 50;
|
||||
self.pers["bots"]["behavior"]["switch"] = 2;
|
||||
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;
|
||||
self.pers["bots"]["skill"]["reaction_time"] = 400;
|
||||
self.pers["bots"]["skill"]["no_trace_ads_time"] = 1000;
|
||||
self.pers["bots"]["skill"]["no_trace_look_time"] = 1500;
|
||||
self.pers["bots"]["skill"]["remember_time"] = 3000;
|
||||
self.pers["bots"]["skill"]["fov"] = 0.55;
|
||||
self.pers["bots"]["skill"]["dist"] = 3350;
|
||||
self.pers["bots"]["skill"]["spawn_time"] = 0.35;
|
||||
self.pers["bots"]["skill"]["help_dist"] = 1000;
|
||||
self.pers["bots"]["skill"]["semi_time"] = 0.5;
|
||||
self.pers["bots"]["skill"]["shoot_after_time"] = 0.5;
|
||||
self.pers["bots"]["skill"]["aim_offset_time"] = 0.5;
|
||||
self.pers["bots"]["skill"]["aim_offset_amount"] = 2;
|
||||
self.pers["bots"]["skill"]["bone_update_interval"] = 0.75;
|
||||
self.pers["bots"]["skill"]["bones"] = "j_spineupper,j_spineupper,j_ankle_le,j_ankle_ri,j_head,j_head";
|
||||
|
||||
self.pers["bots"]["behavior"]["strafe"] = 30;
|
||||
self.pers["bots"]["behavior"]["nade"] = 25;
|
||||
self.pers["bots"]["behavior"]["sprint"] = 30;
|
||||
self.pers["bots"]["behavior"]["camp"] = 5;
|
||||
self.pers["bots"]["behavior"]["follow"] = 5;
|
||||
self.pers["bots"]["behavior"]["crouch"] = 40;
|
||||
self.pers["bots"]["behavior"]["switch"] = 2;
|
||||
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;
|
||||
self.pers["bots"]["skill"]["reaction_time"] = 300;
|
||||
self.pers["bots"]["skill"]["no_trace_ads_time"] = 1500;
|
||||
self.pers["bots"]["skill"]["no_trace_look_time"] = 2000;
|
||||
self.pers["bots"]["skill"]["remember_time"] = 4000;
|
||||
self.pers["bots"]["skill"]["fov"] = 0.5;
|
||||
self.pers["bots"]["skill"]["dist"] = 5000;
|
||||
self.pers["bots"]["skill"]["spawn_time"] = 0.25;
|
||||
self.pers["bots"]["skill"]["help_dist"] = 1500;
|
||||
self.pers["bots"]["skill"]["semi_time"] = 0.4;
|
||||
self.pers["bots"]["skill"]["shoot_after_time"] = 0.35;
|
||||
self.pers["bots"]["skill"]["aim_offset_time"] = 0.35;
|
||||
self.pers["bots"]["skill"]["aim_offset_amount"] = 1.5;
|
||||
self.pers["bots"]["skill"]["bone_update_interval"] = 0.5;
|
||||
self.pers["bots"]["skill"]["bones"] = "j_spineupper,j_head";
|
||||
|
||||
self.pers["bots"]["behavior"]["strafe"] = 40;
|
||||
self.pers["bots"]["behavior"]["nade"] = 35;
|
||||
self.pers["bots"]["behavior"]["sprint"] = 40;
|
||||
self.pers["bots"]["behavior"]["camp"] = 5;
|
||||
self.pers["bots"]["behavior"]["follow"] = 5;
|
||||
self.pers["bots"]["behavior"]["crouch"] = 30;
|
||||
self.pers["bots"]["behavior"]["switch"] = 2;
|
||||
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;
|
||||
self.pers["bots"]["skill"]["reaction_time"] = 150;
|
||||
self.pers["bots"]["skill"]["no_trace_ads_time"] = 2000;
|
||||
self.pers["bots"]["skill"]["no_trace_look_time"] = 3000;
|
||||
self.pers["bots"]["skill"]["remember_time"] = 5000;
|
||||
self.pers["bots"]["skill"]["fov"] = 0.45;
|
||||
self.pers["bots"]["skill"]["dist"] = 7500;
|
||||
self.pers["bots"]["skill"]["spawn_time"] = 0.2;
|
||||
self.pers["bots"]["skill"]["help_dist"] = 2000;
|
||||
self.pers["bots"]["skill"]["semi_time"] = 0.25;
|
||||
self.pers["bots"]["skill"]["shoot_after_time"] = 0.25;
|
||||
self.pers["bots"]["skill"]["aim_offset_time"] = 0.25;
|
||||
self.pers["bots"]["skill"]["aim_offset_amount"] = 1;
|
||||
self.pers["bots"]["skill"]["bone_update_interval"] = 0.25;
|
||||
self.pers["bots"]["skill"]["bones"] = "j_spineupper,j_head,j_head";
|
||||
|
||||
self.pers["bots"]["behavior"]["strafe"] = 50;
|
||||
self.pers["bots"]["behavior"]["nade"] = 45;
|
||||
self.pers["bots"]["behavior"]["sprint"] = 50;
|
||||
self.pers["bots"]["behavior"]["camp"] = 5;
|
||||
self.pers["bots"]["behavior"]["follow"] = 5;
|
||||
self.pers["bots"]["behavior"]["crouch"] = 20;
|
||||
self.pers["bots"]["behavior"]["switch"] = 2;
|
||||
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;
|
||||
self.pers["bots"]["skill"]["reaction_time"] = 50;
|
||||
self.pers["bots"]["skill"]["no_trace_ads_time"] = 2500;
|
||||
self.pers["bots"]["skill"]["no_trace_look_time"] = 4000;
|
||||
self.pers["bots"]["skill"]["remember_time"] = 7500;
|
||||
self.pers["bots"]["skill"]["fov"] = 0.4;
|
||||
self.pers["bots"]["skill"]["dist"] = 10000;
|
||||
self.pers["bots"]["skill"]["spawn_time"] = 0.05;
|
||||
self.pers["bots"]["skill"]["help_dist"] = 3000;
|
||||
self.pers["bots"]["skill"]["semi_time"] = 0.1;
|
||||
self.pers["bots"]["skill"]["shoot_after_time"] = 0;
|
||||
self.pers["bots"]["skill"]["aim_offset_time"] = 0;
|
||||
self.pers["bots"]["skill"]["aim_offset_amount"] = 0;
|
||||
self.pers["bots"]["skill"]["bone_update_interval"] = 0.05;
|
||||
self.pers["bots"]["skill"]["bones"] = "j_head";
|
||||
|
||||
self.pers["bots"]["behavior"]["strafe"] = 65;
|
||||
self.pers["bots"]["behavior"]["nade"] = 65;
|
||||
self.pers["bots"]["behavior"]["sprint"] = 65;
|
||||
self.pers["bots"]["behavior"]["camp"] = 5;
|
||||
self.pers["bots"]["behavior"]["follow"] = 5;
|
||||
self.pers["bots"]["behavior"]["crouch"] = 5;
|
||||
self.pers["bots"]["behavior"]["switch"] = 2;
|
||||
self.pers["bots"]["behavior"]["class"] = 2;
|
||||
self.pers["bots"]["behavior"]["jump"] = 90;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Sets the bot difficulty.
|
||||
*/
|
||||
set_diff()
|
||||
{
|
||||
rankVar = GetDvarInt("bots_skill");
|
||||
|
||||
switch(rankVar)
|
||||
{
|
||||
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);
|
||||
self.pers["bots"]["skill"]["init_react_time"] = 50 * randomInt(100);
|
||||
self.pers["bots"]["skill"]["reaction_time"] = 50 * randomInt(100);
|
||||
self.pers["bots"]["skill"]["no_trace_ads_time"] = 50 * randomInt(100);
|
||||
self.pers["bots"]["skill"]["no_trace_look_time"] = 50 * randomInt(100);
|
||||
self.pers["bots"]["skill"]["remember_time"] = 50 * randomInt(100);
|
||||
self.pers["bots"]["skill"]["fov"] = randomFloatRange(-1, 1);
|
||||
self.pers["bots"]["skill"]["dist"] = randomIntRange(500, 25000);
|
||||
self.pers["bots"]["skill"]["spawn_time"] = 0.05 * randomInt(20);
|
||||
self.pers["bots"]["skill"]["help_dist"] = randomIntRange(500, 25000);
|
||||
self.pers["bots"]["skill"]["semi_time"] = randomFloatRange(0.05, 1);
|
||||
self.pers["bots"]["skill"]["shoot_after_time"] = randomFloatRange(0.05, 1);
|
||||
self.pers["bots"]["skill"]["aim_offset_time"] = randomFloatRange(0.05, 1);
|
||||
self.pers["bots"]["skill"]["aim_offset_amount"] = randomFloatRange(0.05, 1);
|
||||
self.pers["bots"]["skill"]["bone_update_interval"] = randomFloatRange(0.05, 1);
|
||||
self.pers["bots"]["skill"]["bones"] = "j_head,j_spineupper,j_ankle_ri,j_ankle_le";
|
||||
|
||||
self.pers["bots"]["behavior"]["strafe"] = randomInt(100);
|
||||
self.pers["bots"]["behavior"]["nade"] = randomInt(100);
|
||||
self.pers["bots"]["behavior"]["sprint"] = randomInt(100);
|
||||
self.pers["bots"]["behavior"]["camp"] = randomInt(100);
|
||||
self.pers["bots"]["behavior"]["follow"] = randomInt(100);
|
||||
self.pers["bots"]["behavior"]["crouch"] = randomInt(100);
|
||||
self.pers["bots"]["behavior"]["switch"] = randomInt(100);
|
||||
self.pers["bots"]["behavior"]["class"] = randomInt(100);
|
||||
self.pers["bots"]["behavior"]["jump"] = randomInt(100);
|
||||
break;
|
||||
default:
|
||||
self.pers["bots"]["skill"]["base"] = rankVar;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Sets the bot's classes.
|
||||
*/
|
||||
set_class(rankxp)
|
||||
{
|
||||
primaryGroups = [];
|
||||
primaryGroups[0] = "weapon_lmg";
|
||||
primaryGroups[1] = "weapon_smg";
|
||||
primaryGroups[2] = "weapon_shotgun";
|
||||
primaryGroups[3] = "weapon_sniper";
|
||||
primaryGroups[4] = "weapon_assault";
|
||||
secondaryGroups = [];
|
||||
secondaryGroups[0] = "weapon_pistol";
|
||||
|
||||
rank = self maps\mp\gametypes\_rank::getRankForXp( rankxp ) + 1;
|
||||
|
||||
for(i=0; i < 5; i++)
|
||||
{
|
||||
primary = get_random_weapon(primaryGroups, rank);
|
||||
att1 = get_random_attachment(primary, rank);
|
||||
|
||||
perk2 = get_random_perk("perk2", rank);
|
||||
if(perk2 != "specialty_twoprimaries")
|
||||
secondary = get_random_weapon(secondaryGroups, rank);
|
||||
else
|
||||
secondary = get_random_weapon(primaryGroups, rank);
|
||||
att2 = get_random_attachment(secondary, rank);
|
||||
perk1 = get_random_perk("perk1", rank, att1, att2);
|
||||
|
||||
perk3 = get_random_perk("perk3", rank);
|
||||
gren = get_random_grenade(perk1);
|
||||
camo = randomInt(8);
|
||||
|
||||
self setStat ( 200+(i*10)+1, level.weaponReferenceToIndex[primary] );
|
||||
self setStat ( 200+(i*10)+2, level.weaponAttachmentReferenceToIndex[att1] );
|
||||
self setStat ( 200+(i*10)+3, level.weaponReferenceToIndex[secondary] );
|
||||
self setStat ( 200+(i*10)+4, level.weaponAttachmentReferenceToIndex[att2] );
|
||||
self setStat ( 200+(i*10)+5, level.perkReferenceToIndex[perk1] );
|
||||
self setStat ( 200+(i*10)+6, level.perkReferenceToIndex[perk2] );
|
||||
self setStat ( 200+(i*10)+7, level.perkReferenceToIndex[perk3] );
|
||||
self setStat ( 200+(i*10)+8, level.weaponReferenceToIndex[gren] );
|
||||
self setStat ( 200+(i*10)+9, camo);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Returns a random attachment for the bot.
|
||||
*/
|
||||
get_random_attachment(weapon, rank)
|
||||
{
|
||||
if (RandomFloatRange( 0, 1 ) > (0.1 + ( rank / level.maxRank )))
|
||||
return "none";
|
||||
|
||||
reasonable = GetDvarInt("bots_loadout_reasonable");
|
||||
|
||||
id = level.tbl_weaponIDs[level.weaponReferenceToIndex[weapon]];
|
||||
atts = strtok(id["attachment"], " ");
|
||||
atts[atts.size] = "none";
|
||||
|
||||
|
||||
for(;;)
|
||||
{
|
||||
att = atts[randomInt(atts.size)];
|
||||
|
||||
if(reasonable)
|
||||
{
|
||||
switch(att)
|
||||
{
|
||||
case "acog":
|
||||
if(weapon != "m40a3")
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return att;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Returns a random perk for the bot.
|
||||
*/
|
||||
get_random_perk(perkslot, rank, att1, att2)
|
||||
{
|
||||
if(isDefined(att1) && isDefined(att2) && (att1 == "grip" || att1 == "gl" || att2 == "grip" || att2 == "gl"))
|
||||
return "specialty_null";
|
||||
|
||||
reasonable = GetDvarInt("bots_loadout_reasonable");
|
||||
op = GetDvarInt("bots_loadout_allow_op");
|
||||
|
||||
keys = getArrayKeys(level.tbl_PerkData);
|
||||
for(;;)
|
||||
{
|
||||
id = level.tbl_PerkData[keys[randomInt(keys.size)]];
|
||||
|
||||
if(!isDefined(id) || !isDefined(id["perk_num"]))
|
||||
continue;
|
||||
|
||||
if(perkslot != id["perk_num"])
|
||||
continue;
|
||||
|
||||
ref = id["reference_full"];
|
||||
|
||||
if(ref == "specialty_null" && randomInt(100) < 95)
|
||||
continue;
|
||||
|
||||
if(reasonable)
|
||||
{
|
||||
switch(ref)
|
||||
{
|
||||
case "specialty_parabolic":
|
||||
case "specialty_holdbreath":
|
||||
case "specialty_weapon_c4":
|
||||
case "specialty_explosivedamage":
|
||||
case "specialty_twoprimaries":
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(!op)
|
||||
{
|
||||
switch(ref)
|
||||
{
|
||||
case "specialty_armorvest":
|
||||
case "specialty_pistoldeath":
|
||||
case "specialty_grenadepulldeath":
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(!isItemUnlocked(ref, rank))
|
||||
continue;
|
||||
|
||||
return ref;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Returns a random grenade for the bot.
|
||||
*/
|
||||
get_random_grenade(perk1)
|
||||
{
|
||||
possibles = [];
|
||||
possibles[0] = "flash_grenade";
|
||||
possibles[1] = "smoke_grenade";
|
||||
possibles[2] = "concussion_grenade";
|
||||
|
||||
reasonable = GetDvarInt("bots_loadout_reasonable");
|
||||
|
||||
for(;;)
|
||||
{
|
||||
possible = possibles[randomInt(possibles.size)];
|
||||
|
||||
if(reasonable)
|
||||
{
|
||||
switch(possible)
|
||||
{
|
||||
case "smoke_grenade":
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(perk1 == "specialty_specialgrenade" && possible == "smoke_grenade")
|
||||
continue;
|
||||
|
||||
return possible;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Returns a random weapon for the bot.
|
||||
*/
|
||||
get_random_weapon(groups, rank)
|
||||
{
|
||||
reasonable = GetDvarInt("bots_loadout_reasonable");
|
||||
|
||||
keys = getArrayKeys(level.tbl_weaponIDs);
|
||||
for(;;)
|
||||
{
|
||||
id = level.tbl_weaponIDs[keys[randomInt(keys.size)]];
|
||||
|
||||
if(!isDefined(id))
|
||||
continue;
|
||||
|
||||
group = id["group"];
|
||||
inGroup = false;
|
||||
for(i = groups.size - 1; i >= 0; i--)
|
||||
{
|
||||
if(groups[i] == group)
|
||||
inGroup = true;
|
||||
}
|
||||
|
||||
if(!inGroup)
|
||||
continue;
|
||||
|
||||
ref = id["reference"];
|
||||
|
||||
if(reasonable)
|
||||
{
|
||||
switch(ref)
|
||||
{
|
||||
case "skorpion":
|
||||
case "uzi":
|
||||
case "m21":
|
||||
case "dragunov":
|
||||
case "saw":
|
||||
case "mp44":
|
||||
case "m14":
|
||||
case "g3":
|
||||
case "m1014":
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(!isItemUnlocked(ref, rank))
|
||||
continue;
|
||||
|
||||
return ref;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Gets an exp amount for the bot that is nearish the host's xp.
|
||||
*/
|
||||
bot_get_rank()
|
||||
{
|
||||
ranks = [];
|
||||
bot_ranks = [];
|
||||
human_ranks = [];
|
||||
|
||||
for ( i = level.players.size - 1; i >= 0; i-- )
|
||||
{
|
||||
player = level.players[i];
|
||||
|
||||
if ( player == self )
|
||||
continue;
|
||||
|
||||
if ( !IsDefined( player.pers[ "rank" ] ) )
|
||||
continue;
|
||||
|
||||
if ( player is_bot() )
|
||||
{
|
||||
bot_ranks[ bot_ranks.size ] = player.pers[ "rank" ];
|
||||
}
|
||||
else
|
||||
{
|
||||
human_ranks[ human_ranks.size ] = player.pers[ "rank" ];
|
||||
}
|
||||
}
|
||||
|
||||
if( !human_ranks.size )
|
||||
human_ranks[ human_ranks.size ] = Round( random_normal_distribution( 35, 15, 0, level.maxRank ) );
|
||||
|
||||
human_avg = array_average( human_ranks );
|
||||
|
||||
while ( bot_ranks.size + human_ranks.size < 5 )
|
||||
{
|
||||
// add some random ranks for better random number distribution
|
||||
rank = human_avg + RandomIntRange( -10, 10 );
|
||||
human_ranks[ human_ranks.size ] = rank;
|
||||
}
|
||||
|
||||
ranks = array_combine( human_ranks, bot_ranks );
|
||||
|
||||
avg = array_average( ranks );
|
||||
s = array_std_deviation( ranks, avg );
|
||||
|
||||
rank = Round( random_normal_distribution( avg, s, 0, level.maxRank ) );
|
||||
|
||||
return maps\mp\gametypes\_rank::getRankInfoMinXP( rank );
|
||||
}
|
||||
|
||||
/*
|
||||
When the bot spawns.
|
||||
*/
|
||||
onSpawned()
|
||||
{
|
||||
self endon("disconnect");
|
||||
|
||||
for(;;)
|
||||
{
|
||||
self waittill("spawned_player");
|
||||
|
||||
if(randomInt(100) <= self.pers["bots"]["behavior"]["class"])
|
||||
self.bot_change_class = undefined;
|
||||
|
||||
self.bot_lock_goal = false;
|
||||
self.help_time = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
When the bot spawned, after the difficulty wait. Start the logic for the bot.
|
||||
*/
|
||||
onBotSpawned()
|
||||
{
|
||||
self endon("disconnect");
|
||||
level endon("game_ended");
|
||||
|
||||
for(;;)
|
||||
{
|
||||
self waittill("bot_spawned");
|
||||
|
||||
self thread start_bot_threads();
|
||||
}
|
||||
}
|
||||
|
||||
start_bot_threads()
|
||||
{
|
||||
self endon("disconnect");
|
||||
level endon("game_ended");
|
||||
self endon("death");
|
||||
|
||||
while(level.inPrematchPeriod)
|
||||
wait 0.05;
|
||||
}
|
515
main_shared/maps/mp/bots/_menu.gsc
Normal file
515
main_shared/maps/mp/bots/_menu.gsc
Normal file
@ -0,0 +1,515 @@
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes\_hud_util;
|
||||
#include maps\mp\bots\_bot_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
if (getDvar("bots_main_fun") == "")
|
||||
setDvar("bots_main_fun", false);
|
||||
|
||||
if (getDvar("bots_main_menu") == "")
|
||||
setDvar("bots_main_menu", true);
|
||||
|
||||
thread watchPlayers();
|
||||
}
|
||||
|
||||
watchPlayers()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
wait 1;
|
||||
|
||||
for (i = level.players.size - 1; i >= 0; i--)
|
||||
{
|
||||
player = level.players[i];
|
||||
|
||||
if (!getDvarInt("bots_main_menu"))
|
||||
continue;
|
||||
|
||||
if (!player is_host())
|
||||
continue;
|
||||
|
||||
if (isDefined(player.menuInit) && player.menuInit)
|
||||
continue;
|
||||
|
||||
player thread init_menu();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
init_menu()
|
||||
{
|
||||
self.menuInit = true;
|
||||
|
||||
self.menuOpen = false;
|
||||
self.menu_player = undefined;
|
||||
self.SubMenu = "Main";
|
||||
self.Curs["Main"]["X"] = 0;
|
||||
self AddOptions();
|
||||
|
||||
self thread watchPlayerOpenMenu();
|
||||
self thread MenuSelect();
|
||||
self thread RightMenu();
|
||||
self thread LeftMenu();
|
||||
|
||||
self thread watchDisconnect();
|
||||
|
||||
self thread doGreetings();
|
||||
}
|
||||
|
||||
kill_menu()
|
||||
{
|
||||
self notify("bots_kill_menu");
|
||||
self.menuInit = undefined;
|
||||
}
|
||||
|
||||
watchDisconnect()
|
||||
{
|
||||
self waittill_either("disconnect", "bots_kill_menu");
|
||||
|
||||
if(self.menuOpen)
|
||||
{
|
||||
if(isDefined(self.MenuTextY))
|
||||
for(i = 0; i < self.MenuTextY.size; i++)
|
||||
if(isDefined(self.MenuTextY[i]))
|
||||
self.MenuTextY[i] destroy();
|
||||
|
||||
if(isDefined(self.MenuText))
|
||||
for(i = 0; i < self.MenuText.size; i++)
|
||||
if(isDefined(self.MenuText[i]))
|
||||
self.MenuText[i] destroy();
|
||||
|
||||
if(isDefined(self.Menu) && isDefined(self.Menu["X"]))
|
||||
{
|
||||
if(isDefined(self.Menu["X"]["Shader"]))
|
||||
self.Menu["X"]["Shader"] destroy();
|
||||
|
||||
if(isDefined(self.Menu["X"]["Scroller"]))
|
||||
self.Menu["X"]["Scroller"] destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
doGreetings()
|
||||
{
|
||||
self endon ( "disconnect" );
|
||||
self endon ( "bots_kill_menu" );
|
||||
wait 1;
|
||||
self iPrintln("Welcome to Bot Warfare "+self.name+"!");
|
||||
wait 5;
|
||||
if(getDvarInt("bots_main_menu"))
|
||||
self iPrintln("Press [{+frag}] + [{+smoke}] to open menu!");
|
||||
}
|
||||
|
||||
watchPlayerOpenMenu()
|
||||
{
|
||||
self endon ( "disconnect" );
|
||||
self endon ( "bots_kill_menu" );
|
||||
|
||||
for(;;)
|
||||
{
|
||||
while(!self FragButtonPressed() || !self SecondaryOffhandButtonPressed())
|
||||
wait 0.05;
|
||||
|
||||
if(!self.menuOpen)
|
||||
{
|
||||
if(getdvarint("bots_main_menu"))
|
||||
{
|
||||
self playLocalSound( "mouse_click" );
|
||||
self thread OpenSub(self.SubMenu);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self playLocalSound( "mouse_click" );
|
||||
if(self.SubMenu != "Main")
|
||||
self ExitSub();
|
||||
else
|
||||
{
|
||||
self ExitMenu();
|
||||
if((level.inPrematchPeriod || level.gameEnded) && !getDvarInt("bots_main_fun"))
|
||||
self freezeControls(true);
|
||||
else
|
||||
self freezecontrols(false);
|
||||
}
|
||||
}
|
||||
|
||||
while(self FragButtonPressed() && self SecondaryOffhandButtonPressed())
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
MenuSelect()
|
||||
{
|
||||
self endon ( "disconnect" );
|
||||
self endon ( "bots_kill_menu" );
|
||||
|
||||
for(;;)
|
||||
{
|
||||
while(!self MeleeButtonPressed())
|
||||
wait 0.05;
|
||||
|
||||
if(self.MenuOpen && getdvarint("bots_main_menu"))
|
||||
{
|
||||
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
|
||||
self thread [[self.Option["Function"][self.SubMenu][self.Curs[self.SubMenu]["Y"]]]](self.Option["Arg1"][self.SubMenu][self.Curs[self.SubMenu]["Y"]],self.Option["Arg2"][self.SubMenu][self.Curs[self.SubMenu]["Y"]]);
|
||||
}
|
||||
|
||||
while(self MeleeButtonPressed())
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
LeftMenu()
|
||||
{
|
||||
self endon ( "disconnect" );
|
||||
self endon ( "bots_kill_menu" );
|
||||
|
||||
for(;;)
|
||||
{
|
||||
while(!self AttackButtonPressed())
|
||||
wait 0.05;
|
||||
|
||||
if(self.MenuOpen)
|
||||
{
|
||||
self playLocalSound("mouse_over");
|
||||
|
||||
if(self.SubMenu == "Main")
|
||||
{
|
||||
self.Curs["Main"]["X"]--;
|
||||
|
||||
if(self.Curs["Main"]["X"] < 0)
|
||||
self.Curs["Main"]["X"] = self.Option["Name"][self.SubMenu].size -1;
|
||||
|
||||
self CursMove("X");
|
||||
}
|
||||
else
|
||||
{
|
||||
self.Curs[self.SubMenu]["Y"]--;
|
||||
|
||||
if(self.Curs[self.SubMenu]["Y"] < 0)
|
||||
self.Curs[self.SubMenu]["Y"] = self.Option["Name"][self.SubMenu].size -1;
|
||||
|
||||
self CursMove("Y");
|
||||
}
|
||||
}
|
||||
|
||||
while(self AttackButtonPressed())
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
RightMenu()
|
||||
{
|
||||
self endon ( "disconnect" );
|
||||
self endon ( "bots_kill_menu" );
|
||||
|
||||
for(;;)
|
||||
{
|
||||
while(!self AdsButtonPressed())
|
||||
wait 0.05;
|
||||
|
||||
if(self.MenuOpen)
|
||||
{
|
||||
self playLocalSound("mouse_over");
|
||||
|
||||
if(self.SubMenu == "Main")
|
||||
{
|
||||
self.Curs["Main"]["X"]++;
|
||||
|
||||
if(self.Curs["Main"]["X"] > self.Option["Name"][self.SubMenu].size -1)
|
||||
self.Curs["Main"]["X"] = 0;
|
||||
|
||||
self CursMove("X");
|
||||
}
|
||||
else
|
||||
{
|
||||
self.Curs[self.SubMenu]["Y"]++;
|
||||
|
||||
if(self.Curs[self.SubMenu]["Y"] > self.Option["Name"][self.SubMenu].size -1)
|
||||
self.Curs[self.SubMenu]["Y"] = 0;
|
||||
|
||||
self CursMove("Y");
|
||||
}
|
||||
}
|
||||
|
||||
while(self AdsButtonPressed())
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
OpenSub(menu, menu2)
|
||||
{
|
||||
if(menu != "Main" && (!isDefined(self.Menu[menu]) || !!isDefined(self.Menu[menu]["FirstOpen"])))
|
||||
{
|
||||
self.Curs[menu]["Y"] = 0;
|
||||
self.Menu[menu]["FirstOpen"] = true;
|
||||
}
|
||||
|
||||
logoldi = true;
|
||||
self.SubMenu = menu;
|
||||
|
||||
if(self.SubMenu == "Main")
|
||||
{
|
||||
if(isDefined(self.MenuText))
|
||||
for(i = 0; i < self.MenuText.size; i++)
|
||||
if(isDefined(self.MenuText[i]))
|
||||
self.MenuText[i] destroy();
|
||||
|
||||
if(isDefined(self.Menu) && isDefined(self.Menu["X"]))
|
||||
{
|
||||
if(isDefined(self.Menu["X"]["Shader"]))
|
||||
self.Menu["X"]["Shader"] destroy();
|
||||
|
||||
if(isDefined(self.Menu["X"]["Scroller"]))
|
||||
self.Menu["X"]["Scroller"] destroy();
|
||||
}
|
||||
|
||||
for(i=0 ; i < self.Option["Name"][self.SubMenu].size ; i++)
|
||||
{
|
||||
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;
|
||||
|
||||
if(self.MenuText[i].x > 300)
|
||||
{
|
||||
logOldi = false;
|
||||
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;
|
||||
}
|
||||
|
||||
if(!logOldi)
|
||||
self.Menu["X"]["Shader"] = self createRectangle("CENTER","CENTER",0,-225,1000,90, (0,0,0), -2, 1,"white");
|
||||
else
|
||||
self.Menu["X"]["Shader"] = self createRectangle("CENTER","CENTER",0,-225,1000,30, (0,0,0), -2, 1,"white");
|
||||
|
||||
self.Menu["X"]["Scroller"] = self createRectangle("CENTER","CENTER", self.MenuText[self.Curs["Main"]["X"]].x,-225,105,22, (1,0,0), -1, 1,"white");
|
||||
|
||||
self CursMove("X");
|
||||
self.MenuOpen = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(isDefined(self.MenuTextY))
|
||||
for(i=0 ; i < self.MenuTextY.size ; i++)
|
||||
if(isDefined(self.MenuTextY[i]))
|
||||
self.MenuTextY[i] destroy();
|
||||
|
||||
for(i=0 ; i < self.Option["Name"][self.SubMenu].size ; i++)
|
||||
{
|
||||
self.MenuTextY[i] = self createfontstring("default", 1.6);
|
||||
self.MenuTextY[i] setpoint("CENTER", "CENTER", self.MenuText[self.Curs["Main"]["X"]].x, -160+(i*20));
|
||||
self.MenuTextY[i] settext(self.Option["Name"][self.SubMenu][i]);
|
||||
self.MenuTextY[i].alpha = 1;
|
||||
self.MenuTextY[i].sort = 999;
|
||||
}
|
||||
|
||||
self CursMove("Y");
|
||||
}
|
||||
}
|
||||
|
||||
CursMove(direction)
|
||||
{
|
||||
self notify("scrolled");
|
||||
if(self.SubMenu == "Main")
|
||||
{
|
||||
self.Menu["X"]["Scroller"].x = self.MenuText[self.Curs["Main"]["X"]].x;
|
||||
self.Menu["X"]["Scroller"].y = self.MenuText[self.Curs["Main"]["X"]].y;
|
||||
|
||||
if(isDefined(self.MenuText))
|
||||
{
|
||||
for(i = 0; i < self.MenuText.size; i++)
|
||||
{
|
||||
if(isDefined(self.MenuText[i]))
|
||||
{
|
||||
self.MenuText[i].fontscale = 1.5;
|
||||
self.MenuText[i].color = (1,1,1);
|
||||
self.MenuText[i].glowAlpha = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self thread ShowOptionOn(direction);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(isDefined(self.MenuTextY))
|
||||
{
|
||||
for(i = 0; i < self.MenuTextY.size; i++)
|
||||
{
|
||||
if(isDefined(self.MenuTextY[i]))
|
||||
{
|
||||
self.MenuTextY[i].fontscale = 1.5;
|
||||
self.MenuTextY[i].color = (1,1,1);
|
||||
self.MenuTextY[i].glowAlpha = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(isDefined(self.MenuText))
|
||||
{
|
||||
for(i = 0; i < self.MenuText.size; i++)
|
||||
{
|
||||
if(isDefined(self.MenuText[i]))
|
||||
{
|
||||
self.MenuText[i].fontscale = 1.5;
|
||||
self.MenuText[i].color = (1,1,1);
|
||||
self.MenuText[i].glowAlpha = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self thread ShowOptionOn(direction);
|
||||
}
|
||||
}
|
||||
|
||||
ShowOptionOn(variable)
|
||||
{
|
||||
self endon("scrolled");
|
||||
self endon("disconnect");
|
||||
self endon("exit");
|
||||
self endon("bots_kill_menu");
|
||||
|
||||
for(;;)
|
||||
{
|
||||
if(!getDvarInt("bots_main_fun") && !self isOnGround() && !level.inPrematchPeriod && !level.gameEnded)
|
||||
self freezecontrols(false);
|
||||
else
|
||||
self freezecontrols(true);
|
||||
|
||||
self setClientDvar( "r_blur", "5" );
|
||||
self setClientDvar( "sc_blur", "4" );
|
||||
self addOptions();
|
||||
|
||||
if(self.SubMenu == "Main")
|
||||
{
|
||||
if(isDefined(self.Curs[self.SubMenu][variable]) && isDefined(self.MenuText) && isDefined(self.MenuText[self.Curs[self.SubMenu][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);
|
||||
}
|
||||
|
||||
if(isDefined(self.MenuText))
|
||||
{
|
||||
for(i = 0; i < self.Option["Name"][self.SubMenu].size; i++)
|
||||
{
|
||||
if(isDefined(self.MenuText[i]))
|
||||
self.MenuText[i] settext(self.Option["Name"][self.SubMenu][i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(isDefined(self.Curs[self.SubMenu][variable]) && isDefined(self.MenuTextY) && isDefined(self.MenuTextY[self.Curs[self.SubMenu][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);
|
||||
}
|
||||
|
||||
if(isDefined(self.MenuTextY))
|
||||
{
|
||||
for(i = 0; i < self.Option["Name"][self.SubMenu].size; i++)
|
||||
{
|
||||
if(isDefined(self.MenuTextY[i]))
|
||||
self.MenuTextY[i] settext(self.Option["Name"][self.SubMenu][i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
AddMenu(menu, num, text, function, arg1, arg2)
|
||||
{
|
||||
self.Option["Name"][menu][num] = text;
|
||||
self.Option["Function"][menu][num] = function;
|
||||
self.Option["Arg1"][menu][num] = arg1;
|
||||
self.Option["Arg2"][menu][num] = arg2;
|
||||
}
|
||||
|
||||
AddBack(menu, back)
|
||||
{
|
||||
self.Menu["Back"][menu] = back;
|
||||
}
|
||||
|
||||
ExitSub()
|
||||
{
|
||||
if(isDefined(self.MenuTextY))
|
||||
for(i = 0; i < self.MenuTextY.size; i++)
|
||||
if(isDefined(self.MenuTextY[i]))
|
||||
self.MenuTextY[i] destroy();
|
||||
|
||||
self.SubMenu = self.Menu["Back"][self.Submenu];
|
||||
|
||||
if(self.SubMenu == "Main")
|
||||
self CursMove("X");
|
||||
else
|
||||
self CursMove("Y");
|
||||
}
|
||||
|
||||
ExitMenu()
|
||||
{
|
||||
if(isDefined(self.MenuText))
|
||||
for(i = 0; i < self.MenuText.size; i++)
|
||||
if(isDefined(self.MenuText[i]))
|
||||
self.MenuText[i] destroy();
|
||||
|
||||
if(isDefined(self.Menu) && isDefined(self.Menu["X"]))
|
||||
{
|
||||
if(isDefined(self.Menu["X"]["Shader"]))
|
||||
self.Menu["X"]["Shader"] destroy();
|
||||
|
||||
if(isDefined(self.Menu["X"]["Scroller"]))
|
||||
self.Menu["X"]["Scroller"] destroy();
|
||||
}
|
||||
|
||||
self.MenuOpen = false;
|
||||
self notify("exit");
|
||||
|
||||
self setClientDvar( "r_blur", "0" );
|
||||
self setClientDvar( "sc_blur", "2" );
|
||||
}
|
||||
|
||||
createRectangle(align,relative,x,y,width,height,color,sort,alpha,shader)
|
||||
{
|
||||
barElemBG = newClientHudElem( self );
|
||||
barElemBG.elemType = "bar_";
|
||||
barElemBG.width = width;
|
||||
barElemBG.height = height;
|
||||
barElemBG.align = align;
|
||||
barElemBG.relative = relative;
|
||||
barElemBG.xOffset = 0;
|
||||
barElemBG.yOffset = 0;
|
||||
barElemBG.children = [];
|
||||
barElemBG.sort = sort;
|
||||
barElemBG.color = color;
|
||||
barElemBG.alpha = alpha;
|
||||
barElemBG setParent( level.uiParent );
|
||||
barElemBG setShader( shader, width , height );
|
||||
barElemBG.hidden = false;
|
||||
barElemBG setPoint(align, relative, x, y);
|
||||
return barElemBG;
|
||||
}
|
||||
|
||||
AddOptions()
|
||||
{
|
||||
self AddMenu("Main", 0, "test", ::OpenSub, "test", "");
|
||||
self AddBack("test", "Main");
|
||||
|
||||
self AddMenu("test", 0, "test", ::test, "test", "test");
|
||||
}
|
||||
|
||||
test(a, b)
|
||||
{
|
||||
self iprintln(a + b);
|
||||
}
|
755
main_shared/maps/mp/bots/_wp_editor.gsc
Normal file
755
main_shared/maps/mp/bots/_wp_editor.gsc
Normal file
@ -0,0 +1,755 @@
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes\_hud_util;
|
||||
|
||||
init()
|
||||
{
|
||||
if(getDvar("bots_main_debug") == "")
|
||||
setDvar("bots_main_debug", 0);
|
||||
|
||||
if(!getDVarint("bots_main_debug"))
|
||||
return;
|
||||
|
||||
if(!getDVarint("developer"))
|
||||
{
|
||||
setdvar("developer_script", 1);
|
||||
setdvar("developer", 1);
|
||||
|
||||
setdvar("sv_mapRotation", "map "+getDvar("mapname"));
|
||||
exitLevel(false);
|
||||
}
|
||||
|
||||
setDvar("bots_main", 0);
|
||||
setdvar("bots_main_menu", 0);
|
||||
setdvar("bots_manage_fill_mode", 0);
|
||||
setdvar("bots_manage_fill", 0);
|
||||
setdvar("bots_manage_add", 0);
|
||||
setdvar("bots_manage_fill_kick", 1);
|
||||
setDvar("bots_manage_fill_spec", 1);
|
||||
|
||||
if (getDvar("bots_main_debug_distance") == "")
|
||||
setDvar("bots_main_debug_distance", 512.0);
|
||||
|
||||
if (getDvar("bots_main_debug_cone") == "")
|
||||
setDvar("bots_main_debug_cone", 0.65);
|
||||
|
||||
if (getDvar("bots_main_debug_minDist") == "")
|
||||
setDvar("bots_main_debug_minDist", 32.0);
|
||||
|
||||
if (getDvar("bots_main_debug_drawThrough") == "")
|
||||
setDvar("bots_main_debug_drawThrough", false);
|
||||
|
||||
if(getDvar("bots_main_debug_commandWait") == "")
|
||||
setDvar("bots_main_debug_commandWait", 0.5);
|
||||
|
||||
setDvar("player_sustainAmmo", 1);
|
||||
|
||||
level.waypoints = [];
|
||||
level.waypointCount = 0;
|
||||
|
||||
level waittill( "connected", player);
|
||||
|
||||
player thread onPlayerSpawned();
|
||||
}
|
||||
|
||||
onPlayerSpawned()
|
||||
{
|
||||
self endon("disconnect");
|
||||
for(;;)
|
||||
{
|
||||
self waittill("spawned_player");
|
||||
self thread beginDebug();
|
||||
}
|
||||
}
|
||||
|
||||
beginDebug()
|
||||
{
|
||||
self endon("disconnect");
|
||||
self endon("death");
|
||||
|
||||
level.wpToLink = -1;
|
||||
level.autoLink = false;
|
||||
self.closest = -1;
|
||||
self.command = undefined;
|
||||
|
||||
self clearPerks();
|
||||
self takeAllWeapons();
|
||||
self.specialty = [];
|
||||
self giveWeapon("m16_gl_mp");
|
||||
self SetActionSlot( 3, "altMode" );
|
||||
self giveWeapon("frag_grenade_mp");
|
||||
self freezecontrols(false);
|
||||
|
||||
self thread debug();
|
||||
self thread addWaypoints();
|
||||
self thread linkWaypoints();
|
||||
self thread deleteWaypoints();
|
||||
self thread watchSaveWaypointsCommand();
|
||||
self thread sayExtras();
|
||||
|
||||
self thread textScroll("^1SecondaryOffhand - ^2Add Waypoint; ^3MeleeButton - ^4Link Waypoint; ^5FragButton - ^6Delete Waypoint; ^7UseButton + AttackButton - ^8Save");
|
||||
}
|
||||
|
||||
sayExtras()
|
||||
{
|
||||
self endon("disconnect");
|
||||
self endon("death");
|
||||
self iprintln("Making a crouch waypoint with only one link...");
|
||||
self iprintln("Makes a camping waypoint.");
|
||||
}
|
||||
|
||||
debug()
|
||||
{
|
||||
self endon("disconnect");
|
||||
self endon("death");
|
||||
|
||||
for(;;)
|
||||
{
|
||||
wait 0.05;
|
||||
|
||||
if(isDefined(self.command))
|
||||
continue;
|
||||
|
||||
closest = -1;
|
||||
myEye = self getTagOrigin( "j_head" );
|
||||
myAngles = self GetPlayerAngles();
|
||||
|
||||
for(i = 0; i < level.waypointCount; i++)
|
||||
{
|
||||
if(closest == -1 || closer(self.origin, level.waypoints[i].origin, level.waypoints[closest].origin))
|
||||
closest = i;
|
||||
|
||||
wpOrg = level.waypoints[i].origin + (0, 0, 25);
|
||||
|
||||
if(distance(level.waypoints[i].origin, self.origin) < getDvarFloat("bots_main_debug_distance") && (bulletTracePassed(myEye, wpOrg, false, self) || getDVarint("bots_main_debug_drawThrough")))
|
||||
{
|
||||
for(h = 0; h < level.waypoints[i].childCount; h++)
|
||||
line(wpOrg, level.waypoints[level.waypoints[i].children[h]].origin + (0, 0, 25), (1,0,1));
|
||||
|
||||
if(getConeDot(wpOrg, myEye, myAngles) > getDvarFloat("bots_main_debug_cone"))
|
||||
print3d(wpOrg, i, (1,0,0), 2);
|
||||
|
||||
if (isDefined(level.waypoints[i].angles) && level.waypoints[i].type != "stand")
|
||||
line(wpOrg, wpOrg + AnglesToForward(level.waypoints[i].angles) * 64, (1,1,1));
|
||||
}
|
||||
}
|
||||
|
||||
self.closest = closest;
|
||||
|
||||
if(closest != -1)
|
||||
{
|
||||
stringChildren = "";
|
||||
for(i = 0; i < level.waypoints[closest].childCount; i++)
|
||||
{
|
||||
if(i != 0)
|
||||
stringChildren = stringChildren + "," + level.waypoints[closest].children[i];
|
||||
else
|
||||
stringChildren = stringChildren + level.waypoints[closest].children[i];
|
||||
}
|
||||
print3d(level.waypoints[closest].origin + (0, 0, 35), stringChildren, (0,1,0), 2);
|
||||
|
||||
print3d(level.waypoints[closest].origin + (0, 0, 15), level.waypoints[closest].type, (0,1,0), 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AddWaypoints()
|
||||
{
|
||||
self endon("disconnect");
|
||||
self endon("death");
|
||||
for(;;)
|
||||
{
|
||||
while(!self SecondaryOffhandButtonPressed() || isDefined(self.command))
|
||||
wait 0.05;
|
||||
|
||||
pos = self getOrigin();
|
||||
self.command = true;
|
||||
|
||||
self iprintln("Adding a waypoint...");
|
||||
self iprintln("ADS - climb; Attack + Use - tube");
|
||||
self iprintln("Attack - grenade; Use - claymore");
|
||||
self iprintln("Else(wait) - your stance");
|
||||
|
||||
wait getDvarFloat("bots_main_debug_commandWait");
|
||||
|
||||
self addWaypoint(pos);
|
||||
|
||||
self.command = undefined;
|
||||
|
||||
while(self SecondaryOffhandButtonPressed())
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
linkWaypoints()
|
||||
{
|
||||
self endon("disconnect");
|
||||
self endon("death");
|
||||
for(;;)
|
||||
{
|
||||
while(!self MeleeButtonPressed() || isDefined(self.command))
|
||||
wait 0.05;
|
||||
|
||||
self.command = true;
|
||||
|
||||
self iprintln("ADS - Unlink; Else(wait) - Link");
|
||||
|
||||
wait getDvarFloat("bots_main_debug_commandWait");
|
||||
|
||||
if(!self adsButtonPressed())
|
||||
self LinkWaypoint(self.closest);
|
||||
else
|
||||
self UnLinkWaypoint(self.closest);
|
||||
|
||||
self.command = undefined;
|
||||
|
||||
while(self MeleeButtonPressed())
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
deleteWaypoints()
|
||||
{
|
||||
self endon("disconnect");
|
||||
self endon("death");
|
||||
for(;;)
|
||||
{
|
||||
while(!self fragButtonPressed() || isDefined(self.command))
|
||||
wait 0.05;
|
||||
|
||||
self.command = true;
|
||||
|
||||
self iprintln("Attack - DeleteAll; ADS - Load");
|
||||
self iprintln("Else(wait) - Delete");
|
||||
|
||||
wait getDvarFloat("bots_main_debug_commandWait");
|
||||
|
||||
if(self attackButtonPressed())
|
||||
self deleteAllWaypoints();
|
||||
else if(self adsButtonPressed())
|
||||
self LoadWaypoints();
|
||||
else
|
||||
self DeleteWaypoint(self.closest);
|
||||
|
||||
self.command = undefined;
|
||||
|
||||
while(self fragButtonPressed())
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
watchSaveWaypointsCommand()
|
||||
{
|
||||
self endon("death");
|
||||
self endon("disconnect");
|
||||
|
||||
for(;;)
|
||||
{
|
||||
while(!self useButtonPressed() || !self attackButtonPressed() || isDefined(self.command))
|
||||
wait 0.05;
|
||||
|
||||
self.command = true;
|
||||
|
||||
self iprintln("ADS - Autolink; Else(wait) - Save");
|
||||
|
||||
wait getDvarFloat("bots_main_debug_commandWait");
|
||||
|
||||
if(!self adsButtonPressed())
|
||||
{
|
||||
self checkForWarnings();
|
||||
logprint("***********ABiliTy's WPDump**************\n\n");
|
||||
logprint("\n\n\n\n");
|
||||
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/*");
|
||||
logprint("*/waypoints["+i+"].childCount = "+level.waypoints[i].childCount+";\n/*");
|
||||
for(c = 0; c < level.waypoints[i].childCount; 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].childCount == 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");
|
||||
|
||||
PrintLn(level.waypointCount);
|
||||
for(i = 0; i < level.waypointCount; i++)
|
||||
{
|
||||
str = "";
|
||||
wp = level.waypoints[i];
|
||||
|
||||
str += wp.origin[0] + " " + wp.origin[1] + " " + wp.origin[2] + ",";
|
||||
|
||||
for(h = 0; h < wp.childCount; h++)
|
||||
{
|
||||
str += wp.children[h];
|
||||
|
||||
if (h < wp.childCount - 1)
|
||||
str += " ";
|
||||
}
|
||||
str += "," + wp.type + ",";
|
||||
|
||||
if (isDefined(wp.angles))
|
||||
str += wp.angles[0] + " " + wp.angles[1] + " " + wp.angles[2] + ",";
|
||||
else
|
||||
str += ",";
|
||||
|
||||
str += ",";
|
||||
|
||||
PrintLn(str);
|
||||
}
|
||||
|
||||
self iprintln("Saved!!!");
|
||||
}
|
||||
else
|
||||
{
|
||||
if(level.autoLink)
|
||||
{
|
||||
self iPrintlnBold("Auto link disabled");
|
||||
level.autoLink = false;
|
||||
level.wpToLink = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
self iPrintlnBold("Auto link enabled");
|
||||
level.autoLink = true;
|
||||
level.wpToLink = self.nearest;
|
||||
}
|
||||
}
|
||||
|
||||
self.command = undefined;
|
||||
|
||||
while(self useButtonPressed() && self attackButtonPressed())
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
LoadWaypoints()
|
||||
{
|
||||
self DeleteAllWaypoints();
|
||||
self iPrintlnBold("Loading WPS...");
|
||||
load_waypoints();
|
||||
|
||||
self checkForWarnings();
|
||||
}
|
||||
|
||||
checkForWarnings()
|
||||
{
|
||||
if(level.waypointCount <= 0)
|
||||
self iprintln("WARNING: waypointCount is "+level.waypointCount);
|
||||
|
||||
if(level.waypointCount != level.waypoints.size)
|
||||
self iprintln("WARNING: waypointCount is not "+level.waypoints.size);
|
||||
|
||||
for(i = 0; i < level.waypointCount; i++)
|
||||
{
|
||||
if(!isDefined(level.waypoints[i]))
|
||||
{
|
||||
self iprintln("WARNING: waypoint "+i+" is undefined");
|
||||
continue;
|
||||
}
|
||||
|
||||
if(level.waypoints[i].childCount <= 0)
|
||||
self iprintln("WARNING: waypoint "+i+" childCount is "+level.waypoints[i].childCount);
|
||||
|
||||
if(level.waypoints[i].childCount != level.waypoints[i].children.size)
|
||||
self iprintln("WARNING: waypoint "+i+" childCount is not "+level.waypoints[i].children.size);
|
||||
|
||||
for(h = 0; h < level.waypoints[i].children.size; h++)
|
||||
{
|
||||
child = level.waypoints[i].children[h];
|
||||
|
||||
if(!isDefined(level.waypoints[child]))
|
||||
self iprintln("WARNING: waypoint "+i+" child "+child+" is undefined");
|
||||
else if(child == i)
|
||||
self iprintln("WARNING: waypoint "+i+" child "+child+" is itself");
|
||||
}
|
||||
|
||||
if(!isDefined(level.waypoints[i].type))
|
||||
{
|
||||
self iprintln("WARNING: waypoint "+i+" type is undefined");
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!isDefined(level.waypoints[i].angles) && (level.waypoints[i].type == "claymore" || level.waypoints[i].type == "tube" || (level.waypoints[i].type == "crouch" && level.waypoints[i].childCount == 1) || level.waypoints[i].type == "climb" || level.waypoints[i].type == "grenade"))
|
||||
self iprintln("WARNING: waypoint "+i+" angles is undefined");
|
||||
}
|
||||
}
|
||||
|
||||
DeleteAllWaypoints()
|
||||
{
|
||||
level.waypoints = [];
|
||||
level.waypointCount = 0;
|
||||
|
||||
self iprintln("DelAllWps");
|
||||
}
|
||||
|
||||
DeleteWaypoint(nwp)
|
||||
{
|
||||
if(nwp == -1 || distance(self.origin, level.waypoints[nwp].origin) > getDvarFloat("bots_main_debug_minDist"))
|
||||
{
|
||||
self iprintln("No close enough waypoint to delete.");
|
||||
return;
|
||||
}
|
||||
|
||||
level.wpToLink = -1;
|
||||
|
||||
for(i = 0; i < level.waypoints[nwp].childCount; i++)
|
||||
{
|
||||
child = level.waypoints[nwp].children[i];
|
||||
|
||||
level.waypoints[child].children = array_remove(level.waypoints[child].children, nwp);
|
||||
|
||||
level.waypoints[child].childCount = level.waypoints[child].children.size;
|
||||
}
|
||||
|
||||
for(i = 0; i < level.waypointCount; i++)
|
||||
{
|
||||
for(h = 0; h < level.waypoints[i].childCount; h++)
|
||||
{
|
||||
if(level.waypoints[i].children[h] > nwp)
|
||||
level.waypoints[i].children[h]--;
|
||||
}
|
||||
}
|
||||
|
||||
for ( entry = 0; entry < level.waypointCount; entry++ )
|
||||
{
|
||||
if ( entry == nwp )
|
||||
{
|
||||
while ( entry < level.waypointCount-1 )
|
||||
{
|
||||
level.waypoints[entry] = level.waypoints[entry+1];
|
||||
entry++;
|
||||
}
|
||||
level.waypoints[entry] = undefined;
|
||||
break;
|
||||
}
|
||||
}
|
||||
level.waypointCount--;
|
||||
|
||||
self iprintln("DelWp "+nwp);
|
||||
}
|
||||
|
||||
addWaypoint(pos)
|
||||
{
|
||||
level.waypoints[level.waypointCount] = spawnstruct();
|
||||
|
||||
level.waypoints[level.waypointCount].origin = pos;
|
||||
|
||||
if(self AdsButtonPressed())
|
||||
level.waypoints[level.waypointCount].type = "climb";
|
||||
else if(self AttackButtonPressed() && self UseButtonPressed())
|
||||
level.waypoints[level.waypointCount].type = "tube";
|
||||
else if(self AttackButtonPressed())
|
||||
level.waypoints[level.waypointCount].type = "grenade";
|
||||
else if(self UseButtonPressed())
|
||||
level.waypoints[level.waypointCount].type = "claymore";
|
||||
else
|
||||
level.waypoints[level.waypointCount].type = self getStance();
|
||||
|
||||
level.waypoints[level.waypointCount].angles = self getPlayerAngles();
|
||||
|
||||
level.waypoints[level.waypointCount].children = [];
|
||||
level.waypoints[level.waypointCount].childCount = 0;
|
||||
|
||||
self iprintln(level.waypoints[level.waypointCount].type + " Waypoint "+ level.waypointCount +" Added at "+pos);
|
||||
|
||||
if(level.autoLink)
|
||||
{
|
||||
if(level.wpToLink == -1)
|
||||
level.wpToLink = level.waypointCount - 1;
|
||||
|
||||
level.waypointCount++;
|
||||
self LinkWaypoint(level.waypointCount - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
level.waypointCount++;
|
||||
}
|
||||
}
|
||||
|
||||
UnLinkWaypoint(nwp)
|
||||
{
|
||||
if(nwp == -1 || distance(self.origin, level.waypoints[nwp].origin) > getDvarFloat("bots_main_debug_minDist"))
|
||||
{
|
||||
self iprintln("Waypoint Unlink Cancelled "+level.wpToLink);
|
||||
level.wpToLink = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
if(level.wpToLink == -1 || nwp == level.wpToLink)
|
||||
{
|
||||
level.wpToLink = nwp;
|
||||
self iprintln("Waypoint Unlink Started "+nwp);
|
||||
return;
|
||||
}
|
||||
|
||||
level.waypoints[nwp].children = array_remove(level.waypoints[nwp].children, level.wpToLink);
|
||||
level.waypoints[level.wpToLink].children = array_remove(level.waypoints[level.wpToLink].children, nwp);
|
||||
|
||||
level.waypoints[nwp].childCount = level.waypoints[nwp].children.size;
|
||||
level.waypoints[level.wpToLink].childCount = level.waypoints[level.wpToLink].children.size;
|
||||
|
||||
self iprintln("Waypoint " + nwp + " Broken to " + level.wpToLink);
|
||||
level.wpToLink = -1;
|
||||
}
|
||||
|
||||
LinkWaypoint(nwp)
|
||||
{
|
||||
if(nwp == -1 || distance(self.origin, level.waypoints[nwp].origin) > getDvarFloat("bots_main_debug_minDist"))
|
||||
{
|
||||
self iprintln("Waypoint Link Cancelled "+level.wpToLink);
|
||||
level.wpToLink = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
if(level.wpToLink == -1 || nwp == level.wpToLink)
|
||||
{
|
||||
level.wpToLink = nwp;
|
||||
self iprintln("Waypoint Link Started "+nwp);
|
||||
return;
|
||||
}
|
||||
|
||||
weGood = true;
|
||||
for(i = 0; i < level.waypoints[level.wpToLink].childCount; i++)
|
||||
{
|
||||
if(level.waypoints[level.wpToLink].children[i] == nwp)
|
||||
{
|
||||
weGood = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(weGood)
|
||||
{
|
||||
for(i = 0; i < level.waypoints[nwp].childCount; i++)
|
||||
{
|
||||
if(level.waypoints[nwp].children[i] == level.wpToLink)
|
||||
{
|
||||
weGood = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!weGood )
|
||||
{
|
||||
self iprintln("Waypoint Link Cancelled "+nwp+" and "+level.wpToLink+" already linked.");
|
||||
level.wpToLink = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
level.waypoints[level.wpToLink].children[level.waypoints[level.wpToLink].childcount] = nwp;
|
||||
level.waypoints[level.wpToLink].childcount++;
|
||||
level.waypoints[nwp].children[level.waypoints[nwp].childcount] = level.wpToLink;
|
||||
level.waypoints[nwp].childcount++;
|
||||
|
||||
self iprintln("Waypoint " + nwp + " Linked to " + level.wpToLink);
|
||||
level.wpToLink = -1;
|
||||
}
|
||||
|
||||
destroyOnDeath(hud)
|
||||
{
|
||||
hud endon("death");
|
||||
self waittill_either("death","disconnect");
|
||||
hud notify("death");
|
||||
hud destroy();
|
||||
hud = undefined;
|
||||
}
|
||||
|
||||
textScroll(string)
|
||||
{
|
||||
self endon("death");
|
||||
self endon("disconnect");
|
||||
//thanks ActionScript
|
||||
|
||||
back = createBar((0,0,0), 1000, 30);
|
||||
back setPoint("CENTER", undefined, 0, 220);
|
||||
self thread destroyOnDeath(back);
|
||||
|
||||
text = createFontString("default", 1.5);
|
||||
text setText(string);
|
||||
self thread destroyOnDeath(text);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
text setPoint("CENTER", undefined, 1200, 220);
|
||||
text setPoint("CENTER", undefined, -1200, 220, 20);
|
||||
wait 20;
|
||||
}
|
||||
}
|
||||
|
||||
waittill_either(not, not1)
|
||||
{
|
||||
self endon(not);
|
||||
self waittill(not1);
|
||||
}
|
||||
|
||||
array_remove( ents, remover )
|
||||
{
|
||||
newents = [];
|
||||
for(i = 0; i < ents.size; i++)
|
||||
{
|
||||
index = ents[i];
|
||||
|
||||
if ( index != remover )
|
||||
newents[ newents.size ] = index;
|
||||
}
|
||||
|
||||
return newents;
|
||||
}
|
||||
|
||||
getConeDot(to, from, dir)
|
||||
{
|
||||
dirToTarget = VectorNormalize(to-from);
|
||||
forward = AnglesToForward(dir);
|
||||
return vectordot(dirToTarget, forward);
|
||||
}
|
||||
|
||||
getMapName(map)
|
||||
{
|
||||
switch(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";
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
load_waypoints()
|
||||
{
|
||||
mapname = getDvar("mapname");
|
||||
|
||||
level.waypointCount = 0;
|
||||
level.waypoints = [];
|
||||
|
||||
switch(mapname)
|
||||
{
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
default:
|
||||
maps\mp\bots\waypoints\_custom_map::main(mapname);
|
||||
break;
|
||||
}
|
||||
|
||||
if (level.waypoints.size)
|
||||
println("Loaded " + level.waypoints.size + " waypoints from script.");
|
||||
|
||||
level.waypointCount = level.waypoints.size;
|
||||
|
||||
for(i = 0; i < level.waypointCount; i++)
|
||||
{
|
||||
level.waypoints[i].index = i;
|
||||
level.waypoints[i].bots = [];
|
||||
level.waypoints[i].bots["allies"] = 1;
|
||||
level.waypoints[i].bots["axis"] = 1;
|
||||
|
||||
level.waypoints[i].childCount = level.waypoints[i].children.size;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user