mirror of
https://github.com/reaaLx/nx1-gsc-dump.git
synced 2025-04-22 17:15:48 +00:00
112 lines
3.3 KiB
Plaintext
112 lines
3.3 KiB
Plaintext
#include common_scripts\utility;
|
|
#include maps\_utility;
|
|
|
|
/*QUAKED info_volume_translation (0.1 0.3 1.0)?
|
|
defaulttexture="translation"
|
|
Used to determine where a translated bit of text is.
|
|
translation - The string reference name to be used for this translation.
|
|
radius - The distance at which the translation can be seen.
|
|
*/
|
|
|
|
TRANSLATION_DETECTION_FOV = 15;
|
|
TRANSLATION_MIN_ANGLE = 0.7; //from 0 to 1. Dot product result.
|
|
main()
|
|
{
|
|
level._translation_ents = GetEntArray( "info_volume_translation", "classname" );
|
|
|
|
level._player thread watch_for_view();
|
|
}
|
|
|
|
//called on the player.
|
|
watch_for_view()
|
|
{
|
|
//loop indefinately.
|
|
while ( true )
|
|
{
|
|
translation_ents = [];
|
|
has_changed = false;
|
|
|
|
//loop over all of the translation ents to see if they're in view.
|
|
for ( i = 0; i < level._translation_ents.size; i ++ )
|
|
{
|
|
translation_ent = level._translation_ents[i];
|
|
|
|
if( !IsDefined( translation_ent.draw ) )
|
|
{
|
|
translation_ent.draw = false;
|
|
}
|
|
|
|
AssertEx( IsDefined(translation_ent.radius), "translation ent at pos ("+translation_ent.origin[0]+", "+translation_ent.origin[1]+", "+translation_ent.origin[2]+") does not have radius." );
|
|
|
|
//debug_draw_origin( translation_ent.origin );
|
|
|
|
// /#
|
|
// normal = translation_ent GetVolumeNormal();
|
|
// Line( translation_ent.origin, translation_ent.origin + 32*normal, ( 1, 0, 0 ), 1, 0, 10000000 );
|
|
// #/
|
|
|
|
//is it close enough?
|
|
if ( Distance( self.origin, translation_ent.origin ) < translation_ent.radius )
|
|
{
|
|
if ( within_fov_of_players( translation_ent.origin, Cos( TRANSLATION_DETECTION_FOV ) ) )
|
|
{
|
|
angle = VectorDot( translation_ent GetVolumeNormal(), VectorNormalize(self.origin - translation_ent.origin) );
|
|
if( abs( angle ) > TRANSLATION_MIN_ANGLE )
|
|
{
|
|
//now that we've culled down how many object's are being tested, lets do a trace for occulusion.
|
|
sight_trace = SightTracePassed( translation_ent.origin, self GetEye(), false, undefined );
|
|
if ( sight_trace )
|
|
{
|
|
//if not already being drawn.
|
|
if ( !translation_ent.draw )
|
|
{
|
|
//ok if we've made it this far we want to actually draw this one. I've tried placing these if clauses from quickest to slowest.
|
|
translation_ent.draw = true;
|
|
has_changed = true;
|
|
translation_ents[translation_ents.size] = translation_ent;
|
|
continue;
|
|
}
|
|
}
|
|
else if ( translation_ent.draw )
|
|
{
|
|
has_changed = true;
|
|
translation_ent.draw = false;
|
|
}
|
|
}
|
|
else if ( translation_ent.draw )
|
|
{
|
|
has_changed = true;
|
|
translation_ent.draw = false;
|
|
}
|
|
}
|
|
else if ( translation_ent.draw )
|
|
{
|
|
has_changed = true;
|
|
translation_ent.draw = false;
|
|
}
|
|
}
|
|
else if ( translation_ent.draw )
|
|
{
|
|
has_changed = true;
|
|
translation_ent.draw = false;
|
|
}
|
|
|
|
//was previously being drawn, but isn't now, we need to send a new command. Give it some time though.
|
|
|
|
}
|
|
|
|
if ( has_changed )
|
|
{
|
|
level._player DrawTranslationText( translation_ents );
|
|
}
|
|
|
|
wait 0.5;
|
|
}
|
|
}
|
|
|
|
debug_draw_origin( origin )
|
|
{
|
|
Line( origin + ( 16, 0, 0 ), origin + ( -16, 0, 0 ), ( 1, 0, 0 ), 1, 0, 10000000 );
|
|
Line( origin + ( 0, 16, 0 ), origin + ( 0, -16, 0 ), ( 0, 1, 0 ), 1, 0, 10000000 );
|
|
Line( origin + ( 0, 0, 16 ), origin + ( 0, 0, -16 ), ( 0, 0, 1 ), 1, 0, 10000000 );
|
|
} |