#using scripts\codescripts\struct; #using scripts\shared\array_shared; #using scripts\shared\flag_shared; #using scripts\shared\callbacks_shared; #using scripts\shared\dev_shared; #using scripts\shared\killstreaks_shared; #using scripts\shared\load_shared; #using scripts\shared\system_shared; #using scripts\shared\util_shared; #using scripts\shared\weapons_shared; #using scripts\shared\weapons\_weapons; #using scripts\shared\vehicle_ai_shared; #using scripts\shared\vehicle_shared; #using scripts\mp\_vehicle; #using scripts\mp\killstreaks\_killstreaks; #using scripts\shared\bots\_bot; /# #namespace devgui; function autoexec __init__sytem__() { system::register("devgui",&__init__,undefined,undefined); } function __init__() { SetDvar( "mp_weap_devgui", "" ); SetDvar( "debug_center_screen", 0 ); SetDvar( "mp_lockspawn_command_devgui", 0 ); SetDvar( "mp_weap_use_give_console_command_devgui", 0 ); SetDvar( "mp_weap_asset_name_display_devgui", 0 ); SetDvar( "mp_weap_attachment_cosmetic_variant_index_devgui", 0 ); SetDvar( "mp_weap_attachment_cosmetic_variant_attachment_1_devgui", "none" ); SetDvar( "mp_weap_attachment_cosmetic_variant_attachment_2_devgui", "none" ); SetDvar( "mp_attachment_cycling_state_devgui", "none" ); SetDvar( "mp_attachment_cycling_1_devgui", "none" ); SetDvar( "mp_attachment_cycling_2_devgui", "none" ); SetDvar( "mp_attachment_cycling_3_devgui", "none" ); SetDvar( "mp_attachment_cycling_4_devgui", "none" ); SetDvar( "mp_attachment_cycling_5_devgui", "none" ); SetDvar( "mp_attachment_cycling_6_devgui", "none" ); level.attachment_cycling_dvars = []; level.attachment_cycling_dvars[level.attachment_cycling_dvars.size] = "mp_attachment_cycling_1_devgui"; level.attachment_cycling_dvars[level.attachment_cycling_dvars.size] = "mp_attachment_cycling_2_devgui"; level.attachment_cycling_dvars[level.attachment_cycling_dvars.size] = "mp_attachment_cycling_3_devgui"; level.attachment_cycling_dvars[level.attachment_cycling_dvars.size] = "mp_attachment_cycling_4_devgui"; level.attachment_cycling_dvars[level.attachment_cycling_dvars.size] = "mp_attachment_cycling_5_devgui"; level.attachment_cycling_dvars[level.attachment_cycling_dvars.size] = "mp_attachment_cycling_6_devgui"; SetDvar( "mp_acv_cycling_1_devgui", 0 ); SetDvar( "mp_acv_cycling_2_devgui", 0 ); SetDvar( "mp_acv_cycling_3_devgui", 0 ); SetDvar( "mp_acv_cycling_4_devgui", 0 ); SetDvar( "mp_acv_cycling_5_devgui", 0 ); SetDvar( "mp_acv_cycling_6_devgui", 0 ); level.acv_cycling_dvars = []; level.acv_cycling_dvars[level.acv_cycling_dvars.size] = "mp_acv_cycling_1_devgui"; level.acv_cycling_dvars[level.acv_cycling_dvars.size] = "mp_acv_cycling_2_devgui"; level.acv_cycling_dvars[level.acv_cycling_dvars.size] = "mp_acv_cycling_3_devgui"; level.acv_cycling_dvars[level.acv_cycling_dvars.size] = "mp_acv_cycling_4_devgui"; level.acv_cycling_dvars[level.acv_cycling_dvars.size] = "mp_acv_cycling_5_devgui"; level.acv_cycling_dvars[level.acv_cycling_dvars.size] = "mp_acv_cycling_6_devgui"; level thread devgui_weapon_think(); level thread devgui_weapon_asset_name_display_think(); level thread devgui_player_weapons(); level thread devgui_test_chart_think(); level thread devgui_player_spawn_think(); level thread devgui_vehicle_spawn_think(); // center lines for making sure the gun aims properly thread init_debug_center_screen(); level thread dev::body_customization_devgui( 1 ); callback::on_connect( &hero_art_on_player_connect ); callback::on_connect( &on_player_connect ); } function on_player_connect() { /# self.devguiLockSpawn = false; self thread devgui_player_spawn(); #/ } function devgui_player_spawn() { wait(1); player_devgui_base_mp = "devgui_cmd \"Player/Lock Spawn/"; {wait(.05);}; // so we don't overflow the Cbuf_InsertText() players = GetPlayers(); foreach( player in players ) { if ( player != self ) continue; temp = player_devgui_base_mp + player.playername + "\" \"set " + "mp_lockspawn_command_devgui" + " " + player.playername + "\"\n"; AddDebugCommand( player_devgui_base_mp + player.playername + "\" \"set " + "mp_lockspawn_command_devgui" + " " + player.playername + "\"\n"); } } function devgui_player_spawn_think() { for ( ;; ) { playername = GetDvarString( "mp_lockspawn_command_devgui" ); if (playername=="") { {wait(.05);}; continue; } players = GetPlayers(); foreach( player in players ) { if ( player.playername != playername ) continue; player.devguiLockSpawn = !player.devguiLockSpawn; if ( player.devguiLockSpawn ) { player.resurrect_origin = player.origin; player.resurrect_angles = player.angles; } } SetDvar( "mp_lockspawn_command_devgui", "" ); wait( 0.5 ); } } function devgui_vehicle_spawn_think() { {wait(.05);}; for( ;; ) { val = GetDvarInt( "scr_spawnvehicle" ); if( val != 0 ) { if( val == 1 ) add_vehicle_at_eye_trace( "siegebot" ); else if( val == 2 ) add_vehicle_at_eye_trace( "siegebot_boss" ); else if( val == 3 ) add_vehicle_at_eye_trace( "quadtank" ); else if( val == 4 ) add_vehicle_at_eye_trace( "mechtank" ); SetDvar( "scr_spawnvehicle", "0" ); } {wait(.05);}; } } function devgui_player_weapons() { if ( ( isdefined( game["devgui_weapons_added"] ) && game["devgui_weapons_added"] ) ) { return; } level flag::wait_till("all_players_spawned" ); a_weapons = EnumerateWeapons( "weapon" ); a_weapons_mp = []; a_grenades_mp = []; a_misc_mp = []; // For misc weapons not in statstable for ( i = 0; i < a_weapons.size; i++ ) { if ( ( weapons::is_primary_weapon( a_weapons[i] ) || weapons::is_side_arm( a_weapons[i] ) ) && !killstreaks::is_killstreak_weapon( a_weapons[i] ) ) { ArrayInsert( a_weapons_mp, a_weapons[i], 0 ); } else if ( weapons::is_grenade( a_weapons[i] ) ) { ArrayInsert( a_grenades_mp, a_weapons[i], 0 ); } else { ArrayInsert( a_misc_mp, a_weapons[i], 0 ); } } player_devgui_base_mp = "devgui_cmd \"Player/Weapons/"; menu_index = 1; // *** T8 INTEGRATION ***: do NOT integrate; T8 has better solution level thread devgui_add_player_weapons( player_devgui_base_mp, "All", 0, a_weapons_mp, "Guns", menu_index ); menu_index++; // *** T8 INTEGRATION ***: do NOT integrate; T8 has better solution level thread devgui_add_player_weapons( player_devgui_base_mp, "All", 0, a_grenades_mp, "Grenades", menu_index ); menu_index++; // *** T8 INTEGRATION ***: do NOT integrate; T8 has better solution level thread devgui_add_player_weapons( player_devgui_base_mp, "All", 0, a_misc_mp, "Misc", menu_index ); menu_index++; game["devgui_weapons_added"] = true; {wait(.05);}; // so we don't overflow the Cbuf_InsertText() AddDebugCommand( player_devgui_base_mp + "Toggle Use Give Cmd" + "\" \"toggle " + "mp_weap_use_give_console_command_devgui" + " 1 0\" \n"); menu_index++; AddDebugCommand( player_devgui_base_mp + "Toggle Debug Center Screen" + "\" \"toggle " + "debug_center_screen" + " 1 0\" \n"); menu_index++; AddDebugCommand( player_devgui_base_mp + "Toggle Weapon Asset Name Display" + "\" \"toggle " + "mp_weap_asset_name_display_devgui" + " 1 0\" \n"); menu_index++; acv_devgui_base_mp = player_devgui_base_mp + "Cosmetic Variants" + "/"; menu_index++; acv_menu_index = 1; acv_sub_menu_index = 1; for ( i = 0; i <= 3; i++ ) { AddDebugCommand( acv_devgui_base_mp + "Variant Index" + "/" + i + "\" \"set " + "mp_weap_attachment_cosmetic_variant_index_devgui" + " " + i + "\" \n"); acv_sub_menu_index++; } acv_menu_index++; attachmentNames = GetAttachmentNames(); acv_sub_menu_index = 1; for ( i = 0; i < attachmentNames.size; i++ ) { if ( IsSubStr( attachmentNames[i], "gmod" ) ) { continue; } // *** T8 INTEGRATION ***: do NOT integrate; T8 has better solution devgui_wait(); AddDebugCommand( acv_devgui_base_mp + "Attachment 1" + "/" + attachmentNames[i] + "\" \"set " + "mp_weap_attachment_cosmetic_variant_attachment_1_devgui" + " " + attachmentNames[i] + "\" \n"); acv_sub_menu_index++; } acv_menu_index++; acv_sub_menu_index = 1; for ( i = 0; i < attachmentNames.size; i++ ) { if ( IsSubStr( attachmentNames[i], "gmod" ) ) { continue; } // *** T8 INTEGRATION ***: do NOT integrate; T8 has better solution devgui_wait(); AddDebugCommand( acv_devgui_base_mp + "Attachment 2" + "/" + attachmentNames[i] + "\" \"set " + "mp_weap_attachment_cosmetic_variant_attachment_2_devgui" + " " + attachmentNames[i] + "\" \n"); acv_sub_menu_index++; } acv_menu_index++; {wait(.05);}; // so we don't overflow the Cbuf_InsertText() attachment_cycling_devgui_base_mp = player_devgui_base_mp + "Attachment Cycling" + "/"; AddDebugCommand( attachment_cycling_devgui_base_mp + "Clear All\" \"set " + "mp_attachment_cycling_state_devgui" + " clear all\" \n"); AddDebugCommand( attachment_cycling_devgui_base_mp + "Reapply\" \"set " + "mp_attachment_cycling_state_devgui" + " update\" \n"); for ( i = 0; i < 6; i++ ) { attachment_cycling_sub_menu_index = 1; AddDebugCommand( attachment_cycling_devgui_base_mp + "Attachment " + (i + 1) + "/Clear:1\" \"set " + "mp_attachment_cycling_state_devgui" + " clear " + i + "\" \n"); for ( attachmentName = 0; attachmentName < attachmentNames.size; attachmentName++ ) { if ( IsSubStr( attachmentNames[attachmentName], "gmod" ) ) { continue; } // *** T8 INTEGRATION ***: do NOT integrate; T8 has better solution devgui_wait(); AddDebugCommand( attachment_cycling_devgui_base_mp + "Attachment " + (i + 1) + "/" + attachmentNames[attachmentName] + "\" \"set " + "mp_attachment_cycling_state_devgui" + " update; set " + level.attachment_cycling_dvars[i] + " " + attachmentNames[attachmentName] + "; set " + level.acv_cycling_dvars[i] + " " + 0 + "\" \n"); attachment_cycling_sub_menu_index++; AddDebugCommand( attachment_cycling_devgui_base_mp + "Attachment " + (i + 1) + "/" + attachmentNames[attachmentName] + " Variant 1\" \"set " + "mp_attachment_cycling_state_devgui" + " update; set " + level.attachment_cycling_dvars[i] + " " + attachmentNames[attachmentName] + "; set " + level.acv_cycling_dvars[i] + " " + 1 + "\" \n"); attachment_cycling_sub_menu_index++; } } level thread devgui_attachment_cosmetic_variant_think(); level thread devgui_attachment_cycling_think(); } function devgui_add_player_weapons( root, pname, index, a_weapons, weapon_type, mindex ) { if( isDedicated() ) { return; } devgui_root = root + weapon_type + "/"; if ( IsDefined( a_weapons ) ) { for ( i = 0; i < a_weapons.size; i++ ) { attachments = a_weapons[i].supportedAttachments; name = a_weapons[i].name; if ( attachments.size ) { devgui_add_player_weap_command( devgui_root + name + "/", index, name, i + 1 ); foreach( att in attachments ) { if ( att != "none" ) { devgui_add_player_weap_command( devgui_root + name + "/", index, name + "+" + att, i + 1 ); } } } else { devgui_add_player_weap_command( devgui_root, index, name, i + 1 ); } {wait(.05);}; } } } // *** T8 INTEGRATION ***: do NOT integrate; T8 has better solution function devgui_wait() { if(!isdefined(level.devgui_add_count))level.devgui_add_count=0; // prevent input buffer overflow level.devgui_add_count++; if ( level.devgui_add_count % 10 == 0 ) wait RandomIntRange( 2, 5 ) * .05; } function devgui_add_player_weap_command( root, pid, weap_name, cmdindex ) { // *** T8 INTEGRATION ***: do NOT integrate; T8 has better solution devgui_wait(); AddDebugCommand( root + weap_name+"\" \"set "+"mp_weap_devgui"+" "+weap_name+"\" \n"); } function devgui_weapon_think() { for ( ;; ) { weapon_name = GetDvarString( "mp_weap_devgui" ); if ( weapon_name != "" ) { devgui_handle_player_command( &devgui_give_weapon, weapon_name ); } SetDvar( "mp_weap_devgui", "" ); wait( 0.5 ); } } function hero_art_on_player_connect() { self._debugHeroModels = SpawnStruct(); } function devgui_weapon_asset_name_display_think() { update_time = 1; print_duration = Int( update_time / .05 ); printlnbold_update = Int( 1 / update_time ); printlnbold_counter = 0; colors = []; colors[colors.size] = (1, 1, 1); colors[colors.size] = (1, 0, 0); colors[colors.size] = (0, 1, 0); colors[colors.size] = (1, 1, 0); colors[colors.size] = (1, 0, 1); colors[colors.size] = (0, 1, 1); for ( ;; ) { wait( update_time ); display = GetDvarInt( "mp_weap_asset_name_display_devgui" ); if ( !display ) { continue; } if ( !printlnbold_counter ) { iPrintLnBold( level.players[0] GetCurrentWeapon().name ); } printlnbold_counter++; if ( printlnbold_counter >= printlnbold_update ) { printlnbold_counter = 0; } color_index = 0; for ( i = 1; i < level.players.size; i++ ) { player = level.players[i]; weapon = player GetCurrentWeapon(); if ( !IsDefined( weapon ) || level.weaponNone == weapon ) { continue; } Print3D( player GetTagOrigin( "tag_flash" ), weapon.name, colors[color_index], 1, 0.15, print_duration ); color_index++; if ( color_index >= colors.size ) { color_index = 0; } } color_index = 0; ai_list = GetAIArray(); for ( i = 0; i < ai_list.size; i++ ) { ai = ai_list[i]; if ( IsVehicle( ai ) ) { weapon = ai.turretweapon; } else { weapon = ai.weapon; } if ( !IsDefined( weapon ) || level.weaponNone == weapon ) { continue; } Print3D( ai GetTagOrigin( "tag_flash" ), weapon.name, colors[color_index], 1, 0.15, print_duration ); color_index++; if ( color_index >= colors.size ) { color_index = 0; } } } } function devgui_attachment_cosmetic_variant_think() { old_index = 0; old_attachment_1 = "none"; old_attachment_2 = "none"; for ( ;; ) { index = GetDvarInt( "mp_weap_attachment_cosmetic_variant_index_devgui" ); attachment_1 = GetDvarString( "mp_weap_attachment_cosmetic_variant_attachment_1_devgui" ); attachment_2 = GetDvarString( "mp_weap_attachment_cosmetic_variant_attachment_2_devgui" ); if ( old_attachment_1 != attachment_1 || old_attachment_2 != attachment_2 || old_index != index ) { devgui_handle_player_command( &devgui_update_attachment_cosmetic_variant, attachment_1, attachment_2 ); } old_index = index; old_attachment_1 = attachment_1; old_attachment_2 = attachment_2; wait( 0.5 ); } } function devgui_attachment_cycling_clear( index ) { SetDvar( level.attachment_cycling_dvars[index], "none" ); SetDvar( level.acv_cycling_dvars[index], 0 ); } function devgui_attachment_cycling_update() { currentWeapon = self GetCurrentWeapon(); rootweapon = currentWeapon.rootweapon; supportedAttachments = currentWeapon.supportedattachments; textColors = []; attachments = []; acvs = []; originalAttachments = []; originalAcvs = []; for ( i = 0; i < 6; i++ ) { originalAttachments[i] = GetDvarString( level.attachment_cycling_dvars[i] ); originalAcvs[i] = GetDvarInt( level.acv_cycling_dvars[i] ); textColor[i] = "^7"; attachments[i] = "none"; acvs[i] = 0; name = originalAttachments[i]; if ( "none" == name ) { continue; } textColor[i] = "^1"; for ( supportedIndex = 0; supportedIndex < supportedAttachments.size; supportedIndex++ ) { if ( name == supportedAttachments[supportedIndex] ) { textColor[i] = "^7"; attachments[i] = name; acvs[i] = originalAcvs[i]; break; } } } for ( i = 0; i < 6; i++ ) { if ( "none" == originalAttachments[i] ) { continue; } for ( j = i + 1; j < 6; j++ ) { if ( originalAttachments[i] == originalAttachments[j] ) { textColor[j] = "^6"; attachments[j] = "none"; acvs[j] = 0; } } } msg = ""; for ( i = 0; i < 6; i++ ) { if ( "none" == originalAttachments[i] ) { continue; } msg += textColor[i]; msg += i; msg += ": "; msg += originalAttachments[i]; msg += ", "; msg += originalAcvs[i]; msg += ", "; } IPrintLnBold( msg ); self TakeWeapon( currentWeapon ); currentWeapon = GetWeapon( rootweapon.name, attachments[0], attachments[1], attachments[2], attachments[3], attachments[4], attachments[5] ); acvi = GetAttachmentCosmeticVariantIndexes( currentWeapon, attachments[0], acvs[0], attachments[1], acvs[1], attachments[2], acvs[2], attachments[3], acvs[3], attachments[4], acvs[4], attachments[5], acvs[5] ); wait( 0.25 ); // wait a little bit so that the weapon viewmodel will rebuild self GiveWeapon( currentWeapon, undefined, acvi ); self SwitchToWeapon( currentWeapon ); } function devgui_attachment_cycling_think() { for ( ;; ) { state = GetDvarString( "mp_attachment_cycling_state_devgui" ); SetDvar( "mp_attachment_cycling_state_devgui", "none" ); if ( IsSubStr( state, "clear " ) ) { if ( "clear all" == state ) { for ( i = 0; i < 6; i++ ) { devgui_attachment_cycling_clear( i ); } } else { index = Int( GetSubStr( state, 6, 7 ) ); devgui_attachment_cycling_clear( index ); } state = "update"; } if ( "update" == state ) { array::thread_all( GetPlayers(), &devgui_attachment_cycling_update ); } wait( 0.5 ); } } function devgui_test_chart_think() { {wait(.05);}; // wait to get 0 initially old_val = GetDvarInt( "scr_debug_test_chart" ); for ( ;; ) { val = GetDvarInt( "scr_debug_test_chart" ); if ( old_val != val ) { if ( IsDefined( level.test_chart_model ) ) { level.test_chart_model delete(); level.test_chart_model = undefined; } if ( val ) { player = GetPlayers()[0]; direction = player GetPlayerAngles(); direction_vec = AnglesToForward( (0, direction[1], 0) ); // only want the player's yaw scale = 120; direction_vec = (direction_vec[0] * scale, direction_vec[1] * scale, direction_vec[2] * scale); level.test_chart_model = Spawn( "script_model", player GetEye() + direction_vec ); level.test_chart_model SetModel( "test_chart_model" ); level.test_chart_model.angles = (0, direction[1], 0) + (0, 90, 0); // only want the yaw } } old_val = val; {wait(.05);}; } } function devgui_give_weapon( weapon_name ) { assert( IsDefined( self ) ); assert( IsPlayer( self ) ); assert( IsAlive( self ) ); self notify( "devgui_give_ammo" ); self endon( "devgui_give_ammo" ); currentWeapon = self GetCurrentWeapon(); split = StrTok( weapon_name, "+" ); switch ( split.size ) { default: case 1: weapon = GetWeapon( split[0] ); break; case 2: weapon = GetWeapon( split[0], split[1] ); break; case 3: weapon = GetWeapon( split[0], split[1], split[2] ); break; case 4: weapon = GetWeapon( split[0], split[1], split[2], split[3] ); break; case 5: weapon = GetWeapon( split[0], split[1], split[2], split[3], split[4] ); break; } if ( currentWeapon != weapon ) { // if the player already has 2 grenades, take one away if ( weapon.isGrenadeWeapon ) { grenades = 0; pweapons = self GetWeaponsList(); foreach( pweapon in pweapons ) { if ( pweapon!=weapon && pweapon.isGrenadeWeapon ) { grenades++; } } if ( grenades > 1 ) { foreach( pweapon in pweapons ) { if ( pweapon!=weapon && pweapon.isGrenadeWeapon ) { grenades--; self TakeWeapon(pweapon); if ( grenades < 2 ) break; } } } } if ( GetDvarInt( "mp_weap_use_give_console_command_devgui" ) ) { AddDebugCommand( "give " + weapon_name ); {wait(.05);}; // wait a frame to let the command take } else { self GiveWeapon( weapon ); if ( !weapon.isGrenadeWeapon ) self SwitchToWeapon( weapon ); } max = weapon.maxAmmo; if ( max ) { self SetWeaponAmmoStock( weapon, max ); } } } function devgui_update_attachment_cosmetic_variant( attachment_1, attachment_2 ) { assert( IsDefined( self ) ); assert( IsPlayer( self ) ); assert( IsAlive( self ) ); currentWeapon = self GetCurrentWeapon(); variant_index = GetDvarInt( "mp_weap_attachment_cosmetic_variant_index_devgui" ); acvi = GetAttachmentCosmeticVariantIndexes( currentWeapon, attachment_1, variant_index, attachment_2, variant_index ); self TakeWeapon( currentWeapon ); wait( 0.25 ); // wait a little bit so that the weapon viewmodel will rebuild self GiveWeapon( currentWeapon, undefined, acvi ); self SwitchToWeapon( currentWeapon ); } function devgui_handle_player_command( playercallback, pcb_param_1, pcb_param_2 ) { pid = GetDvarInt( "mp_weap_devgui" ); if (pid>0) { player = GetPlayers()[pid-1]; if (IsDefined(player)) { if (IsDefined( pcb_param_2 )) player thread [[playercallback]]( pcb_param_1, pcb_param_2 ); else if (IsDefined( pcb_param_1 )) player thread [[playercallback]]( pcb_param_1 ); else player thread [[playercallback]](); } } else { array::thread_all( GetPlayers(), playercallback, pcb_param_1, pcb_param_2 ); } SetDvar( "mp_weap_devgui", "-1" ); } // *** Debug the Center of the Screen *** // Allows you to draw a large crosshair in the center of the screen by pressing in both sticks at once function init_debug_center_screen() { zero_idle_movement = "0"; for (;;) { if( GetDvarInt( "debug_center_screen" ) ) { if (!isdefined (level.center_screen_debug_hudelem_active) || level.center_screen_debug_hudelem_active == false) { thread debug_center_screen(); zero_idle_movement = GetDvarString( "zero_idle_movement" ); if( isdefined( zero_idle_movement ) && zero_idle_movement == "0" ) { SetDvar( "zero_idle_movement", "1" ); zero_idle_movement = "1"; } } } else { level notify ("stop center screen debug"); if( zero_idle_movement == "1" ) { SetDvar( "zero_idle_movement", "0" ); zero_idle_movement = "0"; } } wait (0.05); } } // draws the center screen debug marker function debug_center_screen() { level.center_screen_debug_hudelem_active = true; wait 0.1; level.center_screen_debug_hudelem1 = newclienthudelem ( level.players[0] ); level.center_screen_debug_hudelem1.alignX = "center"; level.center_screen_debug_hudelem1.alignY = "middle"; level.center_screen_debug_hudelem1.fontScale = 1; level.center_screen_debug_hudelem1.alpha = 0.5; level.center_screen_debug_hudelem1.x = (640/2) - 1; level.center_screen_debug_hudelem1.y = (480/2); level.center_screen_debug_hudelem1 setshader("white", 1000, 1); level.center_screen_debug_hudelem2 = newclienthudelem ( level.players[0] ); level.center_screen_debug_hudelem2.alignX = "center"; level.center_screen_debug_hudelem2.alignY = "middle"; level.center_screen_debug_hudelem2.fontScale = 1; level.center_screen_debug_hudelem2.alpha = 0.5; level.center_screen_debug_hudelem2.x = (640/2) - 1; level.center_screen_debug_hudelem2.y = (480/2); level.center_screen_debug_hudelem2 setshader("white", 1, 480); level waittill ("stop center screen debug"); level.center_screen_debug_hudelem1 destroy(); level.center_screen_debug_hudelem2 destroy(); level.center_screen_debug_hudelem_active = false; } function add_vehicle_at_eye_trace( vehicleName ) { host = util::getHostPlayer(); trace = host bot::eye_trace(); //vehicle = SpawnVehicle( vehicleName, trace[ "position" ] + ( 0, 0, 20 ) , ( 0, 0, 0 ), "test_siege" ); veh_spawner = GetEnt( vehicleName + "_spawner", "targetname" ); vehicle = veh_spawner SpawnFromSpawner( vehicleName, true, true, true ); if( isdefined( vehicle.archetype ) ) vehicle ASMRequestSubstate( "locomotion@movement" ); {wait(.05);}; vehicle.origin = trace[ "position" ]; vehicle thread vehicle::VehicleTeamThread(); vehicle thread watch_player_death(); return vehicle; } function watch_player_death() { self endon( "death" ); vehicle = self; while( 1 ) { driver = self GetSeatOccupant( 0 ); if( isdefined( driver ) && !IsAlive( driver ) ) driver unlink(); {wait(.05);}; } } #/