1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\entityheadicons_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
7 #using scripts\shared\weapons\_weaponobjects;
9 #insert scripts\shared\shared.gsh;
15 level.decoyWeapons = [];
16 level.decoyWeapons[
"fullauto"] = [];
17 level.decoyWeapons[
"semiauto"] = [];
19 level.decoyWeapons[
"fullauto"][level.decoyWeapons[
"fullauto"].size] = GetWeapon(
"ar_accurate" );
21 level.decoyWeapons[
"semiauto"][level.decoyWeapons[
"semiauto"].size] = GetWeapon(
"pistol_standard" );
31 watcher.deleteOnDifferentObjectSpawn =
false;
32 watcher.headicon =
false;
37 owner endon(
"disconnect");
38 self endon(
"death" );
42 self.initial_velocity =
self GetVelocity();
47 spawn_time = GetTime();
49 owner AddWeaponStat(
self.weapon,
"used", 1 );
55 if ( GetTime() > spawn_time + ( decoy_time * 1000 ))
65 function move( owner, count, fire_time, main_dir, max_offset_angle )
67 self endon(
"death" );
70 if ( !(
self IsOnGround() ) )
79 current_main_dir = RandomIntRange(main_dir - max_offset_angle,main_dir + max_offset_angle);
81 avel = ( RandomFloatRange( 800, 1800) * (RandomIntRange( 0, 2 ) * 2 - 1), 0, RandomFloatRange( 580, 940) * (RandomIntRange( 0, 2 ) * 2 - 1));
83 intial_up = RandomFloatRange( min_up_speed, max_up_speed );
85 start_time = GetTime();
86 gravity = GetDvarint(
"bg_gravity" );
89 for ( i = 0; i < 1; i++ )
91 angles = ( 0,RandomIntRange(current_main_dir - max_offset_angle,current_main_dir + max_offset_angle), 0 );
92 dir = AnglesToForward( angles );
94 dir = VectorScale( dir, RandomFloatRange( min_speed, max_speed ) );
96 deltaTime = ( GetTime() - start_time ) * 0.001;
99 up = (0,0, (intial_up) - (800 * deltaTime) );
101 self launch( dir + up, avel );
110 self notify(
"done" );
119 self notify(
"done" );
125 owner endon(
"disconnect");
126 self endon(
"death" );
127 self endon(
"done" );
134 self.max_offset_angle = 30;
138 switch ( weapon_class )
144 case "weapon_assault":
147 case "weapon_sniper":
150 case "weapon_pistol":
153 case "weapon_shotgun":
167 if ( weapon.isSemiAuto )
180 clipSize = weapon.clipSize;
181 fireTime = weapon.fireTime;
182 reloadTime = weapon.reloadTime;
184 burst_spacing_min = 4;
185 burst_spacing_max = 10;
192 burst_count = RandomIntRange( 1, clipSize );
193 self thread
move( owner, burst_count, fireTime,
self.main_dir,
self.max_offset_angle );
194 self fire_burst( owner, weapon, fireTime, burst_count,
true );
201 clipSize = weapon.clipSize;
202 fireTime = weapon.fireTime;
203 reloadTime = weapon.reloadTime;
205 burst_spacing_min = 0.5;
206 burst_spacing_max = 4;
210 burst_count = RandomIntRange( 1, clipSize );
211 self thread
move( owner, burst_count, fireTime,
self.main_dir,
self.max_offset_angle );
212 self fire_burst( owner, weapon, fireTime, burst_count,
false );
219 clipSize = weapon.clipSize;
220 fireTime = weapon.fireTime;
221 reloadTime = weapon.reloadTime;
226 burst_spacing_min = 0.5;
227 burst_spacing_max = 4;
231 burst_count = RandomIntRange( 1, clipSize );
232 self thread
move( owner, burst_count, fireTime,
self.main_dir,
self.max_offset_angle );
233 self fire_burst( owner, weapon, fireTime, burst_count,
false );
240 clipSize = weapon.clipSize;
241 fireTime = weapon.fireTime;
242 reloadTime = weapon.reloadTime;
247 burst_spacing_min = 2;
248 burst_spacing_max = 6;
252 burst_count = RandomIntRange( Int(clipSize * 0.6), clipSize );
254 self thread
move( owner, burst_count, fireTime,
self.main_dir,
self.max_offset_angle );
255 self fire_burst( owner, weapon, fireTime, burst_count, interrupt );
263 clipSize = weapon.clipSize;
264 fireTime = weapon.fireTime;
265 reloadTime = weapon.reloadTime;
270 burst_spacing_min = 3;
271 burst_spacing_max = 5;
275 burst_count = RandomIntRange( 1, clipSize );
276 self thread
move( owner, burst_count, fireTime,
self.main_dir,
self.max_offset_angle );
277 self fire_burst( owner, weapon, fireTime, burst_count,
false );
284 interrupt_shot = count;
288 interrupt_shot = Int( count * RandomFloatRange( 0.6, 0.8 ) );
291 self FakeFire( owner,
self.origin, weapon, interrupt_shot );
292 wait ( fireTime * interrupt_shot );
296 self FakeFire( owner,
self.origin, weapon, count - interrupt_shot );
297 wait ( fireTime * (count - interrupt_shot) );
309 wait ( RandomFloatRange(burst_spacing_min, burst_spacing_max) );
315 divy_it_up = (reloadTime - 0.1) / 2;
317 self PlaySound(
"fly_assault_reload_npc_mag_out");
319 self PlaySound(
"fly_assault_reload_npc_mag_in");
329 owner endon(
"disconnect");
330 self endon(
"death_before_explode");
331 self waittill(
"explode", pos);
332 level thread
do_explosion( owner, pos, weapon, RandomIntRange( 5, 10 ) );
337 self waittill(
"death");
339 if ( IsDefined(
self) )
341 self notify(
"death_before_explode");
351 for ( i = 0 ; i < count; i++ )
353 wait(RandomFloatRange(0.1,0.5));
354 offset = ( RandomFloatRange(min_offset,max_offset)* (RandomIntRange( 0, 2 ) * 2 - 1), RandomFloatRange(min_offset,max_offset)* (RandomIntRange( 0, 2 ) * 2 - 1), 0 );
355 owner FakeFire( owner, pos+offset, weapon, 1 );
363 if ( RandomIntRange( 0, 10 ) < 3 )
368 randomval = RandomIntRange(0,level.decoyWeapons[type].size);
370 /# PrintLn(
"Decoy type: " + type +
" weapon: " + level.decoyWeapons[type][randomval].name ); #/
372 return level.decoyWeapons[type][randomval];
377 if( RandomIntRange(0,5) == 1 )
387 self endon(
"death" );
388 self endon(
"done" );
389 self.main_dir = Int(VectorToAngles((
self.initial_velocity[0],
self.initial_velocity[1], 0 ))[1]);
394 self waittill(
"grenade_bounce", pos, normal );
396 dot = VectorDot( normal, up );
399 if ( dot < 0.5 && dot > -0.5 )
401 self.main_dir = Int(VectorToAngles((normal[0], normal[1], 0 ))[1]);