Post: Dev_mp.ff from Uk Disc
11-10-2010, 08:09 PM #1
(adsbygoogle = window.adsbygoogle || []).push({}); ..........
(adsbygoogle = window.adsbygoogle || []).push({});

The following user thanked x_DaftVader_x for this useful post:

add_me
12-02-2010, 11:39 PM #20
Originally posted by Homer
Yeah, but there's some good dvars and functions in there that could be used IF the patch is ever modable....

Just don't kill Larry Smile


Well what I was trying to say is that even if you did mod this patch, it wouldn't affect anything as you would need the dvar in the patch_mp.ff to tell it to use the dev_mp.ff. So you would need to decrypt the patch_mp.ff first.
12-02-2010, 11:55 PM #21
Originally posted by FourzerotwoFAILS View Post
Well what I was trying to say is that even if you did mod this patch, it wouldn't affect anything as you would need the dvar in the patch_mp.ff to tell it to use the dev_mp.ff. So you would need to decrypt the patch_mp.ff first.


Yes, sorry, thats what I meant. The dvars and functions could be used in the patch_mp.ff..
12-03-2010, 12:03 AM #22
Originally posted by Homer
Yes, sorry, thats what I meant. The dvars and functions could be used in the patch_mp.ff..


wait, has someone decrypted this already? or has a decrypted file?
12-03-2010, 12:04 AM #23
Originally posted by FourzerotwoFAILS View Post
wait, has someone decrypted this already? or has a decrypted file?


Yes, someone posted it in this thread. Re-Encrypting it is a whole different story though ...
12-03-2010, 12:06 AM #24
Originally posted by Homer
Yes, posted it in this thread. Re-Encrypting it is a whole different story though ...


Well, let me have a go. I need the method used to decrypt it and both the encrypted file and decrypted file.
12-03-2010, 12:11 AM #25
Originally posted by FourzerotwoFAILS View Post
Well, let me have a go. I need the method used to decrypt it and both the encrypted file and decrypted file.


You would need to speak to BucN about that..
12-03-2010, 12:18 AM #26
Originally posted by BucN View Post
here is the _dev.gsc

    
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\_laststand;

init()
{
/#
if (GetDvar( #"scr_showspawns") == "")
{
SetDvar("scr_showspawns", "0");
}
if (GetDvar( #"scr_showstartspawns") == "")
{
SetDvar("scr_showstartspawns", "0");
}
if (GetDvar( #"scr_botsHasPlayerWeapon") == "")
{
SetDvar("scr_botsHasPlayerWeapon", "0");
}
if (GetDvar( #"scr_botsGrenadesOnly") == "")
{
SetDvar("scr_botsGrenadesOnly", "0");
}
if (GetDvar( #"scr_botsSpecialGrenadesOnly") == "")
{
SetDvar("scr_botsSpecialGrenadesOnly", "0");
}

precacheItem("defaultweapon_mp");
precacheModel("defaultactor");

thread addTestClients();
thread addEnemyHeli();
thread addEnemyU2();
thread addTestCarePackage();
thread removeTestClients();
thread watch_botsdvars();
thread maps\mp\gametypes\_dev_class::dev_cac_init();

setdvar( "scr_giveperk", "" );
setdvar( "scr_forceevent", "" );
SetDvar( "scr_draw_triggers", "0" );

// SRS 3/19/08: engagement distance debug dvar toggle watcher
thread engagement_distance_debug_toggle();

// give equipment through devgui
thread equipment_dev_gui();

// give grenades through devgui
thread grenade_dev_gui();

setdvar( "debug_dynamic_ai_spawning", "0" );
level.bot_overlay = false;
level.bot_threat = false;
level.bot_path = false;

level.dem_spawns = [];

if ( level.gametype == "dem" )
{
extra_spawns = [];
extra_spawns[0] = "mp_dem_spawn_attacker_a";
extra_spawns[1] = "mp_dem_spawn_attacker_b";
extra_spawns[2] = "mp_dem_spawn_defender_a";
extra_spawns[3] = "mp_dem_spawn_defender_b";

for ( i = 0; i < extra_spawns.size; i++ )
{
points = GetEntArray( extra_spawns[i], "classname" );

if ( IsDefined( points ) && points.size > 0 )
{
level.dem_spawns = array_combine( level.dem_spawns, points );
}
}
}

thread onPlayerConnect();

for(;Winky Winky
{
updateDevSettings();
wait .05;
}
#/
}

onPlayerConnect()
{
/#
for(;Winky Winky
{
level waittill ( "connecting", player );


player thread watchAttachmentChange();
}
#/
}

/#
updateHardpoints()
{
keys = getarraykeys( level.killstreaks );
for ( i = 0; i < keys.size; i++ )
{
if ( !IsDefined(level.killstreaks[keys[i]].devDvar) )
continue;

dvar = level.killstreaks[keys[i]].devDvar;

if ( getdvarint(dvar) == 1 )
{
for ( player = 0; player < level.players.size; player++ )
{
level.players[player] maps\mp\gametypes\_hardpoints::giveKillstreak( keys[i] );
}
setdvar( dvar, "0" );
}
}
}

warpAllToHost( team )
{
host = getHostPlayer();

players = get_players();
origin = host.origin;

for ( i = 0 ; i < players.size ; i++ )
{
if ( IsDefined(team) )
{
if ( team == "enemies_host" && host.team == players[i].team )
continue;
if ( team == "friendlies_host" && host.team != players[i].team )
continue;
}
players[i] SetOrigin( origin );
}
setdvar( "scr_playerwarp", "" );
}

updateDevSettings()
{
show_spawns= GetDvarInt( #"scr_showspawns");
show_start_spawns= GetDvarInt( #"scr_showstartspawns");

player = getHostPlayer();

if (show_spawns >= 1)
{
show_spawns= 1;
}
else
{
show_spawns= 0;
}

if (show_start_spawns >= 1)
{
show_start_spawns= 1;
}
else
{
show_start_spawns= 0;
}

if (!IsDefined(level.show_spawns) || level.show_spawns!=show_spawns)
{
level.show_spawns= show_spawns;
SetDvar("scr_showspawns", level.show_spawns);

if(level.show_spawns)
{
showSpawnpoints();
}
else
{
hideSpawnpoints();
}
}

if (!IsDefined(level.show_start_spawns) || level.show_start_spawns!=show_start_spawns)
{
level.show_start_spawns= show_start_spawns;
SetDvar("scr_showstartspawns", level.show_start_spawns);

if(level.show_start_spawns)
{
showStartSpawnpoints();
}
else
{
hideStartSpawnpoints();
}
}

updateMinimapSetting();

if( level.players.size > 0 )
{
updateHardpoints();

if ( GetDvar( #"scr_playerwarp" ) == "host" )
{
warpAllToHost();
}
else if ( GetDvar( #"scr_playerwarp" ) == "enemies_host" )
{
warpAllToHost(GetDvar( #"scr_playerwarp" ));
}
else if ( GetDvar( #"scr_playerwarp" ) == "friendlies_host" )
{
warpAllToHost(GetDvar( #"scr_playerwarp" ));
}
else if ( GetDvar( #"scr_playerwarp" ) == "next_start_spawn" )
{
players = get_players();
setdvar( "scr_playerwarp", "" );

if ( !IsDefined( level.devgui_start_spawn_index ) )
{
level.devgui_start_spawn_index = 0;
}

player = getHostPlayer();
if ( player.pers["team"] == "allies" )
{
spawns = level.spawn_allies_start;
}
else
{
spawns = level.spawn_axis_start;
}

if ( !IsDefined( spawns ) || spawns.size <= 0 )
{
return;
}

for ( i = 0; i < players.size; i++ )
{
players[i] SetOrigin( spawns[ level.devgui_start_spawn_index ].origin );
players[i] SetPlayerAngles( spawns[ level.devgui_start_spawn_index ].angles );
}

level.devgui_start_spawn_index++;

if ( level.devgui_start_spawn_index >= spawns.size )
{
level.devgui_start_spawn_index = 0;
}
}
else if ( GetDvar( #"scr_playerwarp" ) == "prev_start_spawn" )
{
players = get_players();
setdvar( "scr_playerwarp", "" );

if ( !IsDefined( level.devgui_start_spawn_index ) )
{
level.devgui_start_spawn_index = 0;
}

player = getHostPlayer();
if ( player.pers["team"] == "allies" )
{
spawns = level.spawn_allies_start;
}
else
{
spawns = level.spawn_axis_start;
}

if ( !IsDefined( spawns ) || spawns.size <= 0 )
{
return;
}

for ( i = 0; i < players.size; i++ )
{
players[i] SetOrigin( spawns[ level.devgui_start_spawn_index ].origin );
players[i] SetPlayerAngles( spawns[ level.devgui_start_spawn_index ].angles );
}

level.devgui_start_spawn_index--;

if ( level.devgui_start_spawn_index < 0 )
{
level.devgui_start_spawn_index = spawns.size - 1;
}
}
else if ( GetDvar( #"scr_playerwarp" ) == "next_spawn" )
{
players = get_players();
setdvar( "scr_playerwarp", "" );

if ( !IsDefined( level.devgui_spawn_index ) )
{
level.devgui_spawn_index = 0;
}

spawns = level.spawnpoints;
spawns = array_combine( spawns, level.dem_spawns );

if ( !IsDefined( spawns ) || spawns.size <= 0 )
{
return;
}

for ( i = 0; i < players.size; i++ )
{
players[i] SetOrigin( spawns[ level.devgui_spawn_index ].origin );
players[i] SetPlayerAngles( spawns[ level.devgui_spawn_index ].angles );
}

level.devgui_spawn_index++;

if ( level.devgui_spawn_index >= spawns.size )
{
level.devgui_spawn_index = 0;
}
}
else if ( GetDvar( #"scr_playerwarp" ) == "prev_spawn" )
{
players = get_players();
setdvar( "scr_playerwarp", "" );

if ( !IsDefined( level.devgui_spawn_index ) )
{
level.devgui_spawn_index = 0;
}

spawns = level.spawnpoints;
spawns = array_combine( spawns, level.dem_spawns );

if ( !IsDefined( spawns ) || spawns.size <= 0 )
{
return;
}

for ( i = 0; i < players.size; i++ )
{
players[i] SetOrigin( spawns[ level.devgui_spawn_index ].origin );
players[i] SetPlayerAngles( spawns[ level.devgui_spawn_index ].angles );
}

level.devgui_spawn_index--;

if ( level.devgui_spawn_index < 0 )
{
level.devgui_spawn_index = spawns.size - 1;
}
}
else if ( GetDvar( #"scr_devgui_spawn" ) != "" )
{
player = getHostPlayer();

if ( !IsDefined( player.devgui_spawn_active ) )
{
player.devgui_spawn_active = false;
}

if ( !player.devgui_spawn_active )
{
iprintln( "Previous spawn bound to D-Pad Left" );
iprintln( "Next spawn bound to D-Pad Right" );

player.devgui_spawn_active = true;
player thread devgui_spawn_think();
}
else
{
player notify( "devgui_spawn_think" );
player.devgui_spawn_active = false;

player SetActionSlot( 3, "altMode" );
player SetActionSlot( 4, "nightvision" );
}

setdvar( "scr_devgui_spawn", "" );
}
else if ( GetDvar( #"scr_player_ammo" ) != "" )
{
players = get_players();

if ( !IsDefined( level.devgui_unlimited_ammo ) )
{
level.devgui_unlimited_ammo = true;
}
else
{
level.devgui_unlimited_ammo = !level.devgui_unlimited_ammo;
}

if ( level.devgui_unlimited_ammo )
{
iprintln( "Giving unlimited ammo to all players" );
}
else
{
iprintln( "Stopping unlimited ammo for all players" );
}

for ( i = 0; i < players.size; i++ )
{
if ( level.devgui_unlimited_ammo )
{
players[i] thread devgui_unlimited_ammo();
}
else
{
players[i] notify( "devgui_unlimited_ammo" );
}
}

setdvar( "scr_player_ammo", "" );
}
else if ( GetDvar( #"scr_player_zero_ammo" ) != "" )
{
players = get_players();

for ( i = 0; i < players.size; i++ )
{
player = players[i];

weapons = player GetWeaponsList();
weapons = array_remove( weapons, "knife_mp" );

for ( j = 0; j < weapons.size; j++ )
{
if ( weapons[j] == "none" )
continue;

player SetWeaponAmmoStock( weapons[j], 0 );
player SetWeaponAmmoClip( weapons[j], 0 );
}
}

setdvar( "scr_player_zero_ammo", "" );
}
else if ( GetDvar( #"scr_round_pause" ) != "" )
{
if ( !level.timerStopped )
{
iprintln( "Pausing Round Timer" );
maps\mp\gametypes\_globallogic_utils::pauseTimer();
}
else
{
iprintln( "Resuming Round Timer" );
maps\mp\gametypes\_globallogic_utils::resumeTimer();
}

setdvar( "scr_round_pause", "" );
}
else if ( GetDvar( #"scr_round_end" ) != "" )
{
level maps\mp\gametypes\_globallogic::forceEnd();
setdvar( "scr_round_end", "" );
}
else if ( GetDvar( #"scr_health_debug" ) != "" )
{
players = get_players();
host = getHostPlayer();

if ( !IsDefined( host.devgui_health_debug ) )
{
host.devgui_health_debug = false;
}

if ( host.devgui_health_debug )
{
host.devgui_health_debug = false;

for ( i = 0; i < players.size; i++ )
{
players[i] notify( "devgui_health_debug" );

if ( IsDefined( players[i].debug_health_bar ) )
{
players[i].debug_health_bar destroy();
players[i].debug_health_text destroy();
players[i].debug_health_bar = undefined;
players[i].debug_health_text = undefined;
}
}
}
else
{
host.devgui_health_debug = true;

for ( i = 0; i < players.size; i++ )
{
players[i] thread devgui_health_debug();
}
}

setdvar( "scr_health_debug", "" );
}
else if ( GetDvar( #"scr_show_hq_spawns" ) != "" )
{
if ( !IsDefined( level.devgui_show_hq ) )
{
level.devgui_show_hq = false;
}

if ( GetDvar( #"g_gametype" ) == "koth" && IsDefined( level.radios ) )
{
if ( !level.devgui_show_hq )
{
for ( i = 0; i < level.radios.size; i++ )
{
color = ( 1, 0, 0 );
level showOneSpawnPoint( level.radios[i], color, "hide_hq_points", 32, "hq_spawn" );
}
}
else
{
level notify( "hide_hq_points" );
}

level.devgui_show_hq = !level.devgui_show_hq;
}

setdvar( "scr_show_hq_spawns", "" );
}
}
if ( GetDvar( #"scr_giveperk") == "0" )
{
players = get_players();

iprintln( "Taking all perks from all players" );

for ( i = 0; i < players.size; i++ )
{
players[i] ClearPerks();
}

setdvar( "scr_giveperk", "" );
}
if ( GetDvar( #"scr_giveperk") != "" )
{
perk = GetDvar( #"scr_giveperk");
specialties = StrTok( perk, "|" );

players = get_players();

iprintln( "Giving all players perk: '" + perk + "'" );

for ( i = 0; i < players.size; i++ )
{
for( j = 0; j < specialties.size; j++ )
{
players[i] setPerk( specialties[ j ] );
players[i].extraPerks[ specialties[ j ] ] = 1;
}

}
setdvar( "scr_giveperk", "" );
}
if( GetDvar( #"scr_forceevent" ) != "" )
{
event = GetDvar( #"scr_forceevent" );
player = getHostPlayer();
forward = anglestoforward( player.angles );
right = anglestoright( player.angles );
if( event == "painfront" )
{
player DoDamage(1, player.origin+forward);
}
else if( event == "painback" )
{
player DoDamage(1, player.origin-forward);
}
else if( event == "painleft" )
{
player DoDamage(1, player.origin-right);
}
else if( event == "painright" )
{
player DoDamage(1, player.origin+right);
}
setdvar( "scr_forceevent", "" );
}
if ( GetDvar( #"scr_printperks" ) != "" )
{
players = get_players();

for ( i = 0; i < players.size; i++ )
{
perks = players[i] GetPerks();

for ( perk = 0; perk < perks.size; perk++ )
{
iprintln( "Player: '" + players[i].name + "' Has Perk: " + perks[ perk ] + "\n" );
}
}

setdvar( "scr_printperks", "" );
}
if ( GetDvar( #"scr_takeperk") != "" )
{
perk = GetDvar( #"scr_takeperk");
for ( i = 0; i < level.players.size; i++ )
{
level.players[i] unsetPerk( perk );
level.players[i].extraPerks[ perk ] = undefined;
}
setdvar( "scr_takeperk", "" );
}

if ( GetDvar( #"scr_x_kills_y" ) != "" )
{
nameTokens = strTok( GetDvar( #"scr_x_kills_y" ), " " );
if ( nameTokens.size > 1 )
thread xKillsY( nameTokens[0], nameTokens[1] );

setDvar( "scr_x_kills_y", "" );
}

if ( GetDvar( #"scr_usedogs") != "" )
{
ownerName = GetDvar( #"scr_usedogs" );
setDvar( "scr_usedogs", "" );

owner = undefined;
for ( index = 0; index < level.players.size; index++ )
{
if ( level.players[index].name == ownerName )
owner = level.players[index];
}

if ( isDefined( owner ) )
owner maps\mp\gametypes\_hardpoints::triggerKillstreak( "dogs_mp" );
}

if ( GetDvar( #"scr_set_level" ) != "" )
{
player.pers["rank"] = 0;
player.pers["rankxp"] = 0;

newRank = min( GetDvarInt( #"scr_set_level" ), 54 );
newRank = max( newRank, 1 );

setDvar( "scr_set_level", "" );

lastXp = 0;
for ( index = 0; index <= newRank; index++ )
{
newXp = maps\mp\gametypes\_rank::getRankInfoMinXP( index );
player thread maps\mp\gametypes\_rank::giveRankXP( "kill", newXp - lastXp );
lastXp = newXp;
wait ( 0.25 );
self notify ( "cancel_notify" );
}
}

if ( GetDvar( #"scr_givexp" ) != "" )
{
player thread maps\mp\gametypes\_rank::giveRankXP( "challenge", GetDvarInt( #"scr_givexp" ), true );

setDvar( "scr_givexp", "" );
}

if ( GetDvar( #"scr_do_notify" ) != "" )
{
for ( i = 0; i < level.players.size; i++ )
level.players[i] maps\mp\gametypes\_hud_message:GaspldNotifyMessage( GetDvar( #"scr_do_notify" ), GetDvar( #"scr_do_notify" ), game["icons"]["allies"] );

announcement( GetDvar( #"scr_do_notify" ), 0 );
setDvar( "scr_do_notify", "" );
}
if ( GetDvar( #"scr_entdebug" ) != "" )
{
ents = getEntArray();
level.entArray = [];
level.entCounts = [];
level.entGroups = [];
for ( index = 0; index < ents.size; index++ )
{
classname = ents[index].classname;
if ( !isSubStr( classname, "_spawn" ) )
{
curEnt = ents[index];

level.entArray[level.entArray.size] = curEnt;

if ( !isDefined( level.entCounts[classname] ) )
level.entCounts[classname] = 0;

level.entCounts[classname]++;

if ( !isDefined( level.entGroups[classname] ) )
level.entGroups[classname] = [];

level.entGroups[classname][level.entGroups[classname].size] = curEnt;
}
}
}

if( GetDvar( #"debug_dynamic_ai_spawning" ) == "1" && !IsDefined( level.larry ) )
{
thread larry_thread();
}
else if ( GetDvar( #"debug_dynamic_ai_spawning" ) == "0" )
{
level notify ( "kill_larry" );
}

if ( level.bot_overlay == false && GetDvarInt( #"scr_bot_overlay" ) == 1 )
{
level thread bot_overlay_think();
level.bot_overlay = true;
}
else if ( level.bot_overlay == true && GetDvarInt( #"scr_bot_overlay" ) == 0 )
{
level bot_overlay_stop();
level.bot_overlay = false;
}

if ( level.bot_threat == false && GetDvarInt( #"scr_bot_threat" ) == 1 )
{
level thread bot_threat_think();
level.bot_threat = true;
}
else if ( level.bot_threat == true && GetDvarInt( #"scr_bot_threat" ) == 0 )
{
level bot_threat_stop();
level.bot_threat = false;
}

if ( level.bot_path == false && GetDvarInt( #"scr_bot_path" ) == 1 )
{
level thread bot_path_think();
level.bot_path = true;
}
else if ( level.bot_path == true && GetDvarInt( #"scr_bot_path" ) == 0 )
{
level bot_path_stop();
level.bot_path = false;
}

if ( !level.bot_overlay && !level.bot_threat && !level.bot_path )
{
level notify( "bot_dpad_terminate" );
}
}


devgui_spawn_think()
{
self notify( "devgui_spawn_think" );
self endon( "devgui_spawn_think" );
self endon( "disconnect" );

dpad_left = false;
dpad_right = false;

for ( ;; )
{
self SetActionSlot( 3, "" );
self SetActionSlot( 4, "" );

if ( !dpad_left && self ButtonPressed( "DPAD_LEFT" ) )
{
SetDvar( "scr_playerwarp", "prev_spawn" );
dpad_left = true;
}
else if ( !self ButtonPressed( "DPAD_LEFT" ) )
{
dpad_left = false;
}

if ( !dpad_right && self ButtonPressed( "DPAD_RIGHT" ) )
{
SetDvar( "scr_playerwarp", "next_spawn" );
dpad_right = true;
}
else if ( !self ButtonPressed( "DPAD_RIGHT" ) )
{
dpad_right = false;
}

wait( 0.05 );
}
}

devgui_unlimited_ammo()
{
self notify( "devgui_unlimited_ammo" );
self endon( "devgui_unlimited_ammo" );
self endon( "disconnect" );

for ( ;; )
{
wait( 0.1 );

weapons = [];
weapons[0] = self GetCurrentWeapon();
weapons[1] = self GetCurrentOffhand();

for ( i = 0; i < weapons.size; i++ )
{
if ( weapons[i] == "none" )
continue;

self GiveMaxAmmo( weapons[i] );
}
}
}

devgui_health_debug()
{
self notify( "devgui_health_debug" );
self endon( "devgui_health_debug" );
self endon( "disconnect" );

x = 80;
y = 40;

self.debug_health_bar = NewClientHudElem( self );
self.debug_health_bar.x = x + 80;
self.debug_health_bar.y = y + 2;
self.debug_health_bar.alignX = "left";
self.debug_health_bar.alignY = "top";
self.debug_health_bar.horzAlign = "fullscreen";
self.debug_health_bar.vertAlign = "fullscreen";
self.debug_health_bar.alpha = 1;
self.debug_health_bar.foreground = 1;
self.debug_health_bar setshader( "black", 1, 8 );

self.debug_health_text = NewClientHudElem( self );
self.debug_health_text.x = x + 80;
self.debug_health_text.y = y;
self.debug_health_text.alignX = "left";
self.debug_health_text.alignY = "top";
self.debug_health_text.horzAlign = "fullscreen";
self.debug_health_text.vertAlign = "fullscreen";
self.debug_health_text.alpha = 1;
self.debug_health_text.fontScale = 1;
self.debug_health_text.foreground = 1;

for ( ;; )
{
wait ( 0.05 );

width = self.health / self.maxhealth * 300;
width = int( max( width, 1 ) );
self.debug_health_bar setShader( "black", width, 8 );

self.debug_health_text SetValue( self.health );
}
}

giveExtraPerks()
{
if ( !isdefined( self.extraPerks ) )
return;

perks = getArrayKeys( self.extraPerks );

for ( i = 0; i < perks.size; i++ )
self setPerk( perks[i] );
}

xKillsY( attackerName, victimName )
{
attacker = undefined;
victim = undefined;

for ( index = 0; index < level.players.size; index++ )
{
if ( level.players[index].name == attackerName )
attacker = level.players[index];
else if ( level.players[index].name == victimName )
victim = level.players[index];
}

if ( !isAlive( attacker ) || !isAlive( victim ) )
return;

victim thread [[level.callbackPlayerDamage]](
attacker, // eInflictor The entity that causes the damage.(e.g. a turret)
attacker, // eAttacker The entity that is attacking.
1000, // iDamage Integer specifying the amount of damage done
0, // iDFlags Integer specifying flags that are to be applied to the damage
"MOD_RIFLE_BULLET", // sMeansOfDeath Integer specifying the method of death
"none", // sWeapon The weapon number of the weapon used to inflict the damage
(0,0,0), // vPoint The point the damage is from?
(0,0,0), // vDir The direction of the damage
"none", // sHitLoc The location of the hit
0 // psOffsetTime The time offset for the damage
);
}


updateMinimapSetting()
{
// use 0 for no required map aspect ratio.
requiredMapAspectRatio = GetDvarFloat( #"scr_requiredMapAspectRatio");

if (!isdefined(level.minimapheight)) {
setdvar("scr_minimap_height", "0");
level.minimapheight = 0;
}
minimapheight = GetDvarFloat( #"scr_minimap_height");
if (minimapheight != level.minimapheight)
{
if ( minimapheight <= 0 )
{
GetHostPlayer() CameraActivate( false );
level.minimapheight = minimapheight;
level notify("end_draw_map_bounds");
}

if (minimapheight > 0)
{
level.minimapheight = minimapheight;

players = get_players();
if (players.size > 0)
{
player = getHostPlayer();

corners = getentarray("minimap_corner", "targetname");
if (corners.size == 2)
{
viewpos = (corners[0].origin + corners[1].origin);
viewpos = (viewpos[0]*.5, viewpos[1]*.5, viewpos[2]*.5);

level thread minimapWarn( corners );

maxcorner = (corners[0].origin[0], corners[0].origin[1], viewpos[2]);
mincorner = (corners[0].origin[0], corners[0].origin[1], viewpos[2]);
if (corners[1].origin[0] > corners[0].origin[0])
maxcorner = (corners[1].origin[0], maxcorner[1], maxcorner[2]);
else
mincorner = (corners[1].origin[0], mincorner[1], mincorner[2]);
if (corners[1].origin[1] > corners[0].origin[1])
maxcorner = (maxcorner[0], corners[1].origin[1], maxcorner[2]);
else
mincorner = (mincorner[0], corners[1].origin[1], mincorner[2]);

viewpostocorner = maxcorner - viewpos;
viewpos = (viewpos[0], viewpos[1], viewpos[2] + minimapheight);

northvector = (cos(getnorthyaw()), sin(getnorthyaw()), 0);
eastvector = (northvector[1], 0 - northvector[0], 0);
disttotop = vectordot(northvector, viewpostocorner);
if (disttotop < 0)
disttotop = 0 - disttotop;
disttoside = vectordot(eastvector, viewpostocorner);
if (disttoside < 0)
disttoside = 0 - disttoside;

// extend map bounds to meet the required aspect ratio
if ( requiredMapAspectRatio > 0 )
{
mapAspectRatio = disttoside / disttotop;
if ( mapAspectRatio < requiredMapAspectRatio )
{
incr = requiredMapAspectRatio / mapAspectRatio;
disttoside *= incr;
addvec = vecscale( eastvector, vectordot( eastvector, maxcorner - viewpos ) * (incr - 1) );
mincorner -= addvec;
maxcorner += addvec;
}
else
{
incr = mapAspectRatio / requiredMapAspectRatio;
disttotop *= incr;
addvec = vecscale( northvector, vectordot( northvector, maxcorner - viewpos ) * (incr - 1) );
mincorner -= addvec;
maxcorner += addvec;
}
}

if ( level.console )
{
aspectratioguess = 16.0/9.0;
// .8 would be .75 but it needs to be bigger because of safe area
angleside = 2 * atan(disttoside * .8 / minimapheight);
angletop = 2 * atan(disttotop * aspectratioguess * .8 / minimapheight);
}
else
{
aspectratioguess = 4.0/3.0;
angleside = 2 * atan(disttoside / minimapheight);
angletop = 2 * atan(disttotop * aspectratioguess / minimapheight);
}
if (angleside > angletop)
angle = angleside;
else
angle = angletop;

znear = minimapheight - 1000;
if (znear < 16) znear = 16;
if (znear > 10000) znear = 10000;

player CameraSetPosition( viewpos, ( 90, getnorthyaw(), 0 ) );
player CameraActivate( true );

player TakeAllWeapons();
player GiveWeapon( "defaultweapon_mp" );
player setclientdvar("cg_drawgun", "0");
player setclientdvar("cg_draw2d", "0");
player setclientdvar("cg_drawfps", "0");
player setclientdvar("fx_enable", "0");
player setclientdvar("r_fog", "0");
player setclientdvar("r_highLodDist", "0"); // (turns of lods)
player setclientdvar("r_znear", znear); // (reduces z-fighting)
player setclientdvar("r_lodscale", "0");
player setclientdvar("r_lodscaleRigid", "0");
player setclientdvar("cg_drawversion", "0");
player setclientdvar("sm_enable", "1");
player setclientdvar("player_view_pitch_down", "90");
player setclientdvar("player_view_pitch_up", "0");
player setclientdvar("cg_fov", angle);
player setclientdvar("cg_fovmin", "1");
SetDvar( "debug_show_viewpos", "0" );

// hide 3D icons
if ( isdefined( level.objPoints ) )
{
for ( i = 0; i < level.objPointNames.size; i++ )
{
if ( isdefined( level.objPoints[level.objPointNames[i]] ) )
level.objPoints[level.objPointNames[i]] destroy();
}
level.objPoints = [];
level.objPointNames = [];
}

thread drawMiniMapBounds(viewpos, mincorner, maxcorner);
}
else
println("^1Error: There are not exactly 2 \"minimap_corner\" entities in the level.");
}
else
setdvar("scr_minimap_height", "0");
}
}
}

vecscale(vec, scalar)
{
return (vec[0]*scalar, vec[1]*scalar, vec[2]*scalar);
}

drawMiniMapBounds(viewpos, mincorner, maxcorner)
{
level notify("end_draw_map_bounds");
level endon("end_draw_map_bounds");

viewheight = (viewpos[2] - maxcorner[2]);

north = (cos(getnorthyaw()), sin(getnorthyaw()), 0);

diaglen = length(mincorner - maxcorner);

/*diagonal = maxcorner - mincorner;
side = vecscale(north, vectordot(diagonal, north));

origcorner0 = mincorner;
origcorner1 = mincorner + side;
origcorner2 = maxcorner;
origcorner3 = maxcorner - side;*/

mincorneroffset = (mincorner - viewpos);
mincorneroffset = vectornormalize((mincorneroffset[0], mincorneroffset[1], 0));
mincorner = mincorner + vecscale(mincorneroffset, diaglen * 1/800);
maxcorneroffset = (maxcorner - viewpos);
maxcorneroffset = vectornormalize((maxcorneroffset[0], maxcorneroffset[1], 0));
maxcorner = maxcorner + vecscale(maxcorneroffset, diaglen * 1/800);

diagonal = maxcorner - mincorner;
side = vecscale(north, vectordot(diagonal, north));
sidenorth = vecscale(north, abs(vectordot(diagonal, north)));

corner0 = mincorner;
corner1 = mincorner + side;
corner2 = maxcorner;
corner3 = maxcorner - side;

toppos = vecscale(mincorner + maxcorner, .5) + vecscale(sidenorth, .51);
textscale = diaglen * .003;

while(1)
{
line(corner0, corner1);
line(corner1, corner2);
line(corner2, corner3);
line(corner3, corner0);

/*line(origcorner0, origcorner1, (1,0,0));
line(origcorner1, origcorner2, (1,0,0));
line(origcorner2, origcorner3, (1,0,0));
line(origcorner3, origcorner0, (1,0,0));*/

print3d(toppos, "This Side Up", (1,1,1), 1, textscale);

wait .05;
}
}

minimapWarn( corners )
{
threshold = 10;

width = Abs( corners[0].origin[0] - corners[1].origin[0] );
width = Int( width );

height = Abs( corners[0].origin[1] - corners[1].origin[1] );
height = Int( height );

if ( Abs( width - height ) > threshold )
{
for ( ;; )
{
iprintln( "^1Warning: Minimap corners do not form a square (width: " + width + " height: " + height + ")\n" );

if ( height > width )
{
scale = height / width;
iprintln( "^1Warning: The compass minimap might be scaled: " + scale + " units in height more than width\n" );
}
else
{
scale = width / height;
iprintln( "^1Warning: The compass minimap might be scaled: " + scale + " units in width more than height\n" );
}

wait( 10 );
}
}
}

addTestClients()
{
wait 5;

for(;Winky Winky
{
if(GetDvarInt( #"scr_testclients") > 0)
break;
wait 1;
}

// for ( index = 1; index < 24; index++ )
// kick( index );

playSoundOnPlayers( "vox_kls_dav_spawn" );

testclients = GetDvarInt( #"scr_testclients");
setDvar( "scr_testclients", 0 );
for(i = 0; i < testclients; i++)
{
ent[i] = addtestclient();

if (!isdefined(ent[i])) {
println("Could not add test client");
wait 1;
continue;
}

/*if(i & 1)
team = "allies";
else
team = "axis";*/

ent[i].pers["isBot"] = true;
ent[i] thread TestClient("autoassign");

//wait 0.3;
}

thread addTestClients();
}

addEnemyHeli()
{
wait 5;

for(;Winky Winky
{
if(GetDvarInt( #"scr_spawnenemyheli") > 0)
break;
wait 1;
}

enemyheli = GetDvarInt( #"scr_spawnenemyheli");
setDvar( "scr_spawnenemyheli", 0 );

team = "autoassign";
player = getHostPlayer();
if( IsDefined( player.pers["team"] ) )
{
team = GetOtherTeam( player.pers["team"] );
}

ent = getOrMakeBot(team);
if( !isdefined( ent ) )
{
println("Could not add test client");
wait 1;
thread addEnemyHeli();
return;
}

switch( enemyheli )
{
case 1:
level.helilocation = ent.origin;
ent thread maps\mp\_helicopter::useKillstreakHelicopter( "helicopter_comlink_mp" );
wait(0.5);
ent notify( "confirm_location", level.helilocation );
break;
case 2:
ent thread maps\mp\_helicopter_player::useKillstreakHelicopterGunner( "helicopter_gunner_mp" );
break;
case 3:
ent thread maps\mp\_helicopter_player::useKillstreakHelicopterPlayer( "helicopter_player_firstperson_mp" );
break;
}

thread addEnemyHeli();
}

getOrMakeBot(team)
{
for ( i = 0; i <level.players.size; i++ )
{
if ( level.players[i].team == team )
{
if ( IsDefined(level.players[i].pers["isBot"]) && level.players[i].pers["isBot"] )
{
return level.players[i];
}
}
}

ent = addtestclient();
if( IsDefined( ent ) )
{
playSoundOnPlayers( "vox_kls_dav_spawn" );
ent.pers["isBot"] = true;
ent thread TestClient( team );
wait(1);
}

return ent;
}

addEnemyU2()
{
wait 5;

for(;Winky Winky
{
if(GetDvarInt( #"scr_spawnenemyu2") > 0)
break;
wait 1;
}

type = GetDvarInt( #"scr_spawnenemyu2");
setDvar( "scr_spawnenemyu2", 0 );

team = "autoassign";
player = getHostPlayer();
if( IsDefined( player.team ) )
{
team = GetOtherTeam( player.team );
}

ent = getOrMakeBot(team);

if( !isdefined( ent ) )
{
println("Could not add test client");
wait 1;
thread addEnemyU2();
return;
}

if ( type == 3 )
ent thread maps\mp\_radar::useKillstreakSatellite( "satellite_mp" );
else if ( type == 2 )
ent thread maps\mp\_radar::useKillstreakCounterUAV( "counteruav_mp" );
else
ent thread maps\mp\_radar::useKillstreakRadar( "radar_mp" );

thread addEnemyU2();
}

addTestCarePackage()
{
wait 5;

for(;Winky Winky
{
if(GetDvarInt( #"scr_givetestsupplydrop") > 0)
break;
wait 1;
}

supplydrop = GetDvarInt( #"scr_givetestsupplydrop");
team = "autoassign";

player = getHostPlayer();

if( IsDefined( player.pers["team"] ) )
{
switch( supplydrop )
{
case 2: // enemy
team = GetOtherTeam( player.pers["team"] );
break;

case 1: // ally
default:
team = player.pers["team"];
break;
}
}

setDvar( "scr_givetestsupplydrop", 0 );
ent = getOrMakeBot(team);
if( !isdefined( ent ) )
{
println("Could not add test client");
wait 1;
thread addTestCarePackage();
return;
}

ent maps\mp\_killstreakrules::killstreakStart( "supply_drop_mp", team );
ent thread maps\mp\gametypes\_supplydrop::heliDeliverCrate( ent.origin, "supplydrop_mp", ent, team );

thread addTestCarePackage();
}

removeTestClients()
{
wait 5;

for(;Winky Winky
{
if(GetDvarInt( #"scr_testclientsremove") > 0)
break;
wait 1;
}

playSoundOnPlayers( "vox_kls_dav_kill" );

removeType = GetDvarInt( #"scr_testclientsremove");

setDvar( "scr_testclientsremove", 0 );

host = getHostPlayer();

players = level.players;
for(i = 0; i < players.size; i++)
{
if ( IsDefined(players[i].pers["isBot"]) && players[i].pers["isBot"] == true )
{
// remove friendlies
if ( removeType == 2 && host.team != players[i].team )
continue;

// remove enemies
if ( removeType == 3 && host.team == players[i].team )
continue;

Kick( players[i] GetEntityNumber( ) );
}
}

thread removeTestClients();
}

TestClient(team) // self == test client
{
self endon( "disconnect" );

while(!isdefined(self.pers["team"]))
wait .05;

if ( level.teambased )
{
self notify("menuresponse", game["menu_team"], team);
wait 0.5;
}

classes = getArrayKeys( level.classMap );
okclasses = [];
for ( i = 0; i < classes.size; i++ )
{
if ( !issubstr( classes[i], "custom" ) && isDefined( level.default_perk[ level.classMap[ classes[i] ] ] ) )
okclasses[ okclasses.size ] = classes[i];
}

assert( okclasses.size );

while( 1 )
{
class = okclasses[ randomint( okclasses.size ) ];

if ( !level.oldschool )
self notify("menuresponse", "changeclass", class);

self waittill( "spawned_player" );
wait ( 0.10 );
}
}

showOneSpawnPoint(
spawn_point,
color,
notification,
height,
print)
{
if ( !IsDefined( height ) || height <= 0 )
{
height = get_player_height();
}

if ( !IsDefined( print ) )
{
print = spawn_point.classname;
}

center = spawn_point.origin;
forward = anglestoforward(spawn_point.angles);
right = anglestoright(spawn_point.angles);

forward = vector_scale(forward, 16);
right = vector_scale(right, 16);

a = center + forward - right;
b = center + forward + right;
c = center - forward + right;
d = center - forward - right;

thread lineUntilNotified(a, b, color, 0, notification);
thread lineUntilNotified(b, c, color, 0, notification);
thread lineUntilNotified(c, d, color, 0, notification);
thread lineUntilNotified(d, a, color, 0, notification);

thread lineUntilNotified(a, a + (0, 0, height), color, 0, notification);
thread lineUntilNotified(b, b + (0, 0, height), color, 0, notification);
thread lineUntilNotified(c, c + (0, 0, height), color, 0, notification);
thread lineUntilNotified(d, d + (0, 0, height), color, 0, notification);

a = a + (0, 0, height);
b = b + (0, 0, height);
c = c + (0, 0, height);
d = d + (0, 0, height);

thread lineUntilNotified(a, b, color, 0, notification);
thread lineUntilNotified(b, c, color, 0, notification);
thread lineUntilNotified(c, d, color, 0, notification);
thread lineUntilNotified(d, a, color, 0, notification);

center = center + (0, 0, height/2);
arrow_forward = anglestoforward(spawn_point.angles);
arrowhead_forward = anglestoforward(spawn_point.angles);
arrowhead_right = anglestoright(spawn_point.angles);

arrow_forward = vector_scale(arrow_forward, 32);
arrowhead_forward = vector_scale(arrowhead_forward, 24);
arrowhead_right = vector_scale(arrowhead_right, Cool Man (aka Tustin);

a = center + arrow_forward;
b = center + arrowhead_forward - arrowhead_right;
c = center + arrowhead_forward + arrowhead_right;

thread lineUntilNotified(center, a, color, 0, notification);
thread lineUntilNotified(a, b, color, 0, notification);
thread lineUntilNotified(a, c, color, 0, notification);

thread print3DUntilNotified(spawn_point.origin + (0, 0, height), print, color, 1, 1, notification);

return;
}

showSpawnpoints()
{
if (IsDefined(level.spawnpoints))
{
// show standard spawn points
color= (1, 1, 1);
for (spawn_point_index= 0; spawn_point_index<level.spawnpoints.size; spawn_point_index++)
{
showOneSpawnPoint(level.spawnpoints[spawn_point_index], color, "hide_spawnpoints");
}
}

for ( i = 0; i < level.dem_spawns.size; i++ )
{
color = ( 0, 1, 0 );
showOneSpawnPoint( level.dem_spawns[i], color, "hide_spawnpoints" );
}

return;
}

hideSpawnpoints()
{
level notify("hide_spawnpoints");

return;
}

showStartSpawnpoints()
{
if (IsDefined(level.spawn_axis_start))
{
color= (1, 0, 1);
for (spawn_point_index= 0; spawn_point_index<level.spawn_axis_start.size; spawn_point_index++)
{
showOneSpawnPoint(level.spawn_axis_start[spawn_point_index], color, "hide_startspawnpoints");
}
}
if (IsDefined(level.spawn_allies_start))
{
color= (0, 1, 1);
for (spawn_point_index= 0; spawn_point_index<level.spawn_allies_start.size; spawn_point_index++)
{
showOneSpawnPoint(level.spawn_allies_start[spawn_point_index], color, "hide_startspawnpoints");
}
}

return;
}

hideStartSpawnpoints()
{
level notify("hide_startspawnpoints");

return;
}

print3DUntilNotified(origin, text, color, alpha, scale, notification)
{
level endon(notification);

for(;Winky Winky
{
print3d(origin, text, color, alpha, scale);
wait .05;
}
}

lineUntilNotified(start, end, color, depthTest, notification)
{
level endon(notification);

for(;Winky Winky
{
line(start, end, color, depthTest);
wait .05;
}
}

// this controls the engagement distance debug stuff with a dvar
engagement_distance_debug_toggle()
{
level endon( "kill_engage_dist_debug_toggle_watcher" );

if( !IsDefined( GetDvarInt( #"debug_engage_dists") ) )
setdvar( "debug_engage_dists", "0" );

lastState = GetDvarInt( #"debug_engage_dists" );

while( 1 )
{
currentState = GetDvarInt( #"debug_engage_dists" );

if( dvar_turned_on( currentState ) && !dvar_turned_on( lastState ) )
{
// turn it on
weapon_engage_dists_init();
thread debug_realtime_engage_dist();
//thread debug_ai_engage_dist();

lastState = currentState;
}
else if( !dvar_turned_on( currentState ) && dvar_turned_on( lastState ) )
{
// send notify to turn off threads
level notify( "kill_all_engage_dist_debug" );

lastState = currentState;
}

wait( 0.3 );
}
}

dvar_turned_on( val )
{
if( val <= 0 )
{
return false;
}
else
{
return true;
}
}

engagement_distance_debug_init()
{
// set up debug stuff
level.debug_xPos = -50;
level.debug_yPos = 250;
level.debug_yInc = 18;

level.debug_fontScale = 1.5;

level.white = ( 1, 1, 1 );
level.green = ( 0, 1, 0 );
level.yellow = ( 1, 1, 0 );
level.red = ( 1, 0, 0 );

level.realtimeEngageDist = NewHudElem();
level.realtimeEngageDist.alignX = "left";
level.realtimeEngageDist.fontScale = level.debug_fontScale;
level.realtimeEngageDist.x = level.debug_xPos;
level.realtimeEngageDist.y = level.debug_yPos;
level.realtimeEngageDist.color = level.white;
level.realtimeEngageDist SetText( "Current Engagement Distance: " );

xPos = level.debug_xPos + 207;

level.realtimeEngageDist_value = NewHudElem();
level.realtimeEngageDist_value.alignX = "left";
level.realtimeEngageDist_value.fontScale = level.debug_fontScale;
level.realtimeEngageDist_value.x = xPos;
level.realtimeEngageDist_value.y = level.debug_yPos;
level.realtimeEngageDist_value.color = level.white;
level.realtimeEngageDist_value SetValue( 0 );

xPos += 37;

level.realtimeEngageDist_middle = NewHudElem();
level.realtimeEngageDist_middle.alignX = "left";
level.realtimeEngageDist_middle.fontScale = level.debug_fontScale;
level.realtimeEngageDist_middle.x = xPos;
level.realtimeEngageDist_middle.y = level.debug_yPos;
level.realtimeEngageDist_middle.color = level.white;
level.realtimeEngageDist_middle SetText( " units, SHORT/LONG by " );

xPos += 105;

level.realtimeEngageDist_offvalue = NewHudElem();
level.realtimeEngageDist_offvalue.alignX = "left";
level.realtimeEngageDist_offvalue.fontScale = level.debug_fontScale;
level.realtimeEngageDist_offvalue.x = xPos;
level.realtimeEngageDist_offvalue.y = level.debug_yPos;
level.realtimeEngageDist_offvalue.color = level.white;
level.realtimeEngageDist_offvalue SetValue( 0 );

hudObjArray = [];
hudObjArray[0] = level.realtimeEngageDist;
hudObjArray[1] = level.realtimeEngageDist_value;
hudObjArray[2] = level.realtimeEngageDist_middle;
hudObjArray[3] = level.realtimeEngageDist_offvalue;

return hudObjArray;
}

engage_dist_debug_hud_destroy( hudArray, killNotify )
{
level waittill( killNotify );

for( i = 0; i < hudArray.size; i++ )
{
hudArray[i] Destroy();
}
}

weapon_engage_dists_init()
{
level.engageDists = [];

// first pass ok
genericPistol = spawnstruct();
genericPistol.engageDistMin = 125;
genericPistol.engageDistOptimal = 225;
genericPistol.engageDistMulligan = 50; // range around the optimal value that is still optimal
genericPistol.engageDistMax = 400;

// first pass ok
shotty = spawnstruct();
shotty.engageDistMin = 50;
shotty.engageDistOptimal = 200;
shotty.engageDistMulligan = 75;
shotty.engageDistMax = 350;

// first pass ok
genericSMG = spawnstruct();
genericSMG.engageDistMin = 100;
genericSMG.engageDistOptimal = 275;
genericSMG.engageDistMulligan = 100;
genericSMG.engageDistMax = 500;

// first pass NEED TEST
genericLMG = spawnstruct();
genericLMG.engageDistMin = 325;
genericLMG.engageDistOptimal = 550;
genericLMG.engageDistMulligan = 150;
genericLMG.engageDistMax = 850;

// first pass ok
genericRifleSA = spawnstruct();
genericRifleSA.engageDistMin = 325;
genericRifleSA.engageDistOptimal = 550;
genericRifleSA.engageDistMulligan = 150;
genericRifleSA.engageDistMax = 850;

// first pass ok
genericRifleBolt = spawnstruct();
genericRifleBolt.engageDistMin = 350;
genericRifleBolt.engageDistOptimal = 600;
genericRifleBolt.engageDistMulligan = 150;
genericRifleBolt.engageDistMax = 900;

// first pass NEED TEST
genericHMG = spawnstruct();
genericHMG.engageDistMin = 390;
genericHMG.engageDistOptimal = 600;
genericHMG.engageDistMulligan = 100;
genericHMG.engageDistMax = 900;

// first pass ok
genericSniper = spawnstruct();
genericSniper.engageDistMin = 950;
genericSniper.engageDistOptimal = 1700;
genericSniper.engageDistMulligan = 300;
genericSniper.engageDistMax = 3000;

// Pistols
engage_dists_add( "colt_mp", genericPistol );
engage_dists_add( "nambu_mp", genericPistol );
engage_dists_add( "tokarev_mp", genericPistol );
engage_dists_add( "walther_mp", genericPistol );

// SMGs
engage_dists_add( "thompson_mp", genericSMG );
engage_dists_add( "type100_smg_mp", genericSMG );
engage_dists_add( "ppsh_mp", genericSMG );
engage_dists_add( "mp40_mp", genericSMG );
engage_dists_add( "stg44_mp", genericSMG );
engage_dists_add( "sten_mp", genericSMG );
engage_dists_add( "sten_silenced_mp", genericSMG );

// shotgun
engage_dists_add( "shotgun_mp", shotty );

// LMGs
engage_dists_add( "bar_mp", genericLMG );
engage_dists_add( "bar_bipod_mp", genericLMG );
engage_dists_add( "type99_lmg_mp", genericLMG );
engage_dists_add( "type99_lmg_bipod_mp", genericLMG );
engage_dists_add( "dp28_mp", genericLMG );
engage_dists_add( "dp28_bipod_mp", genericLMG );
engage_dists_add( "fg42_mp", genericLMG );
engage_dists_add( "fg42_bipod_mp", genericLMG );
engage_dists_add( "bren_mp", genericLMG );
engage_dists_add( "bren_bipod_mp", genericLMG );

// Rifles (semiautomatic)
engage_dists_add( "m1garand_mp", genericRifleSA );
engage_dists_add( "m1garand_bayonet_mp", genericRifleSA );
engage_dists_add( "m1carbine_mp", genericRifleSA );
engage_dists_add( "m1carbine_bayonet_mp", genericRifleSA );
engage_dists_add( "svt40_mp", genericRifleSA );
engage_dists_add( "gewehr43_mp", genericRifleSA );

// Rifles (bolt-action)
engage_dists_add( "springfield_mp", genericRifleBolt );
engage_dists_add( "springfield_bayonet_mp", genericRifleBolt );
engage_dists_add( "type99_rifle_mp", genericRifleBolt );
engage_dists_add( "type99_rifle_bayonet_mp", genericRifleBolt );
engage_dists_add( "mosin_rifle_mp", genericRifleBolt );
engage_dists_add( "mosin_rifle_bayonet_mp", genericRifleBolt );
engage_dists_add( "kar98k_mp", genericRifleBolt );
engage_dists_add( "kar98k_bayonet_mp", genericRifleBolt );
engage_dists_add( "lee_enfield_mp", genericRifleBolt );
engage_dists_add( "lee_enfield_bayonet_mp", genericRifleBolt );

// HMGs
engage_dists_add( "30cal_mp", genericHMG );
engage_dists_add( "30cal_bipod_mp", genericHMG );
engage_dists_add( "mg42_mp", genericHMG );
engage_dists_add( "mg42_bipod_mp", genericHMG );

// Sniper Rifles
engage_dists_add( "springfield_scoped_mp", genericSniper );
engage_dists_add( "type99_rifle_scoped_mp", genericSniper );
engage_dists_add( "mosin_rifle_scoped_mp", genericSniper );
engage_dists_add( "kar98k_scoped_mp", genericSniper );
engage_dists_add( "fg42_scoped_mp", genericSniper );
engage_dists_add( "lee_enfield_scoped_mp", genericSniper );

// start waiting for weapon changes
level thread engage_dists_watcher();
}

engage_dists_add( weapontypeStr, values )
{
level.engageDists[weapontypeStr] = values;
}

// returns a script_struct, or undefined, if the lookup failed
get_engage_dists( weapontypeStr )
{
if( IsDefined( level.engageDists[weapontypeStr] ) )
{
return level.engageDists[weapontypeStr];
}
else
{
return undefined;
}
}

// checks currently equipped weapon to make sure that engagement distance values are correct
engage_dists_watcher()
{
level endon( "kill_all_engage_dist_debug" );
level endon( "kill_engage_dists_watcher" );

while( 1 )
{
player = getHostPlayer();
playerWeapon = player GetCurrentWeapon();

if( !IsDefined( player.lastweapon ) )
{
player.lastweapon = playerWeapon;
}
else
{
if( player.lastweapon == playerWeapon )
{
wait( 0.05 );
continue;
}
}

values = get_engage_dists( playerWeapon );

if( IsDefined( values ) )
{
level.weaponEngageDistValues = values;
}
else
{
level.weaponEngageDistValues = undefined;
}

player.lastweapon = playerWeapon;

wait( 0.05 );
}
}

debug_realtime_engage_dist()
{
level endon( "kill_all_engage_dist_debug" );
level endon( "kill_realtime_engagement_distance_debug" );

hudObjArray = engagement_distance_debug_init();
level thread engage_dist_debug_hud_destroy( hudObjArray, "kill_all_engage_dist_debug" );

level.debugRTEngageDistColor = level.green;

player = getHostPlayer();

while( 1 )
{
lastTracePos = ( 0, 0, 0 );

// Trace to where the player is looking
direction = player GetPlayerAngles();
direction_vec = AnglesToForward( direction );
eye = player GetEye();

eye = ( eye[0], eye[1], eye[2] + 20 );

trace = BulletTrace( eye, eye + vector_scale( direction_vec, 10000 ), true, player );
tracePoint = trace["position"];
traceNormal = trace["normal"];
traceDist = int( Distance( eye, tracePoint ) ); // just need an int, thanks

if( tracePoint != lastTracePos )
{
lastTracePos = tracePoint;

if( !IsDefined( level.weaponEngageDistValues ) )
{
hudobj_changecolor( hudObjArray, level.white );
hudObjArray engagedist_hud_changetext( "nodata", tracedist );
}
else
{
// for convenience
engageDistMin = level.weaponEngageDistValues.engageDistMin;
engageDistOptimal = level.weaponEngageDistValues.engageDistOptimal;
engageDistMulligan = level.weaponEngageDistValues.engageDistMulligan;
engageDistMax = level.weaponEngageDistValues.engageDistMax;

// if inside our engagement distance range...
if( ( traceDist >= engageDistMin ) && ( traceDist <= engageDistMax ) )
{
// if in the optimal range...
if( ( traceDist >= ( engageDistOptimal - engageDistMulligan ) )
&& ( traceDist <= ( engageDistOptimal + engageDistMulligan ) ) )
{
hudObjArray engagedist_hud_changetext( "optimal", tracedist );
hudobj_changecolor( hudObjArray, level.green );
}
else
{
hudObjArray engagedist_hud_changetext( "ok", tracedist );
hudobj_changecolor( hudObjArray, level.yellow );
}
}
else if( traceDist < engageDistMin )
{
hudobj_changecolor( hudObjArray, level.red );
hudObjArray engagedist_hud_changetext( "short", tracedist );
}
else if( traceDist > engageDistMax )
{
hudobj_changecolor( hudObjArray, level.red );
hudObjArray engagedist_hud_changetext( "long", tracedist );
}
}
}

// draw our trace spot
// plot_circle_fortime(radius1,radius2,time,color,origin,normal)
thread plot_circle_fortime( 1, 5, 0.05, level.debugRTEngageDistColor, tracePoint, traceNormal );
thread plot_circle_fortime( 1, 1, 0.05, level.debugRTEngageDistColor, tracePoint, traceNormal );

wait( 0.05 );
}
}

hudobj_changecolor( hudObjArray, newcolor )
{
for( i = 0; i < hudObjArray.size; i++ )
{
hudObj = hudObjArray[i];

if( hudObj.color != newcolor )
{
hudObj.color = newcolor;
level.debugRTEngageDistColor = newcolor;
}
}
}

// self = an array of hud objects
engagedist_hud_changetext( engageDistType, units )
{
if( !IsDefined( level.lastDistType ) )
{
level.lastDistType = "none";
}

if( engageDistType == "optimal" )
{
self[1] SetValue( units );
self[2] SetText( "units: OPTIMAL!" );
self[3].alpha = 0;
}
else if( engageDistType == "ok" )
{
self[1] SetValue( units );
self[2] SetText( "units: OK!" );
self[3].alpha = 0;
}
else if( engageDistType == "short" )
{
amountUnder = level.weaponEngageDistValues.engageDistMin - units;
self[1] SetValue( units );
self[3] SetValue( amountUnder );
self[3].alpha = 1;

if( level.lastDistType != engageDistType )
{
self[2] SetText( "units: SHORT by " );
}
}
else if( engageDistType == "long" )
{
amountOver = units - level.weaponEngageDistValues.engageDistMax;
self[1] SetValue( units );
self[3] SetValue( amountOver );
self[3].alpha = 1;

if( level.lastDistType != engageDistType )
{
self[2] SetText( "units: LONG by " );
}
}
else if( engageDistType == "nodata" )
{
self[1] SetValue( units );
self[2] SetText( " units: (NO CURRENT WEAPON VALUES)" );
self[3].alpha = 0;
}

level.lastDistType = engageDistType;
}

// draws print3ds above enemy AI heads to show contact distances
/*
debug_ai_engage_dist()
{
level endon( "kill_all_engage_dist_debug" );
level endon( "kill_ai_engagement_distance_debug" );

player = getHostPlayer();

while( 1 )
{
axis = GetAIArray( "axis" );

if( IsDefined( axis ) && axis.size > 0 )
{
playerEye = player GetEye();

for( i = 0; i < axis.size; i++ )
{
ai = axis[i];
aiEye = ai GetEye();

if( SightTracePassed( playerEye, aiEye, false, player ) )
{
dist = Distance( playerEye, aiEye );

drawColor = level.white;
drawString = "-";

if( !IsDefined( level.weaponEngageDistValues ) )
{
drawColor = level.white;
}
else
{
// for convenience
engageDistMin = level.weaponEngageDistValues.engageDistMin;
engageDistOptimal = level.weaponEngageDistValues.engageDistOptimal;
engageDistMulligan = level.weaponEngageDistValues.engageDistMulligan;
engageDistMax = level.weaponEngageDistValues.engageDistMax;

// if inside our engagement distance range...
if( ( dist >= engageDistMin ) && ( dist <= engageDistMax ) )
{
// if in the optimal range...
if( ( dist >= ( engageDistOptimal - engageDistMulligan ) )
&& ( dist <= ( engageDistOptimal + engageDistMulligan ) ) )
{
drawColor = level.green;
drawString = "RAD";
}
// else it's just ok
else
{
drawColor = level.yellow;
drawString = "MEH";
}
}
else if( dist < engageDistMin )
{
drawColor = level.red;
drawString = "BAD";
}
else if( dist > engageDistMax )
{
drawColor = level.red;
drawString = "BAD";
}
}

scale = dist / 525;
Print3d( ai.origin + ( 0, 0, 67 ), drawString, drawColor, 1, scale );
}
}
}

wait( 0.05 );
}
}
*/

// draws a circle in script
plot_circle_fortime(radius1,radius2,time,color,origin,normal)
{
if(!isdefined(color))
color = (0,1,0);
hangtime = .05;
circleres = 6;
hemires = circleres/2;
circleinc = 360/circleres;
circleres++;
plotpoints = [];

rad = 0.00;
timer = gettime()+(time*1000);
radius = radius1;

while(gettime()<timer)
{
// radius = radius1+((radius2-radius1)*(1-((timer-gettime())/(time*1000))));
radius = radius2;
angletoplayer = vectortoangles(normal);
for(i=0;i<circleres;i++)
{
plotpoints[plotpoints.size] = origin+vector_scale(anglestoforward((angletoplayer+(rad,90,0))),radius);
rad+=circleinc;
}
maps\mp\_utility::plot_points(plotpoints,color[0],color[1],color[2],hangtime);
plotpoints = [];
wait hangtime;
}
}


// -- end engagement distance debug --

larry_thread()
{
level.larry = SpawnStruct();

player = getHostPlayer();
player thread larry_init( level.larry );

// Cleanup hudelems, dummy models, etc.
level waittill ( "kill_larry" );

larry_hud_destroy( level.larry );

if ( IsDefined( level.larry.model ) )
level.larry.model delete();

if ( IsDefined( level.larry.ai ) )
{
for ( i = 0; i < level.larry.ai.size; i++ )
{
kick( level.larry.ai[i] GetEntityNumber() );
}
}

level.larry = undefined;
}

larry_init( larry )
{
level endon ( "kill_larry" );

// HUD
larry_hud_init( larry );

// Model
larry.model = spawn( "script_model", (0,0,0) );
larry.model setmodel( "defaultactor" );

// AI
larry.ai = [];

wait 0.1;

for ( ;; )
{
wait (0.05);

if ( larry.ai.size > 0 )
{
larry.model Hide();
continue;
}

// Trace to where the player is looking
direction = self getPlayerAngles();
direction_vec = anglesToForward( direction );
eye = self getEye();

// offset 2 units on the Z to fix the bug where it would drop through the ground sometimes
trace = bullettrace( eye, eye + vector_scale( direction_vec , 8000 ), 0, undefined );

dist = distance (eye, trace["position"]);
position = eye + vector_scale( direction_vec , (dist - 64) );

larry.model.origin = position;
larry.model.angles = self.angles + ( 0, 180, 0 );

if ( self UseButtonPressed() )
{
self larry_ai( larry );

while ( self UseButtonPressed() )
wait ( 0.05 );
}
}
}

larry_ai( larry )
{
larry.ai[larry.ai.size] = AddTestClient();

i = larry.ai.size - 1;
larry.ai[i].pers["isBot"] = true;
larry.ai[i] thread TestClient( "autoassign" );

larry.ai[i] thread larry_ai_thread( larry, larry.model.origin, larry.model.angles );
larry.ai[i] thread larry_ai_damage( larry );
larry.ai[i] thread larry_ai_health( larry );
}

larry_ai_thread( larry, origin, angles )
{
level endon( "kill_larry" );

for ( ;; )
{
self waittill( "spawned_player" );

//larry.clearTextMarker ClearAllTextAfterHudElem();

larry.menu[larry.menu_health] SetValue( self.health );
larry.menu[larry.menu_damage] SetText( "" );
larry.menu[larry.menu_range] SetText( "" );
larry.menu[larry.menu_hitloc] SetText( "" );
larry.menu[larry.menu_weapon] SetText( "" );
larry.menu[larry.menu_perks] SetText( "" );

self SetOrigin( origin );
self SetPlayerAngles( angles );
}
}

larry_ai_damage( larry )
{
level endon( "kill_larry" );

for ( ;; )
{
self waittill( "damage", damage, attacker);

// AE 10-8-09: changed the range default value from "" to 0.0 because it was causing script errors
range = 0.0;

player = getHostPlayer();
if ( attacker == player )
{
eye = player GetEye();
eye = ( eye[0], eye[1], eye[2] + 20 );

range = int( Distance( eye, self.origin ) );
}

//larry.clearTextMarker ClearAllTextAfterHudElem();

larry.menu[larry.menu_health] SetValue( self.health );
larry.menu[larry.menu_damage] SetValue( damage );
larry.menu[larry.menu_range] SetValue( range );
larry.menu[larry.menu_hitloc] SetText( "" );
larry.menu[larry.menu_weapon] SetText( "" );
larry.menu[larry.menu_perks] SetText( "" );
}
}

larry_ai_health( larry )
{
level endon( "kill_larry" );

for ( ;; )
{
wait( 0.05 );

larry.menu[larry.menu_health] SetValue( self.health );
}
}

larry_hud_init( larry )
{
x = -45;
y = 275;
menu_name = "larry_menu";

larry.hud = new_hud( menu_name, undefined, x, y, 1 );
larry.hud SetShader( "white", 100, 70 );
larry.hud.alignX = "left";
larry.hud.alignY = "top";
larry.hud.sort = 10;
larry.hud.alpha = 0.6;
larry.hud.color = ( 0.0, 0.0, 0.5 );

larry.menu[0] = new_hud( menu_name, "Larry Health:", x + 5, y + 10, 1 );
larry.menu[1] = new_hud( menu_name, "Damage:", x + 5, y + 20, 1 );
larry.menu[2] = new_hud( menu_name, "Range:", x + 5, y + 30, 1 );
larry.menu[3] = new_hud( menu_name, "Hit Location:", x + 5, y + 40, 1 );
larry.menu[4] = new_hud( menu_name, "Weapon:", x + 5, y + 50, 1 );
larry.menu[5] = new_hud( menu_name, "Perks:", x + 5, y + 60, 1 );

larry.clearTextMarker = NewDebugHudElem();
larry.clearTextMarker.alpha = 0;
larry.clearTextMarker setText( "marker" );

larry.menu_health = larry.menu.size;
larry.menu_damage = larry.menu.size + 1;
larry.menu_range = larry.menu.size + 2;
larry.menu_hitloc = larry.menu.size + 3;
larry.menu_weapon = larry.menu.size + 4;
larry.menu_perks = larry.menu.size + 5;

x_offset = 70;

larry.menu[larry.menu_health] = new_hud( menu_name, "", x + x_offset, y + 10, 1 );
larry.menu[larry.menu_damage] = new_hud( menu_name, "", x + x_offset, y + 20, 1 );
larry.menu[larry.menu_range] = new_hud( menu_name, "", x + x_offset, y + 30, 1 );
larry.menu[larry.menu_hitloc] = new_hud( menu_name, "", x + x_offset, y + 40, 1 );
larry.menu[larry.menu_weapon] = new_hud( menu_name, "", x + x_offset, y + 50, 1 );
larry.menu[larry.menu_perks] = new_hud( menu_name, "", x + x_offset, y + 60, 1 );
}

larry_hud_destroy( larry )
{
if ( IsDefined( larry.hud ) )
{
larry.hud Destroy();

for ( i = 0; i < larry.menu.size; i++ )
{
larry.menu[i] Destroy();
}

//larry.clearTextMarker ClearAllTextAfterHudElem();
larry.clearTextMarker Destroy();
}
}

new_hud( hud_name, msg, x, y, scale )
{
if( !IsDefined( level.hud_array ) )
{
level.hud_array = [];
}

if( !IsDefined( level.hud_array[hud_name] ) )
{
level.hud_array[hud_name] = [];
}

hud = set_hudelem( msg, x, y, scale );
level.hud_array[hud_name][level.hud_array[hud_name].size] = hud;
return hud;
}

//------------------------------------------------------//
// set_hudelem( [text], x, y, [scale], [alpha] ) //
// Actually creates the hudelem //
//------------------------------------------------------//
// self - n/a //
// text - The text to be displayed //
// x - Sets the x position of the hudelem //
// y - Sets the y position of the hudelem //
// scale - Sets the scale of the hudelem //
// alpha - Sets the alpha of the hudelem //
//------------------------------------------------------//
set_hudelem( text, x, y, scale, alpha, sort, debug_hudelem )
{
if( !IsDefined( alpha ) )
{
alpha = 1;
}

if( !IsDefined( scale ) )
{
scale = 1;
}

if( !IsDefined( sort ) )
{
sort = 20;
}

hud = NewDebugHudElem();
hud.debug_hudelem = true;

hud.location = 0;
hud.alignX = "left";
hud.alignY = "middle";
hud.foreground = 1;
hud.fontScale = scale;
hud.sort = sort;
hud.alpha = alpha;
hud.x = x;
hud.y = y;
hud.og_scale = scale;

if( IsDefined( text ) )
{
hud SetText( text );
}

return hud;
}

watch_botsdvars()
{
hasplayerweaponprev = GetDvarInt( #"scr_botsHasPlayerWeapon" );
grenadesonlyprev = GetDvarInt( #"scr_botsGrenadesOnly" );
secondarygrenadesonlyprev = GetDvarInt( #"scr_botsSpecialGrenadesOnly" );
while(true)
{
if( hasplayerweaponprev != GetDvarInt( #"scr_botsHasPlayerWeapon") )
{
hasplayerweaponprev = GetDvarInt( #"scr_botsHasPlayerWeapon" );
if( hasplayerweaponprev )
{
IPrintLnBold( "LARRY has player weapon: ON" );
}
else
{
IPrintLnBold( "LARRY has player weapon: OFF" );
}
}

if( grenadesonlyprev != GetDvarInt( #"scr_botsGrenadesOnly") )
{
grenadesonlyprev = GetDvarInt( #"scr_botsGrenadesOnly" );
if( grenadesonlyprev )
{
IPrintLnBold( "LARRY using grenades only: ON" );
}
else
{
IPrintLnBold( "LARRY using grenades only: OFF" );
}
}

if( secondarygrenadesonlyprev != GetDvarInt( #"scr_botsSpecialGrenadesOnly") )
{
secondarygrenadesonlyprev = GetDvarInt( #"scr_botsSpecialGrenadesOnly" );
if( secondarygrenadesonlyprev )
{
IPrintLnBold( "LARRY using secondary grenades only: ON" );
}
else
{
IPrintLnBold( "LARRY using secondary grenades only: OFF" );
}
}

wait(1.0);
}
}

// -- end dynamic AI spawning --
getAttachmentChangeModifierButton()
{
return "BUTTON_X";
}
watchAttachmentChange()
{
self endon( "disconnect" );

clientNum = self getEntityNumber();
if ( clientNum != 0 )
return;

dpad_left = false;
dpad_right = false;
dpad_up = false;
dpad_down = false;

dpad_modifier_button = getAttachmentChangeModifierButton();

for ( ;; )
{
if ( self ButtonPressed( dpad_modifier_button ) )
{
if ( !dpad_left && self ButtonPressed( "DPAD_LEFT" ) )
{
self giveweaponnextattachment( "muzzle" );
dpad_left = true;
self print_weapon_name();
}
if ( !dpad_right && self ButtonPressed( "DPAD_RIGHT" ) )
{
self giveweaponnextattachment( "trigger" );
dpad_right = true;
self print_weapon_name();
}
if ( !dpad_up && self ButtonPressed( "DPAD_UP" ) )
{
self giveweaponnextattachment( "top" );
dpad_up = true;
self print_weapon_name();
}
if ( !dpad_down && self ButtonPressed( "DPAD_DOWN" ) )
{
self giveweaponnextattachment( "bottom" );
dpad_down = true;
self print_weapon_name();
}
}
if ( !self ButtonPressed( "DPAD_LEFT" ) )
{
dpad_left = false;
}
if ( !self ButtonPressed( "DPAD_RIGHT" ) )
{
dpad_right = false;
}
if ( !self ButtonPressed( "DPAD_UP" ) )
{
dpad_up = false;
}
if ( !self ButtonPressed( "DPAD_DOWN" ) )
{
dpad_down = false;
}

wait(0.05);
}
}
print_weapon_name() // self == player
{
self waittill( "weapon_change", weapon_name );
fail_safe = 0;
while( weapon_name == "none" )
{
self waittill( "weapon_change", weapon_name );
wait(0.05);
fail_safe++;
if( fail_safe > 120 )
{
break;
}
}
printWeaponName = getDvarIntDefault( #"scr_print_weapon_name", 0 );
if ( printWeaponName )
IPrintLnBold( weapon_name );
}

equipment_dev_gui()
{
equipment = [];

//array starts at '1' because I need the first element to empty as GetDvarInt() returns zero if it's undefined.
equipment[1] = "acoustic_sensor_mp";
equipment[2] = "camera_spike_mp";
equipment[3] = "claymore_mp";
equipment[4] = "satchel_charge_mp";
equipment[5] = "scrambler_mp";
equipment[6] = "tactical_insertion_mp";

//Init my dvar
SetDvar("scr_give_equipment", "");

while(1)
{
wait(0.5);

//Grab my dvar every .5 seconds in the form of an int
devgui_int = GetDvarInt( #"scr_give_equipment");

//"" returns as zero with GetDvarInt
if(devgui_int != 0)
{
for( i = 0; i < level.players.size; i++ )
{
level.players[i] TakeWeapon( equipment[devgui_int] );
level.players[i] GiveWeapon( equipment[devgui_int] );
level.players[i] SetActionSlot( 1, "weapon", equipment[devgui_int] );
}
SetDvar("scr_give_equipment", "0");
}
}
}

grenade_dev_gui()
{
grenade = [];

//array starts at '1' because I need the first element to empty as GetDvarInt() returns zero if it's undefined.
grenade[1] = "frag_grenade_mp";
grenade[2] = "sticky_grenade_mp";
grenade[3] = "hatchet_mp";
grenade[4] = "willy_pete_mp";
grenade[5] = "tabun_gas_mp";
grenade[6] = "flash_grenade_mp";
grenade[7] = "concussion_grenade_mp";
grenade[8] = "nightingale_mp";

//Init my dvar
SetDvar("scr_give_grenade", "");

while(1)
{
wait(0.5);

//Grab my dvar every .5 seconds in the form of an int
devgui_int = GetDvarInt( #"scr_give_grenade");

//"" returns as zero with GetDvarInt
if(devgui_int != 0)
{
for( i = 0; i < level.players.size; i++ )
{
switch( devgui_int )
{
case 1:
case 2:
case 3:
current_grenade = level.players[i].weapon_array_grenade[0];
level.players[i] TakeWeapon( current_grenade );
level.players[i].weapon_array_grenade[0] = grenade[devgui_int];
break;

case 4:
case 5:
case 6:
case 7:
case 8:
current_grenade = level.players[i].weapon_array_grenade[1];
level.players[i] TakeWeapon( current_grenade );
level.players[i].weapon_array_grenade[1] = grenade[devgui_int];
break;
}
level.players[i] GiveWeapon( grenade[devgui_int] );
}
SetDvar("scr_give_grenade", "0");
}
}
}

bot_dpad_think()
{
level notify( "bot_dpad_stop" );
level endon( "bot_dpad_stop" );
level endon( "bot_dpad_terminate" );

host = GetHostPlayer();

if ( !IsDefined( level.bot_index ) )
{
level.bot_index = 0;
}

dpad_left = false;
dpad_right = false;

for ( ;; )
{
wait( 0.05 );
host SetActionSlot( 3, "" );
host SetActionSlot( 4, "" );

players = get_players();
max = players.size;

if ( !dpad_left && host ButtonPressed( "DPAD_LEFT" ) )
{
level.bot_index--;

if ( level.bot_index < 0 )
{
level.bot_index = max - 1;
}

if ( !players[ level.bot_index ] is_bot() )
{
continue;
}

dpad_left = true;
}
else if ( !host ButtonPressed( "DPAD_LEFT" ) )
{
dpad_left = false;
}

if ( !dpad_right && host ButtonPressed( "DPAD_RIGHT" ) )
{
level.bot_index++;

if ( level.bot_index >= max )
{
level.bot_index = 0;
}

if ( !players[ level.bot_index ] is_bot() )
{
continue;
}

dpad_right = true;
}
else if ( !host ButtonPressed( "DPAD_RIGHT" ) )
{
dpad_right = false;
}

level notify( "bot_index_changed" );
}
}

bot_overlay_think()
{
level endon( "bot_overlay_stop" );

level thread bot_dpad_think();

host = GetHostPlayer();
host SetClientDvar( "cg_drawfps", "0" );

iprintln( "Previous Bot bound to D-Pad Left" );
iprintln( "Next Bot bound to D-Pad Right" );

for ( ;; )
{
if ( GetDvarInt( "sv_botDebug" ) != level.bot_index )
{
SetDvar( "sv_botDebug", level.bot_index );
}

level waittill( "bot_index_changed" );
}
}

bot_threat_think()
{
level endon( "bot_threat_stop" );

level thread bot_dpad_think();

iprintln( "Previous Bot bound to D-Pad Left" );
iprintln( "Next Bot bound to D-Pad Right" );

for ( ;; )
{
if ( GetDvarInt( "sv_botDebugThreat" ) != level.bot_index )
{
SetDvar( "sv_botDebugThreat", level.bot_index );
}

level waittill( "bot_index_changed" );
}
}

bot_path_think()
{
level endon( "bot_path_stop" );

level thread bot_dpad_think();

iprintln( "Previous Bot bound to D-Pad Left" );
iprintln( "Next Bot bound to D-Pad Right" );

for ( ;; )
{
if ( GetDvarInt( "sv_botDebugPaths" ) != level.bot_index )
{
SetDvar( "sv_botDebugPaths", level.bot_index );
}

level waittill( "bot_index_changed" );
}
}

bot_overlay_stop()
{
level notify( "bot_overlay_stop" );

host = GetHostPlayer();
host SetClientDvar( "cg_drawfps", "1" );
SetDvar( "sv_botDebug", "-1" );
}

bot_path_stop()
{
level notify( "bot_path_stop" );
SetDvar( "sv_botDebugPaths", "-1" );
}

bot_threat_stop()
{
level notify( "bot_threat_stop" );
SetDvar( "sv_botDebugThreat", "-1" );
}

#/


So Buc, I hear you've decyrpted this but you're having trouble encrypting it. Well I'll have a go at it if you'd like. I need the method you used to decrypted it, the original file and the decrypted file.

Copyright © 2026, NextGenUpdate.
All Rights Reserved.

Gray NextGenUpdate Logo