1 #using scripts\codescripts\struct;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\system_shared;
4 #using scripts\shared\util_shared;
5 #insert scripts\shared\shared.gsh;
6 #insert scripts\shared\version.gsh;
7 #insert scripts\mp\killstreaks\_killstreaks.gsh;
9 #precache( "client_fx", "killstreaks/fx_sg_distortion_cone_ash" );
10 #precache( "client_fx", "killstreaks/fx_sg_distortion_cone_ash_sm" );
12 #using_animtree( "mp_microwaveturret" );
14 #define MICROWAVE_TURRET_ROW_SPREAD ( 150 )
15 #define MICROWAVE_TURRET_FX_SIZE ( 200 )
16 #define MICROWAVE_TURRET_FX_HALF_SIZE ( 125 )
17 #define MICROWAVE_TURRET_FX_TRACE ( MICROWAVE_TURRET_RADIUS + 40 )
18 #define MICROWAVE_TURRET_FX "killstreaks/fx_sg_distortion_cone_ash"
19 #define MICROWAVE_TURRET_FX_HALF "killstreaks/fx_sg_distortion_cone_ash_sm"
20 #define MICROWAVE_TURRET_STUN_FX "killstreaks/fx_sg_emp_stun"
21 #define MICROWAVE_TURRET_FX_TRACE_ANGLE ( 55 )
22 #define MICROWAVE_TURRET_FX_CHECK_TIME ( 1.0 )
24 #namespace microwave_turret;
43 self notify(
"sound_stop" );
49 self endon(
"entityshutdown" );
50 self endon(
"sound_stop" );
52 if (
IS_TRUE(
self.sound_loop_enabled ) )
55 self playsound ( 0,
"wpn_micro_turret_start");
59 origin =
self GetTagOrigin(
"tag_flash" );
60 angles =
self GetTagAngles(
"tag_flash" );
62 forward = AnglesToForward( angles );
63 forward = VectorScale( forward, 750 );
65 trace = BulletTrace( origin, origin + forward,
false,
self );
70 self.microwave_audio_start = start;
71 self.microwave_audio_end =
end;
74 if ( !
IS_TRUE(
self.sound_loop_enabled ) )
76 self.sound_loop_enabled =
true;
77 soundLineEmitter(
"wpn_micro_turret_loop",
self.microwave_audio_start,
self.microwave_audio_end );
87 playsound (0,
"wpn_micro_turret_stop",
self.microwave_audio_start);
89 soundStopLineEmitter (
"wpn_micro_turret_loop",
self.microwave_audio_start,
self.microwave_audio_end );
91 if ( isdefined(
self ) )
93 self.sound_loop_enabled =
false;
99 self endon(
"beam_stop" );
100 self endon(
"entityshutdown" );
104 origin =
self GetTagOrigin(
"tag_flash" );
106 if ( origin[0] !=
self.microwave_audio_start[0] || origin[1] !=
self.microwave_audio_start[1] || origin[2] !=
self.microwave_audio_start[2] )
108 previousStart =
self.microwave_audio_start;
109 previousEnd =
self.microwave_audio_end;
111 angles =
self GetTagAngles(
"tag_flash" );
113 forward = AnglesToForward( angles );
114 forward = VectorScale( forward, 750 );
116 trace = BulletTrace( origin, origin + forward,
false,
self );
118 self.microwave_audio_start = origin;
119 self.microwave_audio_end =
trace[
"position" ];
121 soundUpdateLineEmitter(
"wpn_micro_turret_loop", previousStart, previousEnd,
self.microwave_audio_start,
self.microwave_audio_end );
128 function microwave_init_anim( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
133 self UseAnimTree( #animtree );
134 self SetAnimRestart( %o_turret_guardian_close, 1.0, 0.0, 1.0 );
135 self SetAnimTime( %o_turret_guardian_close, 1.0 );
138 function microwave_open( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
142 self UseAnimTree( #animtree );
143 self SetAnim( %o_turret_guardian_open, 0.0 );
144 self SetAnimRestart( %o_turret_guardian_close, 1.0, 0.0, 1.0 );
146 self notify(
"beam_stop" );
147 self notify(
"sound_stop" );
151 self UseAnimTree( #animtree );
152 self SetAnim( %o_turret_guardian_close, 0.0 );
153 self SetAnimRestart( %o_turret_guardian_open, 1.0, 0.0, 1.0 );
163 self UseAnimTree( #animtree );
164 self SetAnimRestart( %o_turret_guardian_close, 1.0, 0.0, 1.0 );
170 if (
trace[
"fraction" ] < 1.0 )
172 color = ( 0.95, 0.05, 0.05 );
176 color = ( 0.05, 0.95, 0.05 );
179 Sphere(
trace[
"position" ], 5, color, 0.75,
true, 10, 100 );
187 turret endon(
"entityshutdown" );
188 turret endon(
"beam_stop" );
190 turret.should_update_fx =
true;
194 origin = turret GetTagOrigin(
"tag_flash" );
195 angles = turret GetTagAngles(
"tag_flash" );
196 microwaveFXEnt =
spawn(localClientNum, origin,
"script_model");
197 microwaveFXEnt SetModel(
"tag_microwavefx");
198 microwaveFXEnt.angles = angles;
199 microwaveFXEnt linkto(turret,
"tag_flash");
201 microwaveFXEnt.fxHandles = [];
202 microwaveFXEnt.fxNames = [];
203 microwaveFXEnt.fxHashs = [];
206 self thread
CleanupFx( localClientNum, microwaveFXEnt );
212 if ( GetDvarInt(
"scr_microwave_turret_fx_debug" ) )
214 turret.should_update_fx =
true;
215 microwaveFXEnt.fxHashs[
"center"] = 0;
218 if ( turret.should_update_fx ==
false )
225 if ( isdefined( level.last_microwave_turret_fx_trace ) && level.last_microwave_turret_fx_trace == GetTime() )
233 angles = turret GetTagAngles(
"tag_flash" );
234 origin = turret GetTagOrigin(
"tag_flash" );
235 forward = AnglesToForward( angles );
242 trace = BulletTrace( origin, origin + forward,
false, turret );
243 traceRight = BulletTrace( origin, origin + forwardRight,
false, turret );
244 traceLeft = BulletTrace( origin, origin + forwardLeft,
false, turret );
247 if ( GetDvarInt(
"scr_microwave_turret_fx_debug" ) )
256 need_to_rebuild |= microwaveFXEnt
MicrowaveFxHash( traceRight, origin,
"right" );
257 need_to_rebuild |= microwaveFXEnt
MicrowaveFxHash( traceLeft, origin,
"left" );
259 level.last_microwave_turret_fx_trace = getTime();
261 if( !need_to_rebuild )
271 turret.should_update_fx =
false;
279 turret endon(
"entityshutdown" );
280 turret endon(
"beam_stop" );
282 last_angles = turret GetTagAngles(
"tag_flash" );
286 angles = turret GetTagAngles(
"tag_flash" );
288 if ( last_angles != angles )
290 turret.should_update_fx =
true;
291 last_angles = angles;
302 for ( i = 0; i < 5; i++ )
307 traceDistSq = DistanceSquared( origin,
trace[
"position" ] );
308 if( traceDistSq >= endOfHalfFxSq || i == 0 )
310 if ( traceDistSq < endOfFullFxSq )
323 if ( !isDefined(
self.fxHashs[
name] ) )
324 self.fxHashs[
name] = 0;
326 last_hash =
self.fxHashs[
name];
328 self.fxHashs[
name] = hash;
330 return last_hash != hash;
337 foreach ( handle
in microwaveFXEnt.fxHandles )
339 if ( isdefined( handle ) )
341 StopFx( localClientNum, handle );
345 microwaveFXEnt
delete();
350 if ( !isdefined(
self.fxHandles[tag] ) || fxName !=
self.fxNames[tag] )
354 self.fxNames[tag] = fxName;
355 self.fxHandles[tag] = PlayFxOnTag( localCLientNum, fxName,
self, tag );
361 if ( isdefined(
self.fxHandles[tag] ) )
363 StopFx( localClientNum,
self.fxHandles[tag] );
365 self.fxHandles[tag] = undefined;
366 self.fxNames[tag] = undefined;
373 if ( GetDvarInt(
"scr_microwave_turret_fx_debug" ) )
375 origin =
self GetTagOrigin( tag );
377 Sphere( origin, 2, color, 0.75,
true, 10, 100 );
413 for ( i = 0; i < rows; i++ )
418 traceDistSq = DistanceSquared( origin,
trace[
"position" ] );
420 startFx = traceDistSq >= endOfHalfFxSq || i == 0;
443 traceDistSq = DistanceSquared( origin, traceLeft[
"position" ] );
445 startFx = traceDistSq >= endOfHalfFxSq;
467 traceDistSq = DistanceSquared( origin, traceRight[
"position" ] );
469 startFx = traceDistSq >= endOfHalfFxSq;