1 #using scripts\codescripts\struct;
2 #using scripts\shared\util_shared;
3 #using scripts\shared\clientfield_shared;
5 #insert scripts\shared\shared.gsh;
6 #insert scripts\shared\version.gsh;
9 function enemy_highlight_display( localClientNum, materialName, size, fovPercent, traceTimeCheck, actorsOnly, allyMaterialName )
11 self notify(
"enemy_highlight_display" );
13 self.enemy_highlight_display =
true;
21 self endon(
"enemy_highlight_display" );
23 if ( !isDefined( actorsOnly ) )
26 if ( !isDefined(
self.enemy_highlight_elems ) )
27 self.enemy_highlight_elems = [];
29 while ( isDefined(
self ) )
32 if ( !isDefined( GetLuiMenu( localClientNum,
"HudElementImage" ) ) )
33 self.enemy_highlight_elems = [];
35 a_all_entities = GetEntArray( localClientNum );
37 self.enemy_highlight_ents = [];
39 foreach( entity
in a_all_entities )
41 if( entity.type ==
"zbarrier" )
44 if ( actorsOnly && entity.type !=
"actor" && entity.type !=
"player" )
47 entNum = entity GetEntityNumber();
49 isEnemy = isDefined( entity.team ) && entity.team ==
"axis";
50 isAlly = !isEnemy && isDefined( allyMaterialName );
51 showIt = isAlive( entity ) && (isEnemy || isAlly) && !
IS_TRUE( entity.no_highlight );
53 if ( showIt && !isDefined(
self.enemy_highlight_ents[entNum] ) )
55 self.enemy_highlight_ents[entNum] = entity;
57 else if ( !showIt && isDefined(
self.enemy_highlight_ents[entNum] ) )
59 self.enemy_highlight_ents[entNum] = undefined;
61 if ( isDefined(
self.enemy_highlight_elems[entNum] ) )
63 CloseLUIMenu( localclientnum,
self.enemy_highlight_elems[entNum] );
64 self.enemy_highlight_elems[entNum] = undefined;
75 self endon(
"enemy_highlight_display" );
77 const MENU_LIMIT = 32;
79 if ( !isDefined(
self.enemy_highlight_elems ) )
80 self.enemy_highlight_elems = [];
82 if ( !IsDefined( traceTimeCheck ) )
84 traceTimeCheckHalfMs = int( traceTimeCheck * 500 );
86 while ( isDefined(
self ) )
89 if ( !isDefined( GetLuiMenu( localClientNum,
"HudElementImage" ) ) )
90 self.enemy_highlight_elems = [];
93 eye = GetLocalClientEyePos( localClientNum );
94 angles = GetLocalClientAngles( localClientNum );
95 if ( isDefined(
self.vehicle_camera_pos ) )
97 eye =
self.vehicle_camera_pos;
98 angles =
self.vehicle_camera_ang;
101 dotLimit = cos( GetLocalClientFOV( localClientNum ) * fovPercent );
102 viewDir = AnglesToForward( angles );
106 foreach( entNum, entity
in self.enemy_highlight_ents )
108 if ( !isDefined( entity ) || !isDefined( entity.origin ) )
114 isEnemy = isDefined( entity.team ) && entity.team ==
"axis";
115 isAlly = !isEnemy && isDefined( allyMaterialName );
116 showIt = isAlive( entity ) && (isEnemy || isAlly) && !
IS_TRUE( entity.no_highlight ) && entity !=
self;
118 if ( showIt &&
self.enemy_highlight_elems.size >= MENU_LIMIT && !isDefined(
self.enemy_highlight_elems[entNum] ) )
123 if ( entity.type ==
"actor" || entity.type ==
"player" )
124 entPos = entity GetTagOrigin(
"J_Spine4" );
125 if ( !isDefined( entPos ) )
126 entPos = entity.origin + ( 0, 0, 40 );
127 assert( isDefined( entPos ) );
128 assert( isDefined( eye ) );
129 deltaDir = VectorNormalize( entPos - eye );
130 dot = VectorDot( deltaDir, viewDir );
131 if ( dot < dotLimit )
134 radialCoef = max( ( ( 1.0 - dot ) / ( 1.0 - dotLimit ) ) - 0.5, 0.0 );
136 if ( showIt && ( !isDefined( entity.highlight_trace_next ) || entity.highlight_trace_next <= GetServerTime( localClientNum ) ) )
138 from = eye + deltaDir * 100;
139 to = entPos + deltaDir * -100;
140 trace_point = TracePoint( from, to );
141 entity.highlight_trace_result = ( trace_point[
"fraction"] >= 1.0 );
142 entity.highlight_trace_next = GetServerTime( localClientNum ) + ( traceTimeCheckHalfMs ) + RandomIntRange( 0, traceTimeCheckHalfMs );
146 if ( showIt && entity.highlight_trace_result )
148 screenProj = Project3Dto2D( localClientNum, entPos );
150 if ( !isDefined(
self.enemy_highlight_elems[entNum] ) )
155 self.enemy_highlight_elems[entNum] =
self create_target_indicator( localClientNum, entity, allyMaterialName, size );
158 elem =
self.enemy_highlight_elems[entNum];
160 if ( isDefined( elem ) )
162 visibleEnts[entNum] = elem;
164 SetLuiMenuData( localClientNum, elem,
"x", screenProj[0] - ( size * 0.5 ) );
165 SetLuiMenuData( localClientNum, elem,
"y", screenProj[1] - ( size * 0.5 ) );
166 SetLuiMenuData( localClientNum, elem,
"alpha", 1.0 - radialCoef );
170 SetLuiMenuData( localClientNum, elem,
"red", 1.0 );
171 SetLuiMenuData( localClientNum, elem,
"green", 0.0 );
176 SetLuiMenuData( localClientNum, elem,
"red", 0.0 );
177 SetLuiMenuData( localClientNum, elem,
"green", 1.0 );
185 foreach ( entNum, val
in self.enemy_highlight_elems )
187 if ( !isDefined( visibleEnts[entNum] ) )
188 removeEnts[entNum] = entNum;
190 foreach ( entNum, val
in removeEnts )
192 CloseLUIMenu( localclientnum,
self.enemy_highlight_elems[entNum] );
193 self.enemy_highlight_elems[entNum] = undefined;
202 self notify(
"enemy_highlight_display" );
203 self endon(
"enemy_highlight_display" );
207 if ( isDefined(
self.enemy_highlight_elems ) )
209 foreach ( hudelem
in self.enemy_highlight_elems )
210 CloseLUIMenu( localclientnum, hudelem );
212 self.enemy_highlight_elems = undefined;
215 self.enemy_highlight_display = undefined;
220 hudelem = CreateLUIMenu( localClientNum,
"HudElementImage" );
222 if ( isDefined( hudelem ) )
226 SetLuiMenuData( localClientNum, hudelem,
"x", 0 );
227 SetLuiMenuData( localClientNum, hudelem,
"y", 0 );
228 SetLuiMenuData( localClientNum, hudelem,
"width", size );
229 SetLuiMenuData( localClientNum, hudelem,
"height", size );
230 SetLuiMenuData( localClientNum, hudelem,
"alpha", 1.0 );
231 SetLuiMenuData( localClientNum, hudelem,
"material", materialName );
232 SetLuiMenuData( localClientNum, hudelem,
"red", 1.0 );
233 SetLuiMenuData( localClientNum, hudelem,
"green", 0.0 );
234 SetLuiMenuData( localClientNum, hudelem,
"blue", 0.0 );
235 SetLuiMenuData( localClientNum, hudelem,
"zRot", 0.0 );
237 OpenLUIMenu( localclientnum, hudelem );