1 #using scripts\shared\ai_shared;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\postfx_shared;
4 #using scripts\shared\ai\systems\gib;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\visionset_mgr_shared;
8 #insert scripts\shared\shared.gsh;
9 #insert scripts\shared\version.gsh;
10 #insert scripts\shared\ai\archetype_thrasher.gsh;
11 #insert scripts\shared\ai\systems\gib.gsh;
12 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
14 #precache( "client_fx", THRASHER_FOOTSTEP_FX_FILE );
15 #precache( "client_fx", THRASHER_SPORE_DESTROY_FX1_FILE );
16 #precache( "client_fx", THRASHER_SPORE_DESTROY_FX2_FILE );
17 #precache( "client_fx", THRASHER_SPORE_IMPACT_FX_FILE );
18 #precache( "client_fx", THRASHER_EYE_FX_FILE );
19 #precache( "client_fx", THRASHER_BERSERK_EYE_FX_FILE );
20 #precache( "client_fx", THRASHER_BERSERK_FX1_FILE );
21 #precache( "client_fx", THRASHER_BERSERK_FX2_FILE );
22 #precache( "client_fx", THRASHER_BERSERK_FX3_FILE );
23 #precache( "client_fx", THRASHER_SPORE_INFLATE_FX_FILE );
24 #precache( "client_fx", THRASHER_SPORE_CLOUD_SM_FX_FILE );
25 #precache( "client_fx", THRASHER_SPORE_CLOUD_MD_FX_FILE );
26 #precache( "client_fx", THRASHER_SPORE_CLOUD_LRG_FX_FILE );
27 #precache( "client_fx", THRASHER_CONSUMED_PLAYER_FX_FILE );
29 #using_animtree( "generic" );
61 "thrasher_player_hide",
95 level.thrasherPustules = [];
117 #namespace ThrasherClientUtils;
122 entity.ignoreRagdoll =
true;
133 pustules = level.thrasherPustules;
134 level.thrasherPustules = [];
137 foreach ( pustule
in pustules )
139 if ( pustule.endTime <= time )
141 if( isdefined( pustule.fx ) )
143 StopFX( pustule.localClientNum, pustule.fx );
148 level.thrasherPustules[ level.thrasherPustules.size ] = pustule;
156 #define THRASHER_RUMBLE_COOLDOWN 400
159 e_player = GetLocalPlayer( localClientNum );
160 n_dist = DistanceSquared( pos, e_player.origin );
163 if (n_thrasher_dist <= 0)
169 n_scale = ( n_thrasher_dist - n_dist ) / n_thrasher_dist;
171 if ( n_scale > 1 || n_scale < 0 || n_scale <= 0.01 )
178 if ( IsDefined( e_player.thrasherLastFootstep ) &&
184 earthquake_scale = n_scale * 0.1;
186 if( earthquake_scale > 0.01)
188 e_player Earthquake( earthquake_scale, 0.1, pos, n_dist );
191 if( n_scale <= 1 && n_scale > 0.8 )
193 e_player PlayRumbleOnEntity( localClientNum,
"damage_heavy" );
195 else if( n_scale <= 0.8 && n_scale > 0.4 )
197 e_player PlayRumbleOnEntity( localClientNum,
"reload_small" );
200 e_player.thrasherLastFootstep = GetTime();
203 function private _StopFx( localClientNum, effect )
205 if ( IsDefined( effect ) )
207 StopFX( localClientNum, effect );
215 if ( !IsDefined( entity ) || entity.archetype !==
"thrasher" || !entity HasDObj( localClientNum ) )
220 localPlayer = GetLocalPlayer( localClientNum );
221 localPlayerNum = localPlayer GetEntityNumber();
222 localPlayerBit = 1 << localPlayerNum;
224 if ( localPlayerBit & newValue )
234 function private thrasherBerserkMode( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
238 if ( !IsDefined( entity ) || entity.archetype !==
"thrasher" || !entity HasDObj( localClientNum ) )
243 _StopFx( localClientNum, entity.thrasherEyeGlow );
244 entity.thrasherEyeGlow = undefined;
246 _StopFx( localClientNum, entity.thrasherAmbientFX1 );
247 entity.thrasherAmbientFX1 = undefined;
248 _StopFx( localClientNum, entity.thrasherAmbientFX2 );
249 entity.thrasherAmbientFX2 = undefined;
250 _StopFx( localClientNum, entity.thrasherAmbientFX3 );
251 entity.thrasherAmbientFX3 = undefined;
275 function private thrasherSporeExplode( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
282 newSporesExploded = (oldValue ^ newValue) & ~oldValue;
284 oldSporesInflated = (oldValue ^ newValue) & ~newValue;
285 currentSpore = sporeClientfields[0];
289 sporeTag = sporeTags[index];
291 pustuleInfo = undefined;
293 if ( newSporesExploded & currentSpore )
299 pustuleInfo = SpawnStruct();
302 if( !
IS_TRUE( level.b_thrasher_custom_spore_fx ) )
307 else if ( oldSporesInflated & currentSpore )
309 pustuleInfo = SpawnStruct();
315 if ( IsDefined( pustuleInfo ) )
317 pustuleInfo.localClientNum = localClientNum;
318 pustuleInfo.startTime = GetTime();
319 pustuleInfo.endTime = pustuleInfo.startTime + pustuleInfo.length;
320 level.thrasherPustules[ level.thrasherPustules.size ] = pustuleInfo;
327 function private thrasherSporeImpact( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
330 sporeTag = undefined;
335 for ( index = 0; index < sporeClientfields.size; index++ )
344 if ( IsDefined( sporeTag ) )
352 if ( !IsDefined( entity ) || entity.archetype !==
"thrasher" || !entity HasDObj( localClientNum ) )
357 _StopFx( localClientNum, entity.thrasherEyeGlow );
358 entity.thrasherEyeGlow = undefined;
361 function private sndPlayerConsumed( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
365 if( !isdefined(
self.sndPlayerConsumedID ) )
367 self.sndPlayerConsumedID =
self playloopsound(
"zmb_thrasher_consumed_lp", 5 );
370 if( !isdefined(
self.n_fx_id_player_consumed ) )
376 EnableSpeedBlur( localClientNum, 0.07, 0.55, 0.9,
false, 100, 100 );
380 if( isdefined(
self.sndPlayerConsumedID ) )
382 self stoploopsound(
self.sndPlayerConsumedID, .5 );
383 self.sndPlayerConsumedID = undefined;
386 if( isdefined(
self.n_fx_id_player_consumed ) )
388 StopFX( localClientNum,
self.n_fx_id_player_consumed );
389 self.n_fx_id_player_consumed = undefined;
392 self StopAllLoopSounds(1);
394 if( isdefined(
self.playingPostfxBundle ) )
396 self thread postfx::stopplayingpostfxbundle();
398 DisableSpeedBlur( localClientNum );