#include maps\_utility; #include common_scripts\utility; debugchains() { nodes = getallnodes(); fnodenum = 0; fnodes = []; for( i=0;i 0 ) ) || (( isdefined( nodes[ i ].targetname ) ) &&(( getnodearray( nodes[ i ].targetname, "target" ) ).size > 0 ) ) ) ) { fnodes[ fnodenum ] = nodes[ i ]; fnodenum++; } } count = 0; while( 1 ) { if( GetDvar( #"chain" ) == "1" ) { for( i=0;i= corners.size ) { break; } corners[ i ] thread coverTest(); covered++; } if( corners.size <= 30 ) { return; } for( ;; ) { level waittill( "debug_next_corner" ); if( covered >= corners.size ) { covered = 0; } corners[ covered ] thread coverTest(); covered++; } } coverTest() { coverSetupAnim(); } #using_animtree( "generic_human" ); coverSetupAnim() { spawn = undefined; spawner = undefined; for( ;; ) { for( i=0;i 250 ) { continue; } nearActive = true; break; } if( nearActive ) { continue; } completed = false; for( p=0;p 256 ) { continue; } cameraWithEnemy[ cameraWithEnemy.size ] = cameras[ i ]; break; } } if( !cameraWithEnemy.size ) { freePlayer(); wait( 0.5 ); continue; } cameraWithPlayer = []; for( i=0;i dist ) { continue; } newcam = cameraWithPlayer[ i ]; dist = newdist; } setPlayerToCamera( newcam ); wait( 3 ); } } freePlayer() { setdvar( "cl_freemove", "0" ); } setPlayerToCamera( camera ) { setdvar( "cl_freemove", "2" ); setdebugangles( camera.angles ); setdebugorigin( camera.origin +( 0, 0, -60 ) ); } deathspawnerPreview() { waittillframeend; for( i=0;i<50;i++ ) { if( !isdefined( level.deathspawnerents[ i ] ) ) { continue; } array = level.deathspawnerents[ i ]; for( p=0;p 0 ) { level.minimapheight = minimapheight; players = get_players(); player = players[0]; 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 ); 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 ); origin = spawn( "script_origin", player.origin ); 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; } 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; angleside = 2 * atan( disttoside * .8 / minimapheight ); angletop = 2 * atan( disttotop * aspectratioguess * .8 / minimapheight ); } else { aspectratioguess = 4.0/3.0; angleside = 2 * atan( disttoside * 1.05 / minimapheight ); angletop = 2 * atan( disttotop * aspectratioguess * 1.05 / minimapheight ); } if( angleside > angletop ) { angle = angleside; } else { angle = angletop; } znear = minimapheight - 1000; if( znear < 16 ) { znear = 16; } if( znear > 10000 ) { znear = 10000; } player playerlinktoabsolute( origin ); origin.origin = viewpos +( 0, 0, -62 ); origin.angles =( 90, getnorthyaw(), 0 ); player GiveWeapon( "defaultweapon" ); player setClientDvar( "cg_fov", angle ); level.minimapplayer = player; level.minimaporigin = origin; thread drawMiniMapBounds( viewpos, mincorner, maxcorner ); } else { println( "^1Error: There are not exactly 2 \"minimap_corner\" entities in the level." ); } } } } getchains() { chainarray = []; chainarray = getentarray( "minimap_line", "script_noteworthy" ); array = []; for( i=0;i insidedot ) { return true; } else { return false; } } debug_colornodes() { wait( 0.05 ); ai = getaiarray(); array = []; array[ "axis" ] = []; array[ "allies" ] = []; array[ "neutral" ] = []; for( i=0; i highest ) { highest = keys[ i ]; } } if( highest == -1 ) { return; } if( level.animsound_selected > highest ) { level.animsound_selected = highest; } if( level.animsound_selected < 0 ) { level.animsound_selected = 0; } for( ;; ) { if( isdefined( animsounds[ level.animsound_selected ] ) ) { break; } level.animsound_selected--; if( level.animsound_selected < 0 ) { level.animsound_selected = highest; } } level.animsound_hud_anime.label = "Anim: " + animsounds[ level.animsound_selected ].anime; level.animsound_hud[ level.animsound_selected ].color =( 1, 1, 0 ); level.animsound_hud_timer[ level.animsound_selected ].color =( 1, 1, 0 ); level.animsound_hud_alias[ level.animsound_selected ].color =( 1, 1, 0 ); time = gettime(); for( i=0; i < keys.size; i++ ) { key = keys[ i ]; animsound = animsounds[ key ]; hudelm = level.animsound_hud[ key ]; soundalias = get_alias_from_stored( animSound ); hudelm.label =( key + 1 ) + ". " + animsound.notetrack; hudelm = level.animsound_hud_timer[ key ]; hudelm.label = int(( time -( animsound.end_time - 60000 ) ) * 0.001 ); if( isdefined( soundalias ) ) { hudelm = level.animsound_hud_alias[ key ]; hudelm.label = soundalias; if( !is_from_animsound( animSound.animname, animSound.anime, animSound.notetrack ) ) { hudelm.color =( 0.7, 0.7, 0.7 ); } } } players = get_players(); if( players[0] buttonPressed( "del" ) ) { animsound = animsounds[ level.animsound_selected ]; soundalias = get_alias_from_stored( animsound ); if( !isdefined( soundalias ) ) { return; } if( !is_from_animsound( animSound.animname, animSound.anime, animSound.notetrack ) ) { return; } level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ] = undefined; debug_animSoundSave(); } } get_alias_from_stored( animSound ) { if( !isdefined( level.animSound_aliases[ animSound.animname ] ) ) { return; } if( !isdefined( level.animSound_aliases[ animSound.animname ][ animSound.anime ] ) ) { return; } if( !isdefined( level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ] ) ) { return; } return level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ][ "soundalias" ]; } is_from_animsound( animname, anime, notetrack ) { return isdefined( level.animSound_aliases[ animname ][ anime ][ notetrack ][ "created_by_animSound" ] ); } display_animSound() { players = get_players(); if( distance( players[0].origin, self.origin ) > 1500 ) { return; } level.animSounds_thisframe[ level.animSounds_thisframe.size ] = self; } debug_animSoundTag( tagnum ) { } debug_animSoundTagSelected() { } tag_sound( tag, tagnum ) { if( !isdefined( level.animsound_tagged ) ) { return; } if( !isdefined( level.animsound_tagged.animsounds[ tagnum ] ) ) { return; } animSound = level.animsound_tagged.animsounds[ tagnum ]; soundalias = get_alias_from_stored( animSound ); if( !isdefined( soundalias ) || is_from_animsound( animSound.animname, animSound.anime, animSound.notetrack ) ) { level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ][ "soundalias" ] = tag; level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ][ "created_by_animSound" ] = true; debug_animSoundSave(); } } debug_animSoundSave() { } print_aliases_to_file( file ) { tab = " "; fprintln( file, "#include maps\\_anim;" ); fprintln( file, "main()" ); fprintln( file, "{" ); fprintln( file, tab + "// Autogenerated by AnimSounds. Threaded off so that it can be placed before _load( has to create level.scr_notetrack first )." ); fprintln( file, tab + "thread init_animsounds();" ); fprintln( file, "}" ); fprintln( file, "" ); fprintln( file, "init_animsounds()" ); fprintln( file, "{" ); fprintln( file, tab + "waittillframeend;" ); animnames = getarraykeys( level.animSound_aliases ); for( i=0; i < animnames.size; i++ ) { animes = getarraykeys( level.animSound_aliases[ animnames[ i ] ] ); for( p=0; p < animes.size; p++ ) { anime = animes[ p ]; notetracks = getarraykeys( level.animSound_aliases[ animnames[ i ] ][ anime ] ); for( z=0; z < notetracks.size; z++ ) { notetrack = notetracks[ z ]; if( !is_from_animsound( animnames[ i ], anime, notetrack ) ) { continue; } alias = level.animSound_aliases[ animnames[ i ] ][ anime ][ notetrack ][ "soundalias" ]; if( notetrack == "#" + anime ) { fprintln( file, tab + "addOnStart_animSound( " + tostr( animnames[ i ] ) + ", " + tostr( anime ) + ", " + tostr( alias ) + " ); " ); } else { fprintln( file, tab + "addNotetrack_animSound( " + tostr( animnames[ i ] ) + ", " + tostr( anime ) + ", " + tostr( notetrack ) + ", " + tostr( alias ) + " ); " ); } println( "^1Saved alias ^4" + alias + "^1 to notetrack ^4" + notetrack ); } } } fprintln( file, "}" ); } tostr( str ) { newstr = "\""; for( i=0; i < str.size; i++ ) { if( str[ i ] == "\"" ) { newstr += "\\"; newstr += "\""; continue; } newstr += str[ i ]; } newstr += "\""; return newstr; } drawDebugLineInternal(fromPoint, toPoint, color, durationFrames) { for (i=0;i 0 ) { hud_title.alpha = 1; hud_x.alpha = 1; hud_y.alpha = 1; hud_z.alpha = 1; x = players[0].origin[0]; y = players[0].origin[1]; z = players[0].origin[2]; spacing1 = ( ( 2 + number_before_decimal( x ) ) * 8 ) + 10; spacing2 = ( ( 2 + number_before_decimal( y ) ) * 8 ) + 10; hud_y.x = x_pos + spacing1; hud_z.x = x_pos + spacing1 + spacing2; hud_x SetValue( round_to( x, 100 ) ); hud_y SetValue( round_to( y, 100 ) ); hud_z SetValue( round_to( z, 100 ) ); } else { hud_title.alpha = 0; hud_x.alpha = 0; hud_y.alpha = 0; hud_z.alpha = 0; } wait( 0.5 ); } } number_before_decimal( num ) { abs_num = abs( num ); count = 0; while( 1 ) { abs_num *= 0.1; count += 1; if( abs_num < 1 ) { return count; } } } round_to( val, num ) { return Int( val * num ) / num; } set_event_printname_thread( text, focus ) { } get_playerone() { return get_players()[0]; } engagement_distance_debug_toggle() { } dvar_turned_on( val ) { if( val <= 0 ) { return false; } else { return true; } } engagement_distance_debug_init() { 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 = []; genericPistol = spawnstruct(); genericPistol.engageDistMin = 125; genericPistol.engageDistOptimal = 225; genericPistol.engageDistMulligan = 50; genericPistol.engageDistMax = 400; shotty = spawnstruct(); shotty.engageDistMin = 50; shotty.engageDistOptimal = 200; shotty.engageDistMulligan = 75; shotty.engageDistMax = 350; genericSMG = spawnstruct(); genericSMG.engageDistMin = 100; genericSMG.engageDistOptimal = 275; genericSMG.engageDistMulligan = 100; genericSMG.engageDistMax = 500; genericLMG = spawnstruct(); genericLMG.engageDistMin = 325; genericLMG.engageDistOptimal = 550; genericLMG.engageDistMulligan = 150; genericLMG.engageDistMax = 850; genericRifleSA = spawnstruct(); genericRifleSA.engageDistMin = 325; genericRifleSA.engageDistOptimal = 550; genericRifleSA.engageDistMulligan = 150; genericRifleSA.engageDistMax = 850; genericRifleBolt = spawnstruct(); genericRifleBolt.engageDistMin = 350; genericRifleBolt.engageDistOptimal = 600; genericRifleBolt.engageDistMulligan = 150; genericRifleBolt.engageDistMax = 900; genericHMG = spawnstruct(); genericHMG.engageDistMin = 390; genericHMG.engageDistOptimal = 600; genericHMG.engageDistMulligan = 100; genericHMG.engageDistMax = 900; genericSniper = spawnstruct(); genericSniper.engageDistMin = 950; genericSniper.engageDistOptimal = 1700; genericSniper.engageDistMulligan = 300; genericSniper.engageDistMax = 3000; engage_dists_add( "pistol", genericPistol ); engage_dists_add( "smg", genericSMG ); engage_dists_add( "spread", shotty ); engage_dists_add( "mg", genericHMG ); engage_dists_add( "rifle", genericRifleSA ); engage_dists_add( "springfield_scoped", genericSniper ); engage_dists_add( "type99_rifle_scoped", genericSniper ); engage_dists_add( "mosin_rifle_scoped", genericSniper ); engage_dists_add( "kar98k_scoped", genericSniper ); engage_dists_add( "fg42_scoped", genericSniper ); engage_dists_add( "lee_enfield_scoped", genericSniper ); level thread engage_dists_watcher(); } engage_dists_add( weapontypeStr, values ) { level.engageDists[weapontypeStr] = values; } get_engage_dists( weapontypeStr ) { if( IsDefined( level.engageDists[weapontypeStr] ) ) { return level.engageDists[weapontypeStr]; } else { return undefined; } } engage_dists_watcher() { level endon( "kill_all_engage_dist_debug" ); level endon( "kill_engage_dists_watcher" ); while( 1 ) { player = get_playerone(); playerWeapon = player GetCurrentWeapon(); if( !IsDefined( player.lastweapon ) ) { player.lastweapon = playerWeapon; } else { if( player.lastweapon == playerWeapon ) { wait( 0.05 ); continue; } } values = get_engage_dists( WeaponClass(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 = get_playerone(); while( 1 ) { lastTracePos = ( 0, 0, 0 ); direction = player GetPlayerAngles(); direction_vec = AnglesToForward( direction ); eye = player GetEye(); trace = BulletTrace( eye, eye + vector_scale( direction_vec, 10000 ), true, player ); tracePoint = trace["position"]; traceNormal = trace["normal"]; traceDist = int( Distance( eye, tracePoint ) ); if( tracePoint != lastTracePos ) { lastTracePos = tracePoint; if( !IsDefined( level.weaponEngageDistValues ) ) { hudobj_changecolor( hudObjArray, level.white ); hudObjArray engagedist_hud_changetext( "nodata", tracedist ); } else { engageDistMin = level.weaponEngageDistValues.engageDistMin; engageDistOptimal = level.weaponEngageDistValues.engageDistOptimal; engageDistMulligan = level.weaponEngageDistValues.engageDistMulligan; engageDistMax = level.weaponEngageDistValues.engageDistMax; if( ( traceDist >= engageDistMin ) && ( traceDist <= engageDistMax ) ) { 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 ); } } } 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; } } } 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; } debug_ai_engage_dist() { level endon( "kill_all_engage_dist_debug" ); level endon( "kill_ai_engagement_distance_debug" ); player = get_playerone(); 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 { engageDistMin = level.weaponEngageDistValues.engageDistMin; engageDistOptimal = level.weaponEngageDistValues.engageDistOptimal; engageDistMulligan = level.weaponEngageDistValues.engageDistMulligan; engageDistMax = level.weaponEngageDistValues.engageDistMax; if( ( dist >= engageDistMin ) && ( dist <= engageDistMax ) ) { if( ( dist >= ( engageDistOptimal - engageDistMulligan ) ) && ( dist <= ( engageDistOptimal + engageDistMulligan ) ) ) { drawColor = level.green; drawString = "RAD"; } 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 ); } } 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() 0 ) { node = nodes[0]; if( node.type != "Path" && DistanceSquared(node.origin, level.playerCursor["position"]) < 24*24 ) { if( !level.ai_puppet_highlighting ) { ai_puppeteer_render_node( node, (0,1,1) ); } level.playerCursorNode = node; } } } if( !level.ai_puppet_highlighting ) { ai_puppeteer_render_point( level.playerCursor["position"], level.playerCursor["normal"], forward, cursorColor ); } wait(0.05); } } ai_puppeteer_create_hud() { level.puppeteer_hud_select = NewDebugHudElem(); level.puppeteer_hud_select.x = 0; level.puppeteer_hud_select.y = 180; level.puppeteer_hud_select.fontscale = 1.5; level.puppeteer_hud_select.alignX = "left"; level.puppeteer_hud_select.horzAlign = "left"; level.puppeteer_hud_select.color = (0,0,1); level.puppeteer_hud_goto = NewDebugHudElem(); level.puppeteer_hud_goto.x = 0; level.puppeteer_hud_goto.y = 200; level.puppeteer_hud_goto.fontscale = 1.5; level.puppeteer_hud_goto.alignX = "left"; level.puppeteer_hud_goto.horzAlign = "left"; level.puppeteer_hud_goto.color = (0,1,0); level.puppeteer_hud_shoot = NewDebugHudElem(); level.puppeteer_hud_shoot.x = 0; level.puppeteer_hud_shoot.y = 220; level.puppeteer_hud_shoot.fontscale = 1.5; level.puppeteer_hud_shoot.alignX = "left"; level.puppeteer_hud_shoot.horzAlign = "left"; level.puppeteer_hud_shoot.color = (1,1,1); level.puppeteer_hud_select SetText("X for select"); level.puppeteer_hud_goto SetText("A for goto"); level.puppeteer_hud_shoot SetText("R_TRIG for shoot"); } ai_puppeteer_destroy_hud() { if( IsDefined(level.puppeteer_hud_select) ) { level.puppeteer_hud_select Destroy(); } if( IsDefined(level.puppeteer_hud_goto) ) { level.puppeteer_hud_goto Destroy(); } if( IsDefined(level.puppeteer_hud_shoot) ) { level.puppeteer_hud_shoot Destroy(); } } ai_puppeteer_render_point(point, normal, forward, color) { surface_vector = VectorCross( forward, normal ); surface_vector = VectorNormalize(surface_vector); line( point, point + vector_scale(surface_vector, 5), color, 1, true ); line( point, point + vector_scale(surface_vector, -5), color, 1, true ); surface_vector = VectorCross( normal, surface_vector ); surface_vector = VectorNormalize(surface_vector); line( point, point + vector_scale(surface_vector, 5), color, 1, true ); line( point, point + vector_scale(surface_vector, -5), color, 1, true ); } ai_puppeteer_render_node(node, color) { print3d( node.origin, node.type, color, 1, 0.35 ); box( node.origin, (-16,-16,0), (16,16,16), node.angles[1], color, 1, 1 ); nodeForward = anglesToForward( node.angles ); nodeForward = vector_scale( nodeForward, 8 ); line( node.origin, node.origin + nodeForward, color, 1, 1 ); } ai_puppeteer_render_ai(ai, color) { circle( ai.origin + (0,0,1), 15, color, false, true ); } ai_puppeteer_highlight_point(point, normal, forward, color) { level endon("kill ai puppeteer"); self endon("death"); level.ai_puppet_highlighting = true; maxTime = 0.7; timer = 0; waitTime = 0.15; while( timer < maxTime ) { ai_puppeteer_render_point( point, normal, forward, color ); timer += waitTime; wait( waitTime ); } level.ai_puppet_highlighting = false; } ai_puppeteer_highlight_node(node) { level endon("kill ai puppeteer"); self endon("death"); level.ai_puppet_highlighting = true; maxTime = 0.7; timer = 0; waitTime = 0.15; while( timer < maxTime ) { ai_puppeteer_render_node( node, (0,1,0) ); timer += waitTime; wait( waitTime ); } level.ai_puppet_highlighting = false; } ai_puppeteer_highlight_ai(ai, color) { level endon("kill ai puppeteer"); self endon("death"); level.ai_puppet_highlighting = true; maxTime = 0.7; timer = 0; waitTime = 0.15; while( timer < maxTime && IsDefined(ai) ) { ai_puppeteer_render_ai( ai, color ); timer += waitTime; wait( waitTime ); } level.ai_puppet_highlighting = false; }