1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\challenges_shared;
6 #using scripts\shared\clientfield_shared;
7 #using scripts\shared\dev_shared;
8 #using scripts\shared\damagefeedback_shared;
9 #using scripts\shared\entityheadicons_shared;
10 #using scripts\shared\flagsys_shared;
11 #using scripts\shared\hud_util_shared;
12 #using scripts\shared\player_shared;
13 #using scripts\shared\scoreevents_shared;
14 #using scripts\shared\system_shared;
15 #using scripts\shared\util_shared;
16 #using scripts\shared\vehicle_shared;
17 #using scripts\shared\weapons_shared;
18 #using scripts\shared\weapons\_hive_gun;
19 #using scripts\shared\weapons\_satchel_charge;
20 #using scripts\shared\weapons\_trophy_system;
21 #using scripts\shared\weapons\_weaponobjects;
23 #insert scripts\shared\shared.gsh;
24 #insert scripts\shared\version.gsh;
25 #insert scripts\shared\weapons\_weaponobjects.gsh;
27 #define MAX_PROJECTILE_WEAPONOBJECTS 4
29 #precache( "lui_menu_data", "spikeLauncherCounter.spikesReady" );
30 #precache( "lui_menu_data", "spikeLauncherCounter.blasting" );
32 #precache( "string", "MP_DEFUSING_EXPLOSIVE" );
33 #precache( "string", "PLATFORM_SATCHEL_CHARGE_DOUBLE_TAP" );
35 #precache( "fx", "_t6/weapon/claymore/fx_claymore_laser" );
36 #precache( "fx", "explosions/fx_exp_equipment_lg" );
37 #precache( "fx", "killstreaks/fx_emp_explosion_equip" );
38 #precache( "fx", "_t6/explosions/fx_exp_equipment" );
39 #precache( "fx", "explosions/fx_exp_equipment_lg" );
40 #precache( "fx", "weapon/fx_equip_light_os" );
42 #precache( "triggerstring", "MP_BOUNCINGBETTY_HACKING" );
43 #precache( "triggerstring", "MP_BOUNCINGBETTY_PICKUP" );
44 #precache( "triggerstring", "MP_HATCHET_PICKUP");
45 #precache( "triggerstring", "MP_CLAYMORE_PICKUP");
46 #precache( "triggerstring", "MP_BOUNCINGBETTY_PICKUP");
47 #precache( "triggerstring", "MP_TROPHY_SYSTEM_PICKUP");
48 #precache( "triggerstring", "MP_ACOUSTIC_SENSOR_PICKUP");
49 #precache( "triggerstring", "MP_CAMERA_SPIKE_PICKUP");
50 #precache( "triggerstring", "MP_SATCHEL_CHARGE_PICKUP");
51 #precache( "triggerstring", "MP_SCRAMBLER_PICKUP");
52 #precache( "triggerstring", "MP_SHOCK_CHARGE_PICKUP");
53 #precache( "triggerstring", "MP_TROPHY_SYSTEM_DESTROY");
54 #precache( "triggerstring", "MP_SENSOR_GRENADE_DESTROY");
55 #precache( "triggerstring", "MP_CLAYMORE_HACKING");
56 #precache( "triggerstring", "MP_BOUNCINGBETTY_HACKING");
57 #precache( "triggerstring", "MP_TROPHY_SYSTEM_HACKING");
58 #precache( "triggerstring", "MP_ACOUSTIC_SENSOR_HACKING");
59 #precache( "triggerstring", "MP_CAMERA_SPIKE_HACKING");
60 #precache( "triggerstring", "MP_SATCHEL_CHARGE_HACKING");
61 #precache( "triggerstring", "MP_SCRAMBLER_HACKING");
63 #namespace weaponobjects;
77 level.weaponObjectDebug = GetDvarInt(
"scr_weaponobject_debug", 0 );
79 level.supplementalWatcherObjects = [];
90 level.weaponObjectDebug = GetDvarInt(
"scr_weaponobject_debug", 0 );
98 coneangle = GetDvarInt(
"scr_weaponobject_coneangle", 70 );
99 mindist = GetDvarInt(
"scr_weaponobject_mindist", 20 );
100 graceperiod = GetDvarFloat(
"scr_weaponobject_graceperiod", 0.6 );
101 radius = GetDvarInt(
"scr_weaponobject_radius", 192 );
106 level.watcherWeapons = [];
107 level.watcherWeapons = getWatcherWeapons();
109 level.retrievableWeapons = [];
110 level.retrievableWeapons = getRetrievableWeapons();
112 level.weaponobjectexplodethisframe =
false;
114 if ( GetDvarString(
"scr_deleteexplosivesonspawn") ==
"" )
116 SetDvar(
"scr_deleteexplosivesonspawn", 1);
119 level.deleteExplosivesOnSpawn = GetDvarInt(
"scr_deleteexplosivesonspawn");
121 level.claymoreFXid =
"_t6/weapon/claymore/fx_claymore_laser";
122 level._equipment_spark_fx =
"explosions/fx_exp_equipment_lg";
123 level._equipment_fizzleout_fx =
"explosions/fx_exp_equipment_lg";
124 level._equipment_emp_destroy_fx =
"killstreaks/fx_emp_explosion_equip";
125 level._equipment_explode_fx =
"_t6/explosions/fx_exp_equipment";
126 level._equipment_explode_fx_lg =
"explosions/fx_exp_equipment_lg";
127 level._effect[
"powerLight" ] =
"weapon/fx_equip_light_os";
131 level.weaponobjects_hacker_trigger_width = 32;
132 level.weaponobjects_hacker_trigger_height = 32;
163 if ( isdefined( level._weaponobjects_on_player_connect_override ) )
165 level thread [[level._weaponobjects_on_player_connect_override]]();
169 self.usedWeapons =
false;
175 self endon(
"disconnect");
177 pixbeginevent(
"onPlayerSpawned");
179 if ( !isdefined(
self.watchersInitialized ) )
201 self.watchersInitialized =
true;
213 if ( !isdefined(
self.weaponObjectWatcherArray) )
220 foreach( watcher
in self.weaponObjectWatcherArray )
229 foreach( index, weapon
in level.watcherWeapons )
235 foreach( index, weapon
in level.retrievableWeapons )
244 for( i = 0; i < level.retrievableWeapons.size; i++ )
247 if( isdefined( watcher ) )
249 if( !isdefined( watcher.onSpawnRetrieveTriggers ) )
252 if ( !isdefined( watcher.onDestroyed ))
255 if( !isdefined( watcher.pickUp ) )
267 if (
IS_TRUE( level.b_crossbow_bolt_destroy_on_impact ) )
287 if (
IS_TRUE( level.b_create_upgraded_crossbow_watchers ) )
306 watcher.playDestroyedDialog =
false;
313 watcher.altDetonate =
false;
314 watcher.headIcon =
false;
315 watcher.isMovable =
true;
316 watcher.ownerGetsAssist =
true;
317 watcher.playDestroyedDialog =
false;
318 watcher.deleteOnKillbrush =
false;
320 watcher.onDetonateCallback = level.rcbombOnBlowUp;
321 watcher.stunTime = 1;
322 watcher.notEquipment =
true;
329 watcher.altDetonate =
false;
330 watcher.headIcon =
false;
331 watcher.isMovable =
true;
332 watcher.ownerGetsAssist =
true;
333 watcher.playDestroyedDialog =
false;
334 watcher.deleteOnKillbrush =
false;
336 watcher.onDetonateCallback = level.qrdroneOnBlowUp;
337 watcher.onDamage = level.qrdroneOnDamage;
338 watcher.stunTime = 5;
339 watcher.notEquipment =
true;
345 currentItemCount = 0;
346 foreach ( obj
in watcher.objectArray )
348 if ( IsDefined(obj) && obj.item !== watcher.weapon )
353 return currentItemCount;
358 self endon(
"death" );
359 lastItemCount = undefined;
362 self waittill(
"weapon_change", weapon );
364 while ( weapon.name ==
"spike_launcher" )
369 if ( currentItemCount !== lastItemCount )
371 self SetControllerUIModelValue(
"spikeLauncherCounter.spikesReady", currentItemCount );
372 lastItemCount = currentItemCount;
376 weapon =
self GetCurrentWeapon();
385 if ( spikeCount > 0 )
387 self SetControllerUIModelValue(
"spikeLauncherCounter.blasting", 1 );
389 self SetControllerUIModelValue(
"spikeLauncherCounter.blasting", 0 );
396 watcher.altName =
"spike_charge";
397 watcher.altWeapon = GetWeapon(
"spike_charge" );
398 watcher.altDetonate =
false;
399 watcher.watchForFire =
true;
400 watcher.hackable =
true;
401 watcher.hackerToolRadius = level.equipmentHackerToolRadius;
402 watcher.hackerToolTimeMs = level.equipmentHackerToolTimeMs;
403 watcher.headIcon =
false;
406 watcher.stunTime = 1;
407 watcher.ownerGetsAssist =
true;
408 watcher.detonateStationary =
false;
409 watcher.detonationDelay = 0.0;
410 watcher.detonationSound =
"wpn_claymore_alert";
419 watcher.altDetonate =
true;
420 watcher.headIcon =
false;
422 watcher.notEquipment =
true;
428 watcher.watchForFire =
true;
430 watcher.activateSound =
"wpn_claymore_alert";
431 watcher.hackable =
true;
432 watcher.hackerToolRadius = level.equipmentHackerToolRadius;
433 watcher.hackerToolTimeMs = level.equipmentHackerToolTimeMs;
434 watcher.ownerGetsAssist =
true;
436 detectionConeAngle = GetDvarInt(
"scr_weaponobject_coneangle" );
437 watcher.detectionDot = cos( detectionConeAngle );
438 watcher.detectionMinDist = GetDvarInt(
"scr_weaponobject_mindist" );
439 watcher.detectionGracePeriod = GetDvarFloat(
"scr_weaponobject_graceperiod" );
440 watcher.detonateRadius = GetDvarInt(
"scr_weaponobject_radius" );
442 watcher.stunTime = 1;
479 if ( !isdefined(
self ) )
482 if ( isdefined(
self.mineMover ) )
484 if ( isdefined(
self.mineMover.killCamEnt ) )
486 self.mineMover.killCamEnt
delete();
489 self.mineMover
delete();
497 if ( isdefined(
self.objectArray ) )
499 foreach( weaponObject
in self.objectArray )
505 self.objectArray = [];
511 if (!IsDefined(
self.owner.spikeDelay))
513 self.owner.spikeDelay = 0;
515 const delayTimeIncrement = 0.3;
516 delayTime =
self.owner.spikeDelay;
518 self.owner.spikeDelay += delayTimeIncrement;
521 owner.spikeDelay -= delayTimeIncrement;
530 if ( IsDefined( weapon ) && weapon.isValid )
532 if ( isdefined( attacker ) )
548 if ( !isdefined( weapon ) || !weapon.isEmp )
565 if ( IsDefined( weapon ) && weapon.isEmp )
571 if ( isdefined( attacker ) )
573 if ( isdefined(
self.owner ) && ( attacker !=
self.owner ) )
575 self.playDialog =
true;
578 if ( IsPlayer( attacker ) )
580 self Detonate( attacker );
587 else if ( isdefined(
self.owner ) && isplayer(
self.owner ) )
589 self.playDialog =
false;
590 self Detonate(
self.owner );
600 level endon(
"game_ended" );
602 object endon(
"death" );
603 object endon(
"hacked" );
604 object endon(
"detonating" );
607 if (
object isOnGround() ==
false )
609 object waittill(
"stationary" );
617 object endon(
"death");
618 object endon(
"hacked");
620 if ( !isdefined( attacker ) && !isdefined( weapon ) &&
object.weapon.proximityalarmactivationdelay > 0 )
623 if (
IS_TRUE(
object.armed_detonation_wait ) )
628 object.armed_detonation_wait =
true;
630 while ( !
IS_TRUE(
object.proximity_deployed ) )
642 object.detonated =
true;
644 object notify(
"detonating" );
646 isEmpDetonated = IsDefined( weapon ) && weapon.isemp;
648 if ( isEmpDetonated &&
object.weapon.doEmpDestroyFx )
650 object.stun_fx =
true;
652 PlayFX( level._equipment_emp_destroy_fx,
object.origin + ( 0, 0, 5 ) , ( 0, RandomFloat( 360 ), 0 ) );
656 if ( !isdefined(
self.onDetonateCallback ) )
661 if ( !isEmpDetonated && !isdefined( weapon ) )
663 if ( isdefined(
self.detonationDelay ) &&
self.detonationDelay > 0.0 )
665 if ( isdefined(
self.detonationSound ) )
667 object playsound (
self.detonationSound );
670 delay =
self.detonationDelay;
673 else if ( isdefined( empFxDelay ) )
684 if ( isdefined( attacker ) && IsPlayer( attacker ) && isdefined( attacker.pers[
"team"] ) && isdefined(
object.owner ) && isdefined(
object.owner.pers[
"team"] ) )
686 if ( level.teambased )
688 if ( attacker.pers[
"team"] !=
object.owner.pers[
"team"] )
690 attacker notify(
"destroyed_explosive");
696 if ( attacker !=
object.owner )
698 attacker notify(
"destroyed_explosive");
704 object [[
self.onDetonateCallback]]( attacker, weapon, undefined );
709 object endon(
"death");
710 object endon(
"hacked");
713 if ( isdefined(
object.detonated ) &&
object.detonated ==
true )
718 object.detonated =
true;
720 object notify(
"fizzleout" );
727 if ( !isdefined(
self.onFizzleOut ) )
733 object [[
self.onFizzleOut]]();
739 if ( isdefined(
self.objectArray) )
741 for ( i = 0; i <
self.objectArray.size; i++ )
743 if ( isdefined(
self.objectArray[i] ) )
746 if (
self.objectArray[i] isstunned() && forceDetonation ==
false )
748 undetonated[undetonated.size] =
self.objectArray[i];
752 if ( isdefined( weapon ) )
755 if ( weapon
util::isHacked() && weapon.name !=
self.objectArray[i].weapon.name )
757 undetonated[undetonated.size] =
self.objectArray[i];
761 else if (
self.objectArray[i]
util::isHacked() && weapon.name !=
self.objectArray[i].weapon.name )
763 undetonated[undetonated.size] =
self.objectArray[i];
769 if ( isdefined(
self.detonateStationary ) &&
self.detonateStationary && forceDetonation ==
false )
775 self thread
waitAndDetonate(
self.objectArray[i], 0.0, undefined, weapon );
781 self.objectArray = undetonated;
787 assert( isdefined( watcher ),
"Weapon object watcher " + watcherName +
" does not exist" );
794 if( !isdefined( watcher.storeDifferentObject ) )
795 watcher.objectArray[watcher.objectArray.size] = weapon_instance;
797 if ( !IsDefined( weapon ) )
799 weapon = watcher.weapon;
802 weapon_instance.owner =
self;
803 weapon_instance.detonated =
false;
804 weapon_instance.weapon = weapon;
806 if( isdefined( watcher.onDamage ) )
808 weapon_instance thread [[watcher.onDamage]]( watcher );
815 weapon_instance.ownerGetsAssist = watcher.ownerGetsAssist;
816 weapon_instance.destroyedByEmp = watcher.destroyedByEmp;
818 if ( isdefined( watcher.onSpawn ) )
819 weapon_instance thread [[watcher.onSpawn]]( watcher, self );
821 if ( isdefined( watcher.onSpawnFX ) )
822 weapon_instance thread [[watcher.onSpawnFX]]();
826 if( isdefined( watcher.onSpawnRetrieveTriggers ) )
827 weapon_instance thread [[watcher.onSpawnRetrieveTriggers]](watcher,
self);
829 if ( watcher.hackable )
832 if( watcher.playDestroyedDialog )
838 if( watcher.deleteOnKillbrush )
840 if ( isdefined ( level.deleteOnKillbrushOverride ) )
842 weapon_instance thread [[level.deleteOnKillbrushOverride]](
self, watcher );
855 if ( watcher.timeOut )
867 self waittill(
"death" );
869 if ( isdefined( watcher ) && isdefined( watcher.objectarray ) )
882 self endon(
"death" );
884 wait ( watcher.timeOut );
891 e_player endon(
"disconnect" );
892 self endon(
"death" );
894 e_player waittill(
"delete_weapon_objects" );
903 if ( !isdefined( watcher ) )
914 ArrayRemoveValue( watcher.objectArray, weapon_ent );
924 if ( isdefined( weapon ) && isdefined( attacker ) )
926 if ( weapon.doDamageFeedback )
929 if ( level.teambased &&
self.owner.team != attacker.team )
935 else if ( !level.teambased &&
self.owner != attacker )
946 self endon(
"death" );
947 self endon(
"hacked" );
948 self endon(
"detonating" );
950 self setcandamage(
true);
951 self.maxhealth = 100000;
952 self.health =
self.maxhealth;
953 self.damageTaken = 0;
955 attacker = undefined;
959 self waittill (
"damage",
damage, attacker, direction_vec, point, type, modelName, tagName, partName, weapon, iDFlags );
963 if ( !isPlayer( attacker ) && isdefined( attacker.owner ) )
965 attacker = attacker.owner;
968 if ( isdefined( weapon ) )
975 if ( watcher.stunTime > 0 && weapon.doStun )
977 self thread
stunStart( watcher, watcher.stunTime );
983 if ( level.teambased && IsPlayer( attacker ) && isdefined(
self.owner ) )
986 if( !level.hardcoreMode &&
self.owner.team == attacker.pers[
"team"] &&
self.owner != attacker )
992 if ( IsDefined( watcher.shouldDamage ) && !(
self [[watcher.shouldDamage]]( watcher, attacker, weapon,
damage )) )
1007 if ( level.weaponobjectexplodethisframe )
1008 wait .1 + randomfloat(.4);
1012 if (!isdefined(
self))
1015 level.weaponobjectexplodethisframe =
true;
1021 if ( isdefined( type ) && (isSubStr( type,
"MOD_GRENADE_SPLASH" ) || isSubStr( type,
"MOD_GRENADE" ) || isSubStr( type,
"MOD_EXPLOSIVE" )) )
1022 self.wasChained =
true;
1026 self.wasDamagedFromBulletPenetration =
true;
1030 self.wasDamaged =
true;
1040 owner endon(
"death");
1041 owner endon(
"disconnect");
1042 self endon(
"hacked" );
1044 self waittill(
"death" );
1046 if( isdefined(
self.playDialog) &&
self.playDialog )
1048 if( isdefined( level.playEquipmentDestroyedOnPlayer ) )
1050 owner [[level.playEquipmentDestroyedOnPlayer]]( );
1057 owner endon(
"death");
1058 owner endon(
"disconnect");
1059 self endon(
"hacked" );
1060 self endon(
"death" );
1064 self waittill(
"damage",
damage, attacker );
1066 if( isdefined(attacker) && isPlayer(attacker) && attacker != owner )
1068 self.playDialog =
true;
1072 self.playDialog =
false;
1079 self endon (
"death" );
1086 if ( isdefined(
self.cameraHead ) )
1093 if ( isdefined( watcher.onStun ) )
1094 self thread [[watcher.onStun]]();
1096 if ( watcher.name ==
"rcbomb" )
1101 if ( isdefined( time ) )
1110 if ( watcher.name ==
"rcbomb" )
1120 self notify (
"not_stunned" );
1121 if ( isdefined(
self.cameraHead ) )
1130 self endon(
"death" );
1131 self endon(
"not_stunned" );
1133 origin =
self GetTagOrigin(
"tag_fx" );
1135 if ( !isdefined( origin ) )
1137 origin =
self.origin + ( 0, 0, 10 );
1140 self.stun_fx =
spawn(
"script_model", origin );
1141 self.stun_fx SetModel(
"tag_origin" );
1145 PlayFXOnTag( level._equipment_spark_fx,
self.stun_fx,
"tag_origin" );
1158 return ( isdefined(
self.stun_fx ) );
1163 self endon(
"death" );
1165 PlayFX( level._equipment_fizzleout_fx,
self.origin );
1173 level.weaponobjectexplodethisframe =
false;
1178 if ( !isdefined(
self.weaponObjectWatcherArray) )
1183 for ( watcher = 0; watcher <
self.weaponObjectWatcherArray.size; watcher++ )
1185 if (
self.weaponObjectWatcherArray[watcher].
name ==
name || (isdefined(
self.weaponObjectWatcherArray[watcher].altName) &&
self.weaponObjectWatcherArray[watcher].altName ==
name) )
1187 return self.weaponObjectWatcherArray[watcher];
1196 if ( !isdefined(
self.weaponObjectWatcherArray) )
1201 if ( !isdefined( weapon ) )
1206 for ( watcher = 0; watcher <
self.weaponObjectWatcherArray.size; watcher++ )
1208 if ( isdefined(
self.weaponObjectWatcherArray[watcher].weapon) && (
self.weaponObjectWatcherArray[watcher].weapon == weapon ||
self.weaponObjectWatcherArray[watcher].weapon == weapon.rootWeapon ) )
1210 return self.weaponObjectWatcherArray[watcher];
1212 if ( isdefined(
self.weaponObjectWatcherArray[watcher].weapon) && isdefined(
self.weaponObjectWatcherArray[watcher].altWeapon) &&
self.weaponObjectWatcherArray[watcher].altWeapon == weapon )
1214 return self.weaponObjectWatcherArray[watcher];
1223 if ( watcher.deleteOnPlayerSpawn == 1 || ( isdefined( watcher.ownerTeam ) && watcher.ownerTeam != ownerTeam ) )
1225 self notify(
"weapon_object_destroyed" );
1230 watcher.ownerTeam = ownerTeam;
1235 if ( !isdefined(
self.weaponObjectWatcherArray) )
1237 self.weaponObjectWatcherArray = [];
1242 if ( !isdefined( weaponObjectWatcher ) )
1244 weaponObjectWatcher = SpawnStruct();
1245 self.weaponObjectWatcherArray[
self.weaponObjectWatcherArray.size] = weaponObjectWatcher;
1247 weaponObjectWatcher.name = weaponname;
1248 weaponObjectWatcher.type =
"use";
1249 weaponObjectWatcher.weapon = GetWeapon( weaponname );
1250 weaponObjectWatcher.watchForFire =
false;
1251 weaponObjectWatcher.hackable =
false;
1252 weaponObjectWatcher.altDetonate =
false;
1253 weaponObjectWatcher.detectable =
true;
1254 weaponObjectWatcher.headIcon =
false;
1255 weaponObjectWatcher.stunTime = 0;
1256 weaponObjectWatcher.timeOut = 0;
1257 weaponObjectWatcher.destroyedByEmp =
true;
1258 weaponObjectWatcher.activateSound = undefined;
1259 weaponObjectWatcher.ignoreDirection = undefined;
1260 weaponObjectWatcher.immediateDetonation = undefined;
1261 weaponObjectWatcher.deploySound = weaponObjectWatcher.weapon.firesound;
1262 weaponObjectWatcher.deploySoundPlayer = weaponObjectWatcher.weapon.firesoundplayer;
1263 weaponObjectWatcher.pickUpSound = weaponObjectWatcher.weapon.pickupsound;
1264 weaponObjectWatcher.pickUpSoundPlayer = weaponObjectWatcher.weapon.pickupsoundplayer;
1265 weaponObjectWatcher.altWeapon = weaponObjectWatcher.weapon.altweapon;
1266 weaponObjectWatcher.ownerGetsAssist =
false;
1267 weaponObjectWatcher.playDestroyedDialog =
true;
1268 weaponObjectWatcher.deleteOnKillbrush =
true;
1269 weaponObjectWatcher.deleteOnDifferentObjectSpawn =
true;
1270 weaponObjectWatcher.enemyDestroy =
false;
1271 weaponObjectWatcher.deleteOnPlayerSpawn = level.deleteExplosivesOnSpawn;
1272 weaponObjectWatcher.ignoreVehicles =
false;
1273 weaponObjectWatcher.ignoreAI =
false;
1274 weaponObjectWatcher.activationDelay = 0;
1277 weaponObjectWatcher.onSpawn = undefined;
1278 weaponObjectWatcher.onSpawnFX = undefined;
1279 weaponObjectWatcher.onSpawnRetrieveTriggers = undefined;
1280 weaponObjectWatcher.onDetonateCallback = undefined;
1281 weaponObjectWatcher.onStun = undefined;
1282 weaponObjectWatcher.onStunFinished = undefined;
1283 weaponObjectWatcher.onDestroyed = undefined;
1285 weaponObjectWatcher.shouldDamage = undefined;
1286 weaponObjectWatcher.onSupplementalDetonateCallback = undefined;
1288 if ( !isdefined( weaponObjectWatcher.objectArray ) )
1289 weaponObjectWatcher.objectArray = [];
1294 return weaponObjectWatcher;
1301 weaponObjectWatcher.type =
"use";
1304 return weaponObjectWatcher;
1311 weaponObjectWatcher.type =
"proximity";
1314 detectionConeAngle = GetDvarInt(
"scr_weaponobject_coneangle" );
1315 weaponObjectWatcher.detectionDot = cos( detectionConeAngle );
1316 weaponObjectWatcher.detectionMinDist = GetDvarInt(
"scr_weaponobject_mindist" );
1317 weaponObjectWatcher.detectionGracePeriod = GetDvarFloat(
"scr_weaponobject_graceperiod" );
1318 weaponObjectWatcher.detonateRadius = GetDvarInt(
"scr_weaponobject_radius" );
1320 return weaponObjectWatcher;
1325 level endon (
"game_ended" );
1326 self endon (
"death" );
1327 self endon (
"hacked" );
1329 if ( watcher.detectable )
1336 if ( watcher.headIcon && level.teamBased )
1340 if ( isdefined(
self ) )
1342 offset =
self.weapon.weaponHeadObjectiveHeight;
1344 v_up = AnglesToUp(
self.angles );
1345 x_offset = abs( v_up[0] );
1346 y_offset = abs( v_up[1] );
1347 z_offset = abs( v_up[2] );
1349 if( x_offset > y_offset && x_offset > z_offset )
1353 else if( y_offset > x_offset && y_offset > z_offset )
1357 else if( z_offset > x_offset && z_offset > y_offset )
1359 v_up = v_up * ( 0, 0, 1 );
1362 up_offset_modified = v_up * offset;
1363 up_offset = AnglesToUp(
self.angles ) * offset;
1365 objective = GetEquipmentHeadObjective(
self.weapon );
1374 return isdefined(
self.owner.ProximityAmlarmEnt ) &&
self.owner.ProximityAmlarmEnt ==
self;
1379 if ( !IsDefined(
self.owner ) || !IsPlayer(
self.owner ) )
1384 if ( active && !isdefined(
self.owner.ProximityAmlarmEnt ) )
1386 self.owner.ProximityAmlarmEnt =
self;
1394 self.owner.ProximityAmlarmEnt = undefined;
1404 level endon (
"game_ended" );
1405 self endon (
"death" );
1406 self endon (
"hacked" );
1407 self endon(
"detonating" );
1409 if (
self.weapon.proximityalarminnerradius <= 0 )
1416 delayTimeSec =
self.weapon.proximityalarmactivationdelay / 1000;
1418 if ( delayTimeSec > 0 )
1422 if ( !IsDefined(
self ) )
1428 if( !
IS_TRUE(
self.owner._disable_proximity_alarms ) )
1434 self.proximity_deployed =
true;
1436 alarmStatusOld =
"notify";
1437 alarmStatus =
"off";
1446 if ( !IsDefined(
self.owner ) || !IsPlayer(
self.owner ) )
1457 if(
IS_TRUE(
self.owner._disable_proximity_alarms ) )
1461 else if ( (alarmStatus != alarmStatusOld) || (alarmStatus ==
"on" && !isdefined(
self.owner.ProximityAmlarmEnt )) )
1463 if ( alarmStatus ==
"on" )
1466 if ( alarmStatusOld ==
"off" && isdefined( watcher ) && isdefined( watcher.proximityAlarmActivateSound ) )
1471 playsoundatposition( watcher.proximityAlarmActivateSound , (
self.origin + (0,0,32)) );
1483 alarmStatusOld = alarmStatus;
1486 alarmStatus =
"off";
1488 actors = GetActorArray();
1489 players = Getplayers();
1490 detectEntities = arraycombine( players, actors,
false,
false );
1492 foreach ( entity
in detectEntities )
1496 if ( !isdefined( entity ) )
1502 if( IsActor( entity ) && ( !isDefined( entity.isAiClone ) || !entity.isAiClone ) )
1506 else if( isActor( entity ) )
1508 owner = entity.owner;
1511 if ( entity.team ==
"spectator" )
1516 if ( level.weaponObjectDebug != 1 )
1518 if( owner HasPerk(
"specialty_detectexplosive" ) )
1522 if ( isdefined(
self.owner ) && owner ==
self.owner )
1532 if (
self isstunned() )
1535 if( !IsAlive( entity ) )
1538 if ( isdefined( watcher.immunespecialty ) && owner hasPerk( watcher.immunespecialty ) )
1541 radius =
self.weapon.proximityalarmouterradius;
1542 distanceSqr = DistanceSquared(
self.origin, entity.origin );
1544 if ( radius * radius < distanceSqr )
1550 if ( entity damageConeTrace(
self.origin,
self ) == 0 )
1556 if ( alarmStatusOld ==
"on" )
1563 radius =
self.weapon.proximityalarminnerradius;
1565 if ( radius * radius < distanceSqr )
1582 if ( level.weaponObjectDebug == 1 )
1605 self.protected_entities = [];
1609 if ( isdefined( level._proximityWeaponObjectDetonation_override ) )
1611 self thread [[level._proximityWeaponObjectDetonation_override]]( watcher );
1619 if ( level.weaponObjectDebug == 1 )
1628 self endon(
"disconnect" );
1630 if ( !isdefined(
self.weaponObjectWatcherArray) )
1632 self.weaponObjectWatcherArray = [];
1647 self notify(
"watchWeaponObjectSpawn_" + notify_type );
1648 self endon(
"watchWeaponObjectSpawn_" + notify_type );
1649 self endon(
"disconnect" );
1653 self waittill( notify_type, weapon_instance, weapon );
1655 if( (
IS_BONUSZM ||
IS_TRUE( level.projectiles_should_ignore_world_pause ) ) && IsDefined( weapon_instance ) )
1657 weapon_instance SetIgnorePauseWorld(
true );
1663 self AddWeaponStat( weapon,
"used", 1 );
1667 if ( isdefined( watcher ) )
1672 if ( weapon.maxinstancesallowed )
1676 if( watcher.objectarray.size > (weapon.maxinstancesallowed - 1))
1679 watcher.objectarray[0] = undefined;
1692 objectsInWorld =
false;
1693 for( i = 0; i <
self.weaponObjectWatcherArray.size; i++)
1695 if(
self.weaponObjectWatcherArray[i].weapon != weapon )
1698 if( isdefined(
self.weaponObjectWatcherArray[i].onDetonateCallback ) &&
self.weaponObjectWatcherArray[i].objectarray.size > 0 )
1700 objectsInWorld =
true;
1704 return objectsInWorld;
1710 self endon(
"death");
1714 if ( isdefined( innerRadius ) )
1719 if ( isdefined( outerRadius ) )
1730 self endon(
"death");
1734 if ( !isdefined(
self ) )
1739 self thread
proximitySphere(
self.origin,
self.weapon.proximityalarminnerradius, (0,0.75,0),
self.weapon.proximityalarmouterradius, (0,0.75,0) );
1744 self endon(
"death");
1748 if ( !isdefined(
self ) )
1753 if( isdefined( watcher.ignoreDirection ) )
1755 self thread
proximitySphere(
self.origin, watcher.detonateRadius, (1,.85,0),
self.weapon.explosionRadius, (1,0,0) );
1759 self thread
showCone( acos( watcher.detectionDot ), watcher.detonateRadius, (1,.85,0) );
1760 self thread
showCone( 60, 256, (1,0,0) );
1766 self endon(
"death");
1768 start =
self.origin;
1769 forward = anglestoforward(
self.angles);
1770 right = vectorcross( forward, (0,0,1) );
1771 up = vectorcross( forward, right );
1773 fullforward = forward * range * cos( angle );
1774 sideamnt = range * sin( angle );
1778 prevpoint = (0,0,0);
1779 for ( i = 0; i <= 20; i++ )
1781 coneangle = i/20.0 * 360;
1782 point = start + fullforward + sideamnt * (right * cos(coneangle) + up * sin(coneangle));
1785 line( start, point, color );
1786 line( prevpoint, point, color );
1797 self endon (
"end_detection" );
1798 level endon (
"game_ended" );
1799 self endon (
"death" );
1800 self endon (
"hacked" );
1802 if ( !level.teambased )
1805 self.detectId =
"rcBomb" + getTime() + randomInt( 1000000 );
1811 icon.x = item.origin[0];
1812 icon.y = item.origin[1];
1813 icon.z = item.origin[2]+heightIncrease;
1818 self endon (
"death" );
1819 self endon (
"hacked" );
1820 self endon(
"detonating" );
1829 trigger =
spawn(
"trigger_radius",
self.origin-(0,0,128), 0, 512, 256 );
1830 trigger.detectId =
"trigger" + getTime() + randomInt( 1000000 );
1832 trigger SetHintLowPriority(
true );
1835 trigger notify (
"end_detection" );
1837 if ( isdefined( trigger.bombSquadIcon ) )
1845 self endon(
"death" );
1847 assert( IsPlayer( owner ) );
1849 ownerTeam = owner.pers[
"team"];
1853 if ( level.teamBased && isdefined( ownerTeam ) )
1855 self SetVisibleToAllExceptTeam( ownerTeam );
1856 self SetExcludeTeamForTrigger( ownerTeam );
1860 self SetVisibleToAll();
1861 self SetTeamForTrigger(
"none" );
1864 if ( isdefined( owner ) )
1866 self SetInvisibleToPlayer( owner );
1875 self endon(
"death" );
1877 self notify(
"landed" );
1886 if ( event ==
"death" )
1891 triggerOrigin =
self.origin;
1892 if (
"" !=
self.weapon.hackerTriggerOriginTag )
1894 triggerOrigin =
self GetTagOrigin(
self.weapon.hackerTriggerOriginTag );
1898 self.hackerTrigger =
spawn(
"trigger_radius_use", triggerOrigin, level.weaponobjects_hacker_trigger_width, level.weaponobjects_hacker_trigger_height );
1904 self.hackerTrigger SetHintLowPriority(
true );
1905 self.hackerTrigger SetCursorHint(
"HINT_NOICON",
self );
1906 self.hackerTrigger SetIgnoreEntForTrigger(
self );
1908 self.hackerTrigger EnableLinkTo();
1909 self.hackerTrigger LinkTo(
self );
1911 if( isdefined( level.hackerHints[
self.weapon.name] ) )
1913 self.hackerTrigger SetHintString( level.hackerHints[
self.weapon.name].hint );
1917 self.hackerTrigger SetHintString( &
"MP_GENERIC_HACKING" );
1921 self.hackerTrigger SetPerkForTrigger(
"specialty_disarmexplosive" );
1924 self thread
hackerThink(
self.hackerTrigger, watcher );
1929 self endon(
"death" );
1933 trigger waittill(
"trigger", player, instant );
1935 if ( !isdefined( instant ) && !trigger
hackerResult( player,
self.owner ) )
1953 if( isdefined( level.playEquipmentHackedOnPlayer ) )
1955 self.owner [[level.playEquipmentHackedOnPlayer]]( );
1958 if (
self.weapon.ammoCountEquipment > 0 && isdefined(
self.ammo ) )
1960 ammoLeftEquipment =
self.ammo;
1962 if (
self.weapon.rootWeapon == GetWeapon(
"trophy_system" ) )
1969 self SetMissileOwner( player );
1970 self SetTeam( player.pers[
"team"] );
1971 self.owner = player;
1974 if (
self.weapon.doHackedStats )
1977 player AddWeaponStat( GetWeapon(
"pda_hack" ),
"CombatRecordStat", 1 );
1983 if (
self.weapon.rootWeapon == level.weaponSatchelCharge && isdefined( player.lowerMessage ) )
1985 player.lowerMessage SetText( &
"PLATFORM_SATCHEL_CHARGE_DOUBLE_TAP" );
1986 player.lowerMessage.alpha = 1;
1987 player.lowerMessage FadeOverTime( 2.0 );
1988 player.lowerMessage.alpha = 0;
1992 self notify(
"hacked", player );
1993 level notify(
"hacked",
self, player );
1995 if ( isdefined(
self.cameraHead ) )
1997 self.cameraHead notify(
"hacked", player );
2006 if ( isdefined( player ) && player.sessionstate ==
"playing" )
2009 player notify(
"grenade_fire",
self,
self.weapon,
true );
2019 self endon(
"hack_done" );
2020 self waittill(
"death" );
2022 if ( isdefined( player ) )
2025 player EnableWeapons();
2033 hackTime = GetDvarfloat(
"perk_disarmExplosiveTime" );
2035 if ( !
canHack( player, owner,
true ) )
2042 while ( time + ( hackTime * 1000 ) > GetTime() )
2044 if ( !
canHack( player, owner,
false ) )
2050 if ( !player UseButtonPressed() )
2056 if ( !isdefined(
self ) )
2071 player DisableWeapons();
2073 if ( !isdefined(
self.progressBar ) )
2076 self.progressBar.lastUseRate = -1;
2081 self.progressText setText( &
"MP_HACKING" );
2083 player PlayLocalSound (
"evt_hacker_hacking" );
2089 if ( isdefined( player ) )
2092 player EnableWeapons();
2095 if ( isdefined(
self.progressBar ) )
2101 if ( isdefined(
self ) )
2103 self notify(
"hack_done" );
2111 if ( !isdefined( player ) )
2114 if ( !IsPlayer( player ) )
2117 if ( !IsAlive( player ) )
2120 if ( !isdefined( owner ) )
2123 if ( owner == player )
2126 if ( level.teambased && player.team == owner.team )
2129 if ( ( isdefined( player.isDefusing ) && player.isDefusing ) )
2132 if ( ( isdefined( player.isPlanting ) && player.isPlanting ) )
2135 if ( isdefined( player.proxBar ) && !player.proxBar.hidden )
2138 if ( isdefined( player.revivingTeammate ) && player.revivingTeammate ==
true )
2141 if ( !player IsOnGround() )
2144 if ( player IsInVehicle() )
2147 if ( player IsWeaponViewOnlyLinked() )
2150 if ( !player HasPerk(
"specialty_disarmexplosive" ) )
2153 if ( player IsEMPJammed() )
2156 if ( isdefined( player.laststand ) && player.laststand )
2161 if ( player IsThrowingGrenade() )
2164 if ( player IsSwitchingWeapons() )
2167 if ( player IsMeleeing() )
2170 weapon = player GetCurrentWeapon();
2172 if ( !isdefined( weapon ) )
2175 if ( weapon == level.weaponNone )
2178 if ( weapon.isEquipment && player IsFiring() )
2181 if ( weapon.isSpecificUse )
2190 for( i = 0; i <
self.weaponObjectWatcherArray.size; i++)
2192 if(
self.weaponObjectWatcherArray[i].weapon != weapon_instance.weapon.rootWeapon )
2206 damagearea =
spawn(
"trigger_radius",
self.origin + (0,0,0-watcher.detonateRadius), level.aiTriggerSpawnFlags | level.vehicleTriggerSpawnFlags, watcher.detonateRadius, watcher.detonateRadius*2);
2207 damagearea EnableLinkTo();
2208 damagearea LinkTo(
self );
2217 if ( level.weaponObjectDebug != 1 )
2219 if ( isdefined(
self.owner ) && ent ==
self.owner )
2221 if ( IsVehicle( ent ) )
2223 if ( watcher.ignoreVehicles )
2226 if (
self.owner === ent.owner )
2233 if ( watcher.ignoreVehicles && IsAI( ent ) && !
IS_TRUE( ent.isAiClone ) )
2236 if ( ( lengthsquared( ent getVelocity() ) < 10 ) && !isdefined( watcher.immediateDetonation ) )
2242 if (
self isstunned() )
2245 if( IsPlayer( ent ) )
2247 if ( !IsAlive(ent) )
2250 if ( isdefined( watcher.immunespecialty ) && ent hasPerk( watcher.immunespecialty ) )
2259 self endon(
"death");
2263 ArrayRemoveValue(
self.protected_entities, ent );
2268 self endon(
"death");
2270 ent endon(
"disconnect");
2272 self.protected_entities[
self.protected_entities.size] = ent;
2277 radius_sqr = watcher.detonateRadius * watcher.detonateRadius;
2281 if ( DistanceSquared( ent.origin,
self.origin ) > radius_sqr )
2283 ArrayRemoveValue(
self.protected_entities, ent );
2293 if( !IsPlayer( ent ) )
2296 foreach( protected_ent
in self.protected_entities )
2298 if ( protected_ent == ent )
2302 linked_to =
self GetLinkedEnt();
2303 if (linked_to === ent )
2317 self endon(
"death" );
2318 self endon(
"hacked" );
2320 self notify(
"kill_target_detection" );
2322 if ( isdefined(watcher.activateSound) )
2324 self playsound (watcher.activateSound);
2327 wait watcher.detectionGracePeriod;
2329 if ( IsPlayer( ent ) && ent HasPerk(
"specialty_delayexplosive" ) )
2331 wait( GetDvarfloat(
"perk_delayExplosiveTime" ) );
2337 self.origin = traceOrigin;
2339 if ( isdefined(
self.owner ) && isplayer(
self.owner ) )
2341 self [[watcher.onDetonateCallback]](
self.owner, undefined, ent );
2345 self [[watcher.onDetonateCallback]]( undefined, undefined, ent );
2353 if ( watcher.activationDelay )
2355 wait( watcher.activationDelay );
2361 self endon(
"death" );
2363 dist = Distance( ent.origin,
self.origin );
2365 if ( isdefined(
self.activated_entity_distance ) )
2367 if ( dist <
self.activated_entity_distance )
2370 self notify(
"better_target" );
2379 self endon(
"better_target" );
2380 self.activated_entity_distance = dist;
2391 self endon(
"death" );
2392 self endon(
"hacked" );
2393 self endon(
"kill_target_detection" );
2399 up = AnglesToUp(
self.angles );
2400 traceOrigin =
self.origin + up;
2404 damagearea waittill(
"trigger", ent);
2412 if ( ent damageConeTrace( traceOrigin,
self ) > 0 )
2421 radius =
object.weapon.explosionRadius;
2422 distanceSqr = DistanceSquared(
self.origin,
object.origin );
2427 if ( radius * radius < distanceSqr )
2430 pos =
self.origin + (0,0,32);
2432 if( isdefined( watcher.ignoreDirection ) )
2437 dirToPos = pos -
object.origin;
2438 objectForward = anglesToForward(
object.angles );
2440 dist = vectorDot( dirToPos, objectForward );
2441 if ( dist < watcher.detectionMinDist )
2444 dirToPos = vectornormalize( dirToPos );
2446 dot = vectorDot( dirToPos, objectForward );
2447 return ( dot > watcher.detectionDot );
2454 if ( isdefined(ent) )
2460 player endon(
"disconnect" );
2461 self endon(
"death" );
2463 self waittill(
"stationary" );
2465 foreach ( trig
in a_killbrushes )
2467 if ( isdefined( trig ) &&
self IsTouching( trig ) )
2469 if ( !trig IsTriggerEnabled() )
2479 if (
self.origin[ 2 ] > player.origin[ 2 ] )
2484 if ( isdefined(
self ) )
2496 player endon(
"disconnect" );
2497 self endon(
"death" );
2498 self endon(
"stationary" );
2500 a_killbrushes = GetEntArray(
"trigger_hurt",
"classname" );
2506 a_killbrushes = GetEntArray(
"trigger_hurt",
"classname" );
2508 for ( i = 0; i < a_killbrushes.size; i++)
2510 if (
self IsTouching( a_killbrushes[ i ] ) )
2512 if ( !a_killbrushes[ i ] IsTriggerEnabled() )
2522 if(
self.origin[ 2 ] > player.origin[ 2 ] )
2527 if ( isdefined(
self ) )
2543 self endon(
"disconnect");
2547 self waittill(
"alt_detonate" );
2554 for ( watcher = 0; watcher <
self.weaponObjectWatcherArray.size; watcher++ )
2556 if (
self.weaponObjectWatcherArray[watcher].altDetonate )
2567 self endon(
"disconnect" );
2568 level endon(
"game_ended" );
2573 self waittill(
"doubletap_detonate" );
2580 self notify (
"alt_detonate" );
2588 self endon(
"disconnect" );
2592 self waittill(
"detonate" );
2594 if (
self isUsingOffhand() )
2596 weap =
self getCurrentOffhand();
2600 weap =
self getCurrentWeapon();
2605 if ( isdefined( watcher ) )
2607 if ( isdefined( watcher.onDetonationHandle ) )
2609 self thread [[watcher.onDetonationHandle]]( watcher );
2619 if ( !isdefined(
self.weaponObjectWatcherArray) )
2621 assert(
"Can't clean Up watechers" );
2630 for ( watcher = 0; watcher <
self.weaponObjectWatcherArray.size; watcher++ )
2632 weaponObjectWatcher = SpawnStruct();
2633 watchers[watchers.size] = weaponObjectWatcher;
2634 weaponObjectWatcher.objectArray = [];
2636 if ( isdefined(
self.weaponObjectWatcherArray[watcher].objectArray ) )
2638 weaponObjectWatcher.objectArray =
self.weaponObjectWatcherArray[watcher].objectArray;
2644 for ( watcher = 0; watcher < watchers.size; watcher++ )
2653 self waittill(
"disconnect" );
2662 self endon(
"disconnect" );
2664 if( !isPlayer(
self ))
2674 if ( msg ==
"death" )
2684 for (i = 0; i < 60; i++)
2686 print3d(orig,
"damaged! " + amount);
2694 triggerDetectId = trigger.detectId;
2696 for ( index = 0; index < 4; index++ )
2698 detectId =
self.bombSquadIcons[index].detectId;
2700 if ( detectId == triggerDetectId )
2703 if ( detectId ==
"" )
2710 self.bombSquadIds[triggerDetectId] =
true;
2712 self.bombSquadIcons[useId].x = trigger.origin[0];
2713 self.bombSquadIcons[useId].y = trigger.origin[1];
2714 self.bombSquadIcons[useId].z = trigger.origin[2]+24+128;
2716 self.bombSquadIcons[useId] fadeOverTime( 0.25 );
2717 self.bombSquadIcons[useId].alpha = 1;
2718 self.bombSquadIcons[useId].detectId = trigger.detectId;
2720 while ( isAlive(
self ) && isdefined( trigger ) &&
self isTouching( trigger ) )
2723 if ( !isdefined(
self ) )
2726 self.bombSquadIcons[useId].detectId =
"";
2727 self.bombSquadIcons[useId] fadeOverTime( 0.25 );
2728 self.bombSquadIcons[useId].alpha = 0;
2729 self.bombSquadIds[triggerDetectId] = undefined;
2735 if ( !isdefined(owner) )
2738 if ( !level.teamBased )
2741 friendlyFireRule = [[ level.figure_out_friendly_fire ]]( undefined );
2742 if ( isdefined( forcedFriendlyFireRule ) )
2743 friendlyFireRule = forcedFriendlyFireRule;
2745 if ( friendlyFireRule != 0 )
2748 if ( attacker == owner )
2751 if ( isplayer( attacker ) )
2753 if ( !isdefined(attacker.pers[
"team"]))
2756 if ( attacker.pers[
"team"] != owner.pers[
"team"] )
2759 else if ( IsActor(attacker) )
2761 if ( attacker.team != owner.pers[
"team"] )
2764 else if ( isvehicle( attacker ) )
2766 if ( isdefined(attacker.owner) && IsPlayer(attacker.owner) )
2768 if ( attacker.owner.pers[
"team"] != owner.pers[
"team"] )
2773 occupant_team = attacker vehicle::vehicle_get_occupant_team();
2774 if ( occupant_team != owner.pers[
"team"] && occupant_team !=
"spectator" )
2784 if ( isdefined( level.playThrowHatchet ) )
2786 player [[level.playThrowHatchet]]();
2792 self.delete_on_death =
true;
2798 player endon(
"disconnect" );
2799 self endon(
"death" );
2803 linkedEnt =
self GetLinkedEnt();
2804 if ( !isdefined( linkedEnt ) || !IsVehicle( linkedEnt ) )
2806 self.takedamage =
false;
2810 self.takedamage =
true;
2812 if ( IsVehicle( linkedEnt ) )
2821 player endon(
"disconnect" );
2822 self endon(
"death" );
2824 alreadyDead = ( ( entity.dead === true ) || ( isdefined( entity.health ) && entity.health < 0 ) );
2828 entity waittill(
"death" );
2831 self notify(
"death" );
2836 self.delete_on_death =
true;
2843 self endon(
"death" );
2844 e_player endon(
"disconnect" );
2846 self waittill(
"stationary" );
2850 foreach ( n_index, e_object
in s_watcher.objectarray )
2852 if (
self == e_object )
2854 s_watcher.objectarray[ n_index ] = undefined;
2863 self endon(
"death" );
2865 self SetOwner( player );
2866 self SetTeam( player.pers[
"team"] );
2867 self.owner = player;
2868 self.oldAngles =
self.angles;
2873 if( player.pers[
"team"] ==
"spectator" )
2878 triggerOrigin =
self.origin;
2879 triggerParentEnt = undefined;
2881 if ( isdefined(
self.stuckToPlayer ) )
2883 if ( IsAlive(
self.stuckToPlayer ) || !isdefined(
self.stuckToPlayer.body ) )
2885 if ( IsAlive(
self.stuckToPlayer ) )
2888 triggerParentEnt =
self;
2890 self.angles =
self.oldAngles;
2897 triggerParentEnt =
self.stuckToPlayer;
2902 triggerParentEnt =
self.stuckToPlayer.body;
2906 if ( isdefined( triggerParentEnt ) )
2907 triggerOrigin = triggerParentEnt.origin + ( 0, 0, 10 );
2909 if (
self.weapon.ShownRetrievable )
2914 self.hatchetPickUpTrigger =
spawn(
"trigger_radius", triggerOrigin, 0, 50, 50 );
2916 self.hatchetPickUpTrigger EnableLinkTo();
2917 self.hatchetPickUpTrigger LinkTo(
self );
2919 if ( isdefined( triggerParentEnt ) )
2921 self.hatchetPickUpTrigger linkto( triggerParentEnt );
2935 self endon(
"delete" );
2936 self endon(
"hacked" );
2940 trigger waittill(
"trigger", player );
2942 if ( !isAlive( player ) )
2945 if ( isdefined( trigger.claimedBy ) && ( player != trigger.claimedBy ) )
2949 if ( !isdefined( crossbow_weapon ) )
2952 stock_ammo = player GetWeaponAmmoStock( crossbow_weapon );
2953 if( stock_ammo >= crossbow_weapon.maxammo )
2956 if ( isdefined( playerSoundOnUse ) )
2957 player playLocalSound( playerSoundOnUse );
2958 if ( isdefined( npcSoundOnUse ) )
2959 player playSound( npcSoundOnUse );
2961 self thread [[
callback]]( player, crossbow_weapon );
2967 self endon(
"death" );
2969 self SetOwner( player );
2970 self SetTeam( player.pers[
"team"] );
2971 self.owner = player;
2972 self.oldAngles =
self.angles;
2977 if( player.pers[
"team"] ==
"spectator" )
2982 triggerOrigin =
self.origin;
2983 triggerParentEnt = undefined;
2985 if ( isdefined(
self.stuckToPlayer ) )
2987 if ( IsAlive(
self.stuckToPlayer ) || !isdefined(
self.stuckToPlayer.body ) )
2989 if ( IsAlive(
self.stuckToPlayer ) )
2992 triggerParentEnt =
self;
2994 self.angles =
self.oldAngles;
3001 triggerParentEnt =
self.stuckToPlayer;
3006 triggerParentEnt =
self.stuckToPlayer.body;
3010 if ( isdefined( triggerParentEnt ) )
3011 triggerOrigin = triggerParentEnt.origin + ( 0, 0, 10 );
3013 if (
self.weapon.ShownRetrievable )
3018 self.hatchetPickUpTrigger =
spawn(
"trigger_radius", triggerOrigin, 0, 50, 50 );
3020 self.hatchetPickUpTrigger EnableLinkTo();
3021 self.hatchetPickUpTrigger LinkTo(
self );
3023 if ( isdefined( triggerParentEnt ) )
3025 self.hatchetPickUpTrigger linkto( triggerParentEnt );
3028 self thread
watchHatchetTrigger(
self.hatchetPickUpTrigger, watcher.pickUp, watcher.pickUpSoundPlayer, watcher.pickUpSound );
3039 self endon(
"delete" );
3040 self endon(
"hacked" );
3044 trigger waittill(
"trigger", player );
3046 if ( !isAlive( player ) )
3049 if ( !player isOnGround() && !player IsPlayerSwimming() )
3052 if ( isdefined( trigger.claimedBy ) && ( player != trigger.claimedBy ) )
3056 if ( !IsDefined( heldWeapon ) )
3063 if ( heldWeapon == player.grenadeTypePrimary && isdefined( player.grenadeTypePrimaryCount ) && player.grenadeTypePrimaryCount > 0 )
3065 maxAmmo = player.grenadeTypePrimaryCount;
3067 else if ( heldWeapon == player.grenadeTypeSecondary && isdefined( player.grenadeTypeSecondaryCount ) && player.grenadeTypeSecondaryCount > 0 )
3069 maxAmmo = player.grenadeTypeSecondaryCount;
3077 clip_ammo = player GetWeaponAmmoClip( heldWeapon );
3079 if( clip_ammo >= maxAmmo )
3084 if ( isdefined( playerSoundOnUse ) )
3085 player playLocalSound( playerSoundOnUse );
3086 if ( isdefined( npcSoundOnUse ) )
3087 player playSound( npcSoundOnUse );
3095 pweapons =
self GetWeaponsList(
true );
3097 foreach( pweapon
in pweapons )
3099 if ( pweapon == weapon )
3105 foreach( pweapon
in pweapons )
3107 if ( pweapon.rootweapon == weapon.rootweapon )
3118 pweapons =
self GetWeaponsList(
true );
3120 crossbow = GetWeapon(
"special_crossbow" );
3121 crossbow_dw = GetWeapon(
"special_crossbow_dw" );
3124 foreach( pweapon
in pweapons )
3126 if ( pweapon.rootweapon == crossbow || pweapon.rootweapon == crossbow_dw )
3137 self endon(
"death" );
3138 self endon(
"hacked" );
3140 self SetOwner( player );
3141 self SetTeam( player.pers[
"team"] );
3142 self.owner = player;
3143 self.oldAngles =
self.angles;
3147 if ( watcher.activationDelay )
3149 wait( watcher.activationDelay );
3154 if(player.pers[
"team"] ==
"spectator")
3159 triggerOrigin =
self.origin;
3160 triggerParentEnt = undefined;
3161 if ( isdefined(
self.stuckToPlayer ) )
3163 if ( IsAlive(
self.stuckToPlayer ) || !isdefined(
self.stuckToPlayer.body ) )
3165 triggerParentEnt =
self.stuckToPlayer;
3169 triggerParentEnt =
self.stuckToPlayer.body;
3173 if ( isdefined( triggerParentEnt ) )
3175 triggerOrigin = triggerParentEnt.origin + ( 0, 0, 10 );
3181 up = AnglesToUp(
self.angles );
3182 triggerOrigin =
self.origin + up;
3187 if (
self.weapon.ShownRetrievable )
3192 self.pickUpTrigger =
spawn(
"trigger_radius_use", triggerOrigin );
3193 self.pickUpTrigger SetHintLowPriority(
true );
3194 self.pickUpTrigger SetCursorHint(
"HINT_NOICON",
self );
3195 self.pickUpTrigger EnableLinkTo();
3196 self.pickUpTrigger LinkTo(
self );
3197 self.pickUpTrigger SetInvisibleToAll();
3198 self.pickUpTrigger SetVisibleToPlayer( player );
3200 if( isdefined(level.retrieveHints[watcher.name]) )
3202 self.pickUpTrigger SetHintString( level.retrieveHints[watcher.name].hint );
3206 self.pickUpTrigger SetHintString( &
"MP_GENERIC_PICKUP" );
3209 self.pickUpTrigger SetTeamForTrigger( player.pers[
"team"] );
3211 if ( isdefined( triggerParentEnt ) )
3213 self.pickUpTrigger linkto( triggerParentEnt );
3216 self thread
watchUseTrigger(
self.pickUpTrigger, watcher.pickUp, watcher.pickUpSoundPlayer, watcher.pickUpSound );
3218 if ( isdefined( watcher.pickup_trigger_listener ) )
3220 self thread [[watcher.pickup_trigger_listener]](
self.pickUpTrigger, player );
3224 if ( watcher.enemyDestroy )
3226 self.enemyTrigger =
spawn(
"trigger_radius_use", triggerOrigin );
3227 self.enemyTrigger SetCursorHint(
"HINT_NOICON",
self );
3228 self.enemyTrigger EnableLinkTo();
3229 self.enemyTrigger LinkTo(
self );
3230 self.enemyTrigger SetInvisibleToPlayer( player );
3232 if ( level.teamBased )
3234 self.enemyTrigger SetExcludeTeamForTrigger( player.team );
3235 self.enemyTrigger.triggerTeamIgnore =
self.team;
3238 if( isdefined(level.destroyHints[watcher.name]) )
3240 self.enemyTrigger SetHintString( level.destroyHints[watcher.name].hint );
3244 self.enemyTrigger SetHintString( &
"MP_GENERIC_DESTROY" );
3264 if ( !
self.weapon.anyPlayerCanRetrieve && isdefined(
self.owner ) &&
self.owner != player )
3269 pikedWeapon =
self.weapon;
3271 if (
self.weapon.ammoCountEquipment > 0 && isdefined(
self.ammo ) )
3273 ammoLeftEquipment =
self.ammo;
3276 self notify(
"picked_up" );
3277 self.playDialog =
false;
3281 if ( !IsDefined( heldWeapon ) )
3288 if ( heldWeapon == player.grenadeTypePrimary && isdefined( player.grenadeTypePrimaryCount ) && player.grenadeTypePrimaryCount > 0 )
3290 maxAmmo = player.grenadeTypePrimaryCount;
3292 else if ( heldWeapon == player.grenadeTypeSecondary && isdefined( player.grenadeTypeSecondaryCount ) && player.grenadeTypeSecondaryCount > 0 )
3294 maxAmmo = player.grenadeTypeSecondaryCount;
3302 clip_ammo = player GetWeaponAmmoClip( heldWeapon );
3304 if( clip_ammo < maxAmmo )
3309 if ( isdefined ( ammoLeftEquipment ) )
3311 if ( pikedWeapon.rootWeapon == GetWeapon(
"trophy_system" ) )
3317 player setWeaponAmmoClip( heldWeapon, clip_ammo );
3322 self notify(
"picked_up" );
3323 self.playDialog =
false;
3327 stock_ammo = player GetWeaponAmmoStock( heldWeapon );
3329 player SetWeaponAmmoStock( heldWeapon, stock_ammo );
3334 PlayFX( level._effect[
"tacticalInsertionFizzle"],
self.origin );
3335 self playsound (
"dst_tac_insert_break");
3337 if( isdefined( level.playEquipmentDestroyedOnPlayer ) )
3339 self.owner [[level.playEquipmentDestroyedOnPlayer]]();
3349 pickUpTrigger =
self.pickUpTrigger;
3350 hackerTrigger =
self.hackerTrigger;
3351 hatchetPickUpTrigger =
self.hatchetPickUpTrigger;
3352 enemyTrigger =
self.enemyTrigger;
3354 if( isdefined( pickUpTrigger ) )
3355 pickUpTrigger
delete();
3357 if( isdefined( hackerTrigger ) )
3359 if ( isdefined( hackerTrigger.progressBar ) )
3364 hackerTrigger
delete();
3367 if( isdefined( hatchetPickUpTrigger ) )
3368 hatchetPickUpTrigger
delete();
3370 if ( isdefined( enemyTrigger ))
3372 enemyTrigger
delete();
3378 self endon(
"delete" );
3379 self endon(
"hacked" );
3383 trigger waittill(
"trigger", player );
3385 if ( isdefined(
self.detonated ) &&
self.detonated ==
true )
3387 if ( isdefined( trigger ) )
3394 if ( !isAlive( player ) )
3397 if ( isdefined( trigger.triggerTeam ) && ( player.pers[
"team"] != trigger.triggerTeam ) )
3400 if ( isdefined( trigger.triggerTeamIgnore ) && ( player.team == trigger.triggerTeamIgnore ) )
3403 if ( isdefined( trigger.claimedBy ) && ( player != trigger.claimedBy ) )
3406 grenade = player.throwingGrenade;
3407 weapon = player GetCurrentWeapon();
3409 if ( weapon.isEquipment )
3414 if ( player useButtonPressed() && !grenade && !player meleeButtonPressed() )
3416 if ( isdefined( playerSoundOnUse ) )
3417 player playLocalSound( playerSoundOnUse );
3418 if ( isdefined( npcSoundOnUse ) )
3419 player playSound( npcSoundOnUse );
3427 retrieveHint = spawnStruct();
3429 retrieveHint.name =
name;
3430 retrieveHint.hint = hint;
3432 level.retrieveHints[
name] = retrieveHint;
3437 hackerHint = spawnStruct();
3439 hackerHint.name =
name;
3440 hackerHint.hint = hint;
3442 level.hackerHints[
name] = hackerHint;
3447 destroyHint = spawnStruct();
3449 destroyHint.name =
name;
3450 destroyHint.hint = hint;
3452 level.destroyHints[
name] = destroyHint;
3457 if ( !isdefined(
self ) )
3460 if (
self.weapon.ShownEnemyExplo ||
self.weapon.ShownEnemyEquip )
3475 if ( isdefined( watcher ) )
3477 if ( !isdefined( watcher.notEquipment ) )
3479 if ( isdefined(
self ) )
3494 if ( !isdefined(
self ) )
3499 if ( !IsPlayer(
self ) )
3504 for ( i = 0; i <
self.weaponObjectWatcherArray.size; i++ )
3506 if (
self.weaponObjectWatcherArray[i].weapon != weapon )
3511 return (
self.weaponObjectWatcherArray[i] );
3521 if( level.teamBased )
3523 foreach( team
in level.teams )
3525 if( team == attacker.team )
3539 foreach ( item
in level.supplementalWatcherObjects )
3541 if ( !isdefined( item.weapon ) )
3546 if ( !isdefined( item.owner ) )
3551 if ( isdefined( team ) && item.owner.team != team )
3555 else if ( item.owner == attacker )
3560 watcher = item.owner getWatcherForWeapon( item.weapon );
3562 if ( !isdefined( watcher ) || !IsDefined( watcher.onSupplementalDetonateCallback ) )
3567 item thread [[watcher.onSupplementalDetonateCallback]]();
3573 level.supplementalWatcherObjects[ level.supplementalWatcherObjects.size ] = object;
3579 self waittill(
"death" );
3580 ArrayRemoveValue( level.supplementalWatcherObjects,
self );
3586 self notify(
"stop_disarmthink" );
3587 self endon(
"stop_disarmthink" );
3588 self endon(
"death" );
3591 SetDvar(
"scr_switch_team",
"");
3598 devgui_int = GetDvarint(
"scr_switch_team");
3604 team =
"autoassign";
3606 if( isdefined( level.getEnemyTeam ) && isdefined( owner ) && isdefined( owner.team ) )
3608 team = [[level.getEnemyTeam]]( owner.team );
3611 if ( isdefined( level.devOnGetOrMakeBot ) )
3613 player = [[level.devOnGetOrMakeBot]]( team );
3616 if( !isdefined( player ) )
3618 println(
"Could not add test client");
3625 SetDvar(
"scr_switch_team",
"0");