1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\challenges_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\damagefeedback_shared;
7 #using scripts\shared\scoreevents_shared;
8 #using scripts\shared\system_shared;
9 #using scripts\shared\util_shared;
10 #using scripts\shared\weapons\_hacker_tool;
11 #using scripts\shared\weapons\_weaponobjects;
13 #insert scripts\shared\shared.gsh;
14 #insert scripts\shared\version.gsh;
16 #precache( "fx", "_t6/misc/fx_equip_tac_insert_light_grn" );
17 #precache( "fx", "_t6/misc/fx_equip_tac_insert_light_red" );
18 #precache( "fx", "_t6/misc/fx_equip_tac_insert_exp" );
20 #namespace tacticalinsertion;
24 level.weaponTacticalInsertion = GetWeapon(
"tactical_insertion" );
26 level._effect[
"tacticalInsertionFizzle"] =
"_t6/misc/fx_equip_tac_insert_exp";
40 crate_ents = GetEntArray(
"care_package",
"script_noteworthy" );
41 mins = ( -17, -17, -40 );
42 maxs = ( 17, 17, 40 );
43 for ( i = 0 ; i < crate_ents.size ; i++ )
45 if ( crate_ents[i] IsTouchingVolume( origin + (0,0,40), mins, maxs ) )
56 if ( !isdefined(
self.tacticalInsertion ) )
59 origin =
self.tacticalInsertion.origin;
60 angles =
self.tacticalInsertion.angles;
61 team =
self.tacticalInsertion.team;
63 if (!isPredictedSpawn)
66 if ( team !=
self.team )
72 if (!isPredictedSpawn)
74 self.tacticalInsertionTime = getTime();
75 self spawn( origin, angles,
"tactical insertion" );
76 self SetSpawnClientFlag(
"SCDFL_DISABLE_LOGGING" );
77 self AddWeaponStat( level.weaponTacticalInsertion,
"used", 1 );
84 self endon(
"death" );
96 if ( isdefined( player.tacticalInsertion ) )
110 self endon(
"delete" );
114 trigger waittill(
"trigger", player );
116 if ( !isAlive( player ) )
119 if ( !player isOnGround() )
122 if ( isdefined( trigger.triggerTeam ) && ( player.team != trigger.triggerTeam ) )
125 if ( isdefined( trigger.triggerTeamIgnore ) && ( player.team == trigger.triggerTeamIgnore ) )
128 if ( isdefined( trigger.claimedBy ) && ( player != trigger.claimedBy ) )
131 if ( player useButtonPressed() && !player.throwingGrenade && !player meleeButtonPressed() )
133 if ( isdefined( playerSoundOnUse ) )
134 player playLocalSound( playerSoundOnUse );
135 if ( isdefined( npcSoundOnUse ) )
136 player playSound( npcSoundOnUse );
145 self.tacticalInsertion endon(
"delete" );
147 self waittill(
"disconnect" );
153 self.owner.tacticalInsertion = undefined;
154 self notify(
"delete" );
155 self.owner notify(
"tactical_insertion_destroyed" );
157 self.friendlyTrigger
delete();
158 self.enemyTrigger
delete();
160 if ( isdefined( attacker ) && isdefined( attacker.pers[
"team"] ) && isdefined(
self.owner ) && isdefined(
self.owner.pers[
"team"] ) )
162 if ( level.teambased )
164 if ( attacker.pers[
"team"] !=
self.owner.pers[
"team"] )
166 attacker notify(
"destroyed_explosive");
174 if ( attacker!=
self.owner )
176 attacker notify(
"destroyed_explosive");
192 PlayFX( level._effect[
"tacticalInsertionFizzle"],
self.origin );
193 self playsound (
"dst_tac_insert_break");
195 if ( isdefined( attacker ) && attacker !=
self.owner )
197 if( isdefined( level.globallogic_audio_dialog_on_player_override ) )
199 self.owner [[level.globallogic_audio_dialog_on_player_override]](
"tact_destroyed",
"item_destroyed" );
210 player GiveWeapon( level.weaponTacticalInsertion );
211 player setWeaponAmmoClip( level.weaponTacticalInsertion, 1 );
216 self endon(
"disconnect" );
219 self.tacticalInsertion =
spawn(
"script_model",
self.origin + ( 0, 0, 1 ) );
220 self.tacticalInsertion setModel(
"t6_wpn_tac_insert_world" );
221 self.tacticalInsertion.origin =
self.origin + ( 0, 0, 1 );
222 self.tacticalInsertion.angles =
self.angles;
223 self.tacticalInsertion.team =
self.team;
224 self.tacticalInsertion setTeam(
self.team );
225 self.tacticalInsertion.owner =
self;
226 self.tacticalInsertion setOwner(
self );
227 self.tacticalInsertion setWeapon( level.weaponTacticalInsertion );
232 self.tacticalInsertion endon(
"delete" );
240 self.tacticalInsertion.friendlyTrigger =
spawn(
"trigger_radius_use",
self.tacticalInsertion.origin + ( 0, 0, 3 ) );
241 self.tacticalInsertion.friendlyTrigger SetCursorHint(
"HINT_NOICON",
self.tacticalInsertion );
242 self.tacticalInsertion.friendlyTrigger SetHintString( &
"MP_TACTICAL_INSERTION_PICKUP" );
243 if ( level.teamBased )
245 self.tacticalInsertion.friendlyTrigger SetTeamForTrigger(
self.team );
246 self.tacticalInsertion.friendlyTrigger.triggerTeam =
self.team;
248 self ClientClaimTrigger(
self.tacticalInsertion.friendlyTrigger );
249 self.tacticalInsertion.friendlyTrigger.claimedBy =
self;
251 self.tacticalInsertion.enemyTrigger =
spawn(
"trigger_radius_use",
self.tacticalInsertion.origin + ( 0, 0, 3 ) );
252 self.tacticalInsertion.enemyTrigger SetCursorHint(
"HINT_NOICON",
self.tacticalInsertion );
253 self.tacticalInsertion.enemyTrigger SetHintString( &
"MP_TACTICAL_INSERTION_DESTROY" );
254 self.tacticalInsertion.enemyTrigger SetInvisibleToPlayer(
self );
255 if ( level.teamBased )
257 self.tacticalInsertion.enemyTrigger SetExcludeTeamForTrigger(
self.team );
258 self.tacticalInsertion.enemyTrigger.triggerTeamIgnore =
self.team;
265 self.tacticalInsertion thread
watchUseTrigger(
self.tacticalInsertion.friendlyTrigger,&
pickUp, watcher.pickUpSoundPlayer, watcher.pickUpSound );
268 if ( isdefined(
self.tacticalInsertionCount ) )
269 self.tacticalInsertionCount++;
271 self.tacticalInsertionCount = 1;
273 self.tacticalInsertion SetCanDamage(
true );
274 self.tacticalInsertion.health = 1;
278 self.tacticalInsertion waittill(
"damage",
damage, attacker, direction, point, type, tagName, modelName, partname, weapon, iDFlags );
280 if ( level.teamBased && ( !isdefined( attacker ) || !isPlayer( attacker ) || attacker.team ==
self.team ) && attacker !=
self )
283 if( attacker !=
self )
294 if ( watcher.stunTime > 0 && weapon.doStun )
299 if ( weapon.doDamageFeedback )
302 if ( level.teambased &&
self.tacticalInsertion.owner.team != attacker.team )
308 else if ( !level.teambased &&
self.tacticalInsertion.owner != attacker )
316 if ( isdefined( attacker ) && attacker !=
self )
318 if( isdefined( level.globallogic_audio_dialog_on_player_override ) )
320 self [[level.globallogic_audio_dialog_on_player_override]](
"tact_destroyed",
"item_destroyed" );
324 self.tacticalInsertion thread
fizzle();
330 if ( !isdefined(
self.tacticalInsertion ) )
339 event =
self util::waittill_any_return(
"tactical_insertion_destroyed",
"disconnect",
"end_killcam",
"abort_killcam",
"tactical_insertion_canceled",
"spawned" );
341 if ( event ==
"tactical_insertion_canceled" )
346 if ( isdefined( text ) )
355 return self changeSeatButtonPressed();
357 return self jumpButtonPressed();
362 self endon(
"disconnect" );
363 self endon(
"end_killcam" );
364 self endon(
"abort_killcam" );
373 self notify(
"tactical_insertion_canceled" );
378 text = NewClientHudElem(
self );
379 text.archived =
false;
381 text.alignX =
"center";
382 text.alignY =
"middle";
383 text.horzAlign =
"center";
384 text.vertAlign =
"bottom";
387 text.foreground =
true;
388 text.hideWhenInMenu =
true;
390 if (
self IsSplitscreen() )
393 text.fontscale = 1.2;
397 text.fontscale = 1.6;
400 text setText( &
"PLATFORM_PRESS_TO_CANCEL_TACTICAL_INSERTION" );
410 foreach( player
in level.players )
412 if ( isdefined( player.tacticalInsertion ))
414 tac_inserts[ tac_inserts.size ] = player.tacticalInsertion;
425 if ( isdefined( attacker ))
433 if( isdefined( owner ))
435 owner endon(
"death" );
436 owner endon(
"disconnect" );
440 if( isdefined( level.globallogic_audio_dialog_on_player_override ) )
442 owner [[level.globallogic_audio_dialog_on_player_override]](
"tact_destroyed",
"item_destroyed" );
449 self endon(
"death" );
450 self endon(
"disconnect" );
452 self notify(
"insertionTrackingStart" );
453 self endon(
"insertionTrackingStart" );
457 self waittill (
"grenade_fire", grenade, weapon, cookTime );
464 if ( weapon == level.weaponTacticalInsertion )
466 grenade thread
watch(
self );