1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\bb_shared;
5 #using scripts\shared\callbacks_shared;
6 #using scripts\shared\challenges_shared;
7 #using scripts\shared\gameobjects_shared;
8 #using scripts\shared\killstreaks_shared;
9 #using scripts\shared\loadout_shared;
10 #using scripts\shared\scoreevents_shared;
11 #using scripts\shared\system_shared;
12 #using scripts\shared\util_shared;
13 #using scripts\shared\weapons_shared;
14 #using scripts\shared\weapons\_hive_gun;
15 #using scripts\shared\weapons\_empgrenade;
16 #using scripts\shared\weapons\_flashgrenades;
17 #using scripts\shared\weapons\_hacker_tool;
18 #using scripts\shared\weapons\_proximity_grenade;
19 #using scripts\shared\weapons\_sticky_grenade;
20 #using scripts\shared\weapons\_riotshield;
21 #using scripts\shared\weapons\_tabun;
22 #using scripts\shared\weapons\_trophy_system;
23 #using scripts\shared\weapons\_weapon_utils;
24 #using scripts\shared\weapons\_weaponobjects;
26 #insert scripts\shared\shared.gsh;
28 #insert scripts\shared\abilities\_ability_util.gsh;
30 #precache( "material", "hud_scavenger_pickup" );
36 level.weaponNone = GetWeapon(
"none" );
37 level.weaponNull = GetWeapon(
"weapon_null" );
38 level.weaponBaseMelee = GetWeapon(
"knife" );
39 level.weaponBaseMeleeHeld = GetWeapon(
"knife_held" );
40 level.weaponBallisticKnife = GetWeapon(
"knife_ballistic" );
41 level.weaponRiotshield = GetWeapon(
"riotshield" );
42 level.weaponFlashGrenade = GetWeapon(
"flash_grenade" );
43 level.weaponSatchelCharge = GetWeapon(
"satchel_charge" );
45 if ( !IsDefined(level.trackWeaponStats) )
47 level.trackWeaponStats =
true;
50 level._effect[
"flashNineBang"] =
"_t6/misc/fx_equip_tac_insert_exp";
63 level.missileEntities = [];
64 level.hackerToolTargets = [];
66 level.missileDudDeleteDelay = GetDvarInt(
"scr_missileDudDeleteDelay", 3 );
68 if ( !isdefined(level.roundStartExplosiveDelay) )
69 level.roundStartExplosiveDelay = 0;
77 self.usedWeapons =
false;
78 self.lastFireTime = 0;
85 self.concussionEndTime = 0;
86 self.scavenged =
false;
87 self.hasDoneCombat =
false;
88 self.shieldDamageBlocked = 0;
94 if ( level.trackWeaponStats )
99 self.droppedDeathWeapon = undefined;
100 self.tookWeaponFrom = [];
101 self.pickedUpWeaponKills = [];
109 self endon(
"disconnect");
111 self.lastDroppableWeapon =
self GetCurrentWeapon();
113 self.lastWeaponChange = 0;
116 previous_weapon =
self GetCurrentWeapon();
117 self waittill(
"weapon_change", newWeapon );
121 self.lastDroppableWeapon = newWeapon;
122 self.lastWeaponChange = getTime();
125 if ( DoesWeaponReplaceSpawnWeapon(
self.spawnWeapon, newWeapon ) )
127 self.spawnWeapon = newWeapon;
128 self.pers[
"spawnWeapon"] = newWeapon;
136 if ( isdefined(
self.currentWeapon ) && isdefined(
self.currentWeaponStartTime ) )
138 totalTime = int ( ( newTime -
self.currentWeaponStartTime ) / 1000 );
141 weaponPickedUp =
false;
142 if( isdefined(
self.pickedUpWeapons ) && isdefined(
self.pickedUpWeapons[
self.currentWeapon] ) )
144 weaponPickedUp =
true;
147 if ( isdefined(
self.class_num ) )
149 self AddWeaponStat(
self.currentWeapon,
"timeUsed", totalTime,
self.class_num, weaponPickedUp );
150 self.currentWeaponStartTime = newTime;
165 if ( !isdefined(
self.staticWeaponsStartTime ) )
170 totalTime = int ( ( newTime -
self.staticWeaponsStartTime ) / 1000 );
177 self.staticWeaponsStartTime = newTime;
181 if( isdefined(
self.weapon_array_grenade ) )
183 for( i=0; i<
self.weapon_array_grenade.size; i++ )
185 self AddWeaponStat(
self.weapon_array_grenade[i],
"timeUsed", totalTime,
self.class_num );
188 if( isdefined(
self.weapon_array_inventory ) )
190 for( i=0; i<
self.weapon_array_inventory.size; i++ )
192 self AddWeaponStat(
self.weapon_array_inventory[i],
"timeUsed", totalTime,
self.class_num );
197 if( isdefined(
self.killstreak ) )
199 for( i=0; i<
self.killstreak.size; i++ )
201 killstreakType = level.menuReferenceForKillStreak[
self.killstreak[i] ];
203 if ( isdefined( killstreakType ) )
206 self AddWeaponStat( killstreakWeapon,
"timeUsed", totalTime,
self.class_num );
212 if ( level.rankedmatch && level.perksEnabled )
214 perksIndexArray = [];
216 specialtys =
self.specialty;
218 if ( !isdefined( specialtys ) )
223 if ( !isdefined(
self.curClass ) )
228 if ( isdefined(
self.class_num ) )
230 for ( numSpecialties = 0; numSpecialties < level.maxSpecialties; numSpecialties++ )
232 perk =
self GetLoadoutItem(
self.class_num,
"specialty" + ( numSpecialties + 1 ) );
235 perksIndexArray[ perk ] =
true;
239 perkIndexArrayKeys = getarraykeys( perksIndexArray );
240 for ( i = 0; i < perkIndexArrayKeys.size; i ++ )
242 if ( perksIndexArray[ perkIndexArrayKeys[i] ] ==
true )
244 self AddDStat(
"itemStats", perkIndexArrayKeys[i],
"stats",
"timeUsed",
"statValue", totalTime );
253 currentWeapon =
self getCurrentWeapon();
254 currentTime = getTime();
255 spawnid = getplayerspawnid(
self );
262 if( event ==
"weapon_change" )
264 newWeapon =
self getCurrentWeapon();
265 if( newWeapon != level.weaponNone && newWeapon != currentWeapon )
270 currentWeapon = newWeapon;
271 currentTime = newTime;
276 if( event !=
"disconnect" && isdefined(
self ) )
288 if ( level.disableWeaponDrop == 1 )
291 if ( weapon == level.weaponNone )
297 if ( weapon.isGameplayWeapon )
300 if ( !weapon.isPrimary )
308 if ( level.disableWeaponDrop == 1 )
311 weapon =
self.lastDroppableWeapon;
313 if ( isdefined(
self.droppedDeathWeapon ) )
316 if ( !isdefined( weapon ) )
319 if ( GetDvarString(
"scr_dropdebug") ==
"1" )
320 println(
"didn't drop weapon: not defined" );
325 if ( weapon == level.weaponNone )
328 if ( GetDvarString(
"scr_dropdebug") ==
"1" )
329 println(
"didn't drop weapon: weapon == none" );
334 if ( !
self hasWeapon( weapon ) )
337 if ( GetDvarString(
"scr_dropdebug") ==
"1" )
338 println(
"didn't drop weapon: don't have it anymore (" + weapon.name +
")" );
343 if ( !(
self AnyAmmoForWeaponModes( weapon )) )
346 if ( GetDvarString(
"scr_dropdebug") ==
"1" )
347 println(
"didn't drop weapon: no ammo for weapon modes" );
357 if( weapon.isCarriedKillstreak )
360 clipAmmo =
self GetWeaponAmmoClip( weapon );
361 stockAmmo =
self GetWeaponAmmoStock( weapon );
362 clip_and_stock_ammo = clipAmmo + stockAmmo;
365 if( !clip_and_stock_ammo && !
IS_TRUE( weapon.unlimitedammo ) )
368 if ( GetDvarString(
"scr_dropdebug") ==
"1" )
369 println(
"didn't drop weapon: no ammo" );
374 if(
IS_TRUE( weapon.isnotdroppable ) )
379 stockMax = weapon.maxAmmo;
380 if ( stockAmmo > stockMax )
381 stockAmmo = stockMax;
383 item =
self dropItem( weapon );
385 if ( !isdefined( item ) )
387 /# iprintlnbold(
"dropItem: was not able to drop weapon " + weapon.name ); #/
392 if ( GetDvarString(
"scr_dropdebug") ==
"1" )
393 println(
"dropped weapon: " + weapon.name );
398 self.droppedDeathWeapon =
true;
400 item ItemWeaponSetAmmo( clipAmmo, stockAmmo );
403 item.ownersattacker = attacker;
404 item.sWeapon = sWeapon;
405 item.sMeansOfDeath = sMeansOfDeath;
418 if ( !isdefined(
self ) )
430 self waittill(
"trigger", player, droppedItem, pickedUpOnTouch );
441 if( isdefined( player ) && isPlayer( player ) )
443 if( isdefined( player.weaponPickupsCount ) )
445 player.weaponPickupsCount++;
449 player.weaponPickupsCount = 1;
452 player incrementSpecificWeaponPickedUpCount( weapon );
454 if( !isdefined( player.pickedUpWeapons) )
456 player.pickedUpWeapons = [];
459 player.pickedUpWeapons[weapon] = 1;
464 if ( GetDvarString(
"scr_dropdebug") ==
"1" )
465 println(
"picked up weapon: " + weapon.name +
", " + isdefined(
self.ownersattacker ) );
468 assert( isdefined( player.tookWeaponFrom ) );
469 assert( isdefined( player.pickedUpWeaponKills ) );
471 if ( isdefined( droppedItem ) )
473 for ( i = 0; i < droppedItem.size; i++ )
475 if ( !IsDefined( droppedItem[i] ) )
481 droppedWeapon = droppedItem[i].item;
482 if ( isdefined( player.tookWeaponFrom[ droppedWeapon ] ) )
484 droppedItem[i].owner = player.tookWeaponFrom[ droppedWeapon ];
485 droppedItem[i].ownersattacker = player;
486 player.tookWeaponFrom[ droppedWeapon ] = undefined;
493 if ( !isdefined( pickedUpOnTouch ) || !pickedUpOnTouch )
495 if ( isdefined(
self.ownersattacker ) &&
self.ownersattacker == player )
497 player.tookWeaponFrom[ weapon ] = SpawnStruct();
499 player.tookWeaponFrom[ weapon ].previousOwner =
self.owner;
500 player.tookWeaponFrom[ weapon ].sWeapon =
self.sWeapon;
501 player.tookWeaponFrom[ weapon ].sMeansOfDeath =
self.sMeansOfDeath;
503 player.pickedUpWeaponKills[ weapon ] = 0;
507 player.tookWeaponFrom[ weapon ] = undefined;
508 player.pickedUpWeaponKills[ weapon ] = undefined;
515 self endon(
"death" );
516 self endon(
"disconnect" );
517 level endon (
"game_ended" );
521 self waittill (
"weapon_fired", curWeapon );
522 self.lastFireTime = GetTime();
524 self.hasDoneCombat =
true;
526 switch ( curWeapon.weapClass )
530 case "pistol spread":
535 level.globalShotsFired++;
537 case "rocketlauncher":
539 self AddWeaponStat( curWeapon,
"shots", 1,
self.class_num,
false );
547 if( isDefined(
self.heroweaponShots) )
549 self.heroweaponShots++;
553 if( curWeapon.isCarriedKillstreak )
555 if ( IsDefined(
self.pers[
"held_killstreak_ammo_count"][curWeapon] ) )
557 self.pers[
"held_killstreak_ammo_count"][curWeapon]--;
563 #define TRACK_WEAPON_SHOT_FIRED 1
567 pixbeginevent(
"trackWeaponFire");
569 weaponPickedUp =
false;
570 if( isdefined(
self.pickedUpWeapons ) && isdefined(
self.pickedUpWeapons[curWeapon] ) )
572 weaponPickedUp =
true;
575 self TrackWeaponFireNative( curWeapon,
TRACK_WEAPON_SHOT_FIRED,
self.hits, 1,
self.class_num, weaponPickedUp,
self.primaryLoadoutGunSmithVariantIndex,
self.secondaryLoadoutGunSmithVariantIndex );
584 if ( isdefined(
self.totalMatchShots ) )
585 self.totalMatchShots++;
587 if( level.mpCustomMatch ===
true )
589 self.pers[
"shotsfired"]++;
590 self.shotsfired =
self.pers[
"shotsfired"];
592 self.pers[
"shotshit"] +=
self.hits;
593 self.shotshit =
self.pers[
"shotshit"];
595 self.pers[
"shotsmissed"] =
self.shotsfired -
self.shotshit;
596 self.shotsmissed =
self.pers[
"shotsmissed"];
605 self endon(
"death" );
606 self endon(
"disconnect" );
608 self.throwingGrenade =
false;
609 self.gotPullbackNotify =
false;
619 self waittill (
"grenade_pullback", weapon );
621 self AddWeaponStat( weapon,
"shots", 1,
self.class_num );
623 self.hasDoneCombat =
true;
625 self.throwingGrenade =
true;
626 self.gotPullbackNotify =
true;
628 if ( weapon.drawOffhandModelInHand )
630 self SetOffhandVisible(
true );
640 self endon(
"death" );
641 self endon(
"disconnect" );
642 level endon (
"game_ended" );
646 self waittill (
"missile_fire", missile, weapon );
648 self.hasDoneCombat =
true;
650 /#assert( isdefined( missile ));#/
651 level.missileEntities[ level.missileEntities.size ] = missile;
652 missile.weapon = weapon;
659 self waittill(
"death" );
660 ArrayRemoveValue( level.missileEntities,
self );
665 weapons = GetDroppedWeapons();
666 for ( i = 0 ; i < weapons.size ; i++ )
668 if ( DistanceSquared( origin, weapons[i].origin ) < radius * radius )
670 trace = bullettrace( weapons[i].origin, weapons[i].origin + (0,0,-2000),
false, weapons[i] );
671 weapons[i].origin =
trace[
"position"];
678 grenades = getentarray(
"grenade",
"classname" );
679 for( i = 0 ; i < grenades.size ; i++ )
681 if( DistanceSquared( origin, grenades[i].origin )< radius * radius )
683 grenades[i]
launch( (5,5,5) );
690 self endon (
"death" );
691 self endon (
"disconnect" );
692 self endon (
"grenade_fire" );
695 weapon = level.weaponNone;
697 while(
self IsThrowingGrenade() && weapon == level.weaponNone )
699 self waittill(
"weapon_change", weapon );
702 self.throwingGrenade =
false;
703 self.gotPullbackNotify =
false;
705 self notify(
"grenade_throw_cancelled" );
710 self notify(
"watchOffhandEnd" );
711 self endon(
"watchOffhandEnd" );
717 if (( msg ==
"death" ) || ( msg ==
"disconnect" ))
723 if ( isdefined(
self ) )
725 self SetOffhandVisible(
false );
731 if (
self IsUsingOffhand() )
733 weapon =
self GetCurrentOffhand();
734 if ( weapon.isEquipment )
746 self endon (
"death" );
747 self endon (
"disconnect" );
748 self endon (
"grenade_throw_cancelled" );
754 self waittill (
"grenade_fire", grenade, weapon, cookTime );
756 /#assert( isdefined( grenade ));#/
757 level.missileEntities[ level.missileEntities.size ] = grenade;
758 grenade.weapon = weapon;
763 grenade SetIgnorePauseWorld(
true );
772 blackBoxEventName =
"mpequipmentuses";
774 if ( SessionModeIsCampaignGame() )
776 blackBoxEventName =
"cpequipmentuses";
778 else if ( SessionModeIsZombiesGame() )
780 blackBoxEventName =
"zmequipmentuses";
784 bbPrint( blackBoxEventName,
"gametime %d spawnid %d weaponname %s", gettime(), getplayerspawnid(
self ), weapon.name );
788 if ( cookedTime > 1000 )
790 grenade.isCooked =
true;
793 if (isDefined(
self.grenadesUsed))
798 switch ( weapon.rootWeapon.name )
801 level.globalFragGrenadesFired++;
803 case "sticky_grenade":
804 self AddWeaponStat( weapon,
"used", 1 );
805 grenade SetTeam(
self.pers[
"team"] );
806 grenade SetOwner(
self );
808 case "explosive_bolt":
809 grenade.originalOwner =
self;
811 case "satchel_charge":
812 level.globalSatchelChargeFired++;
814 case "concussion_grenade":
815 case "flash_grenade":
816 self AddWeaponStat( weapon,
"used", 1 );
820 self.throwingGrenade =
false;
822 if ( weapon.cookOffHoldTime > 0 )
826 else if ( weapon.multiDetonation > 0 )
834 self notify(
"otherGrenadeTrackingStart" );
836 self endon(
"otherGrenadeTrackingStart" );
837 self endon(
"disconnect" );
841 self waittill (
"grenade_fire", grenade, weapon );
848 switch( weapon.rootweapon.name )
853 case "sticky_grenade":
857 case "satchel_charge":
865 self AddWeaponStat( weapon,
"used", 1 );
875 self endon(
"death" );
877 self waittill(
"stuck_to_player", player );
878 if ( isdefined ( player ) )
880 if ( deleteOnTeamChange )
883 if ( awardScoreEvent && isdefined (
self.originalOwner ) )
891 self.stuckToPlayer = player;
897 self endon(
"stuck_to_player" );
898 self endon(
"death");
899 self waittill(
"grenade_bounce" );
906 player endon(
"disconnect");
907 originalTeam = player.pers[
"team"];
911 player waittill(
"joined_team");
913 if ( player.pers[
"team"] != originalTeam )
923 self endon (
"death" );
924 self endon (
"disconnect" );
928 self waittill (
"grenade_fire", grenade, weapon );
930 if (
self.gotPullbackNotify )
932 self.gotPullbackNotify =
false;
936 if ( !isSubStr( weapon.name,
"frag_" ) )
940 grenade.threwBack =
true;
942 grenade.originalOwner =
self;
948 self endon(
"death" );
952 if( isDefined(
self ) )
958 if ( !isdefined( level.startTime ) )
961 return (gettime() - level.startTime);
968 if ( level.roundStartExplosiveDelay >= time )
970 if ( weapon.disallowatmatchstart || WeaponHasAttachment( weapon,
"gl" ) )
972 timeLeft = Int( level.roundStartExplosiveDelay - time );
978 if ( isThrownGrenade )
979 player iPrintLnBold( &
"MP_GRENADE_UNAVAILABLE_FOR_N",
" " + timeLeft +
" ", &
"EXE_SECONDS" );
981 player iPrintLnBold( &
"MP_LAUNCHER_UNAVAILABLE_FOR_N",
" " + timeLeft +
" ", &
"EXE_SECONDS" );
984 self makeGrenadeDud();
991 self endon(
"spawned_player" );
992 self endon(
"disconnect" );
996 self waittill(
"grenade_fire", grenade, weapon );
1004 self endon(
"spawned_player" );
1005 self endon(
"disconnect" );
1009 self waittill(
"grenade_launcher_fire", grenade, weapon );
1012 /#assert( isDefined( grenade ));#/
1013 level.missileEntities[ level.missileEntities.size ] = grenade;
1014 grenade.weapon = weapon;
1029 if (!isdefined(doLOS))
1032 if ( !isdefined( startRadius ) )
1036 players = level.players;
1037 for (i = 0; i < players.size; i++)
1039 if (!isalive(players[i]) || players[i].sessionstate !=
"playing")
1042 playerpos = players[i].origin + (0,0,32);
1043 distsq = distancesquared(pos, playerpos);
1044 if (distsq < radius*radius && (!doLOS ||
damage_trace_passed(pos, playerpos, startRadius, undefined)))
1046 newent = spawnstruct();
1047 newent.isPlayer =
true;
1048 newent.isADestructable =
false;
1049 newent.isADestructible =
false;
1050 newent.isActor =
false;
1051 newent.entity = players[i];
1052 newent.damageCenter = playerpos;
1053 ents[ents.size] = newent;
1058 grenades = getentarray(
"grenade",
"classname");
1059 for (i = 0; i < grenades.size; i++)
1061 entpos = grenades[i].origin;
1062 distsq = distancesquared(pos, entpos);
1063 if (distsq < radius*radius && (!doLOS ||
damage_trace_passed(pos, entpos, startRadius, grenades[i])))
1065 newent = spawnstruct();
1066 newent.isPlayer =
false;
1067 newent.isADestructable =
false;
1068 newent.isADestructible =
false;
1069 newent.isActor =
false;
1070 newent.entity = grenades[i];
1071 newent.damageCenter = entpos;
1072 ents[ents.size] = newent;
1077 destructibles = getentarray(
"destructible",
"targetname");
1078 for (i = 0; i < destructibles.size; i++)
1080 entpos = destructibles[i].origin;
1081 distsq = distancesquared(pos, entpos);
1082 if (distsq < radius*radius && (!doLOS ||
damage_trace_passed(pos, entpos, startRadius, destructibles[i])))
1084 newent = spawnstruct();
1085 newent.isPlayer =
false;
1086 newent.isADestructable =
false;
1087 newent.isADestructible =
true;
1088 newent.isActor =
false;
1089 newent.entity = destructibles[i];
1090 newent.damageCenter = entpos;
1091 ents[ents.size] = newent;
1096 destructables = getentarray(
"destructable",
"targetname");
1097 for (i = 0; i < destructables.size; i++)
1099 entpos = destructables[i].origin;
1100 distsq = distancesquared(pos, entpos);
1101 if (distsq < radius*radius && (!doLOS ||
damage_trace_passed(pos, entpos, startRadius, destructables[i])))
1103 newent = spawnstruct();
1104 newent.isPlayer =
false;
1105 newent.isADestructable =
true;
1106 newent.isADestructible =
false;
1107 newent.isActor =
false;
1108 newent.entity = destructables[i];
1109 newent.damageCenter = entpos;
1110 ents[ents.size] = newent;
1114 dogs = [[level.dogManagerOnGetDogs]]();
1116 if ( isdefined( dogs ) )
1118 foreach( dog
in dogs )
1120 if ( !IsAlive( dog ) )
1125 entpos = dog.origin;
1126 distsq = distancesquared(pos, entpos);
1129 newent = spawnstruct();
1130 newent.isPlayer =
false;
1131 newent.isADestructable =
false;
1132 newent.isADestructible =
false;
1133 newent.isActor =
true;
1134 newent.entity = dog;
1135 newent.damageCenter = entpos;
1136 ents[ents.size] = newent;
1147 return (
trace[
"fraction"] == 1);
1155 if ( lengthsquared( diff ) < startRadius*startRadius )
1157 dir = vectornormalize( diff );
1158 midpos = from + (dir[0]*startRadius, dir[1]*startRadius, dir[2]*startRadius);
1162 if ( GetDvarint(
"scr_damage_debug") != 0 )
1164 if (
trace[
"fraction"] == 1)
1185 function damage_ent(eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, damagepos, damagedir)
1189 self.damageOrigin = damagepos;
1190 self.entity thread [[level.callbackPlayerDamage]](
1206 else if (
self.isactor)
1208 self.damageOrigin = damagepos;
1209 self.entity thread [[level.callbackActorDamage]](
1227 else if (
self.isADestructible)
1229 self.damageOrigin = damagepos;
1230 self.entity DoDamage(
1243 self.entity
util::damage_notify_wrapper( iDamage, eAttacker, (0,0,0), (0,0,0),
"mod_explosive",
"",
"" );
1250 for (i = 0; i < 30*20; i++)
1261 self endon (
"death" );
1262 self endon (
"disconnect" );
1264 if ( isdefined( level._custom_weapon_damage_func ) )
1266 is_weapon_registered =
self [[level._custom_weapon_damage_func]]( eAttacker, eInflictor, weapon, meansOfDeath,
damage );
1267 if( is_weapon_registered )
1273 switch ( weapon.rootWeapon.name )
1275 case "concussion_grenade":
1276 radius = weapon.explosionRadius;
1278 if (
self == eAttacker)
1281 scale = 1 - (distance(
self.origin, eInflictor.origin ) / radius);
1286 time = 0.25 + (4 * scale);
1290 if ( meansOfDeath !=
"MOD_IMPACT" )
1292 if (
self HasPerk (
"specialty_stunprotection" ) )
1300 self shellShock(
"concussion_grenade_mp", time,
false );
1305 self.concussionEndTime = getTime() + (time * 1000);
1306 self.lastConcussedBy = eAttacker;
1312 if ( isdefined( level.shellshockOnPlayerDamage ) )
1314 [[level.shellshockOnPlayerDamage]]( meansOfDeath,
damage, weapon );
1322 self endon(
"death" );
1323 self endon(
"disconnect" );
1325 concussionSound =
spawn (
"script_origin",(0,0,1));
1326 concussionSound.origin =
self.origin;
1327 concussionSound linkTo(
self );
1329 concussionSound playsound(
"" );
1330 concussionSound playLoopSound (
"" );
1331 if ( duration > 0.5 )
1332 wait( duration - 0.5 );
1333 concussionSound playsound(
"" );
1334 concussionSound StopLoopSound( .5);
1337 concussionSound notify (
"delete" );
1338 concussionSound
delete();
1343 self endon(
"delete" );
1344 owner waittill(
"death" );
1353 self endon(
"spawned" );
1354 self endon(
"killed_player" );
1355 self endon(
"disconnect" );
1359 self.tag_stowed_back = undefined;
1360 self.tag_stowed_hip = undefined;
1362 team =
self.pers[
"team"];
1363 playerclass =
self.pers[
"class"];
1367 self waittill(
"weapon_change", newWeapon );
1369 if (
self IsMantling() )
1374 currentStowed =
self GetStowedWeapon();
1378 self.weapon_array_primary =[];
1379 self.weapon_array_sidearm = [];
1380 self.weapon_array_grenade = [];
1381 self.weapon_array_inventory =[];
1384 weaponsList =
self GetWeaponsList();
1385 for( idx = 0; idx < weaponsList.size; idx++ )
1388 switch( weaponsList[idx].
name )
1398 if ( !hasStowed || currentStowed == weaponsList[idx] )
1400 currentStowed = weaponsList[idx];
1405 self.weapon_array_primary[
self.weapon_array_primary.size] = weaponsList[idx];
1407 self.weapon_array_sidearm[
self.weapon_array_sidearm.size] = weaponsList[idx];
1409 self.weapon_array_grenade[
self.weapon_array_grenade.size] = weaponsList[idx];
1411 self.weapon_array_inventory[
self.weapon_array_inventory.size] = weaponsList[idx];
1412 else if ( weaponsList[idx].isPrimary )
1413 self.weapon_array_primary[
self.weapon_array_primary.size] = weaponsList[idx];
1416 if ( newWeapon != level.weaponNone || !hasStowed )
1427 if ( isdefined( level.giveCustomLoadout ) )
1429 return level.weaponNone;
1432 assert( isdefined(
self.class_num ) );
1433 if ( isdefined(
self.class_num ) )
1437 if ( isdefined( level.tbl_weaponIDs[index] ) && isdefined( level.tbl_weaponIDs[index][
"reference"] ) )
1439 return GetWeapon( level.tbl_weaponIDs[index][
"reference"] );
1443 return level.weaponNone;
1449 if ( isdefined( level.giveCustomLoadout ) )
1454 assert( isdefined(
self.class_num ) );
1455 if ( isdefined(
self.class_num ) )
1466 self.scavenger_icon.alpha = 1;
1467 self.scavenger_icon fadeOverTime( 1.0 );
1468 self.scavenger_icon.alpha = 0;
1473 self endon(
"death" );
1474 self waittill(
"scavenger", player );
1476 primary_weapons = player GetWeaponsListPrimaries();
1477 offhand_weapons_and_alts = array::exclude( player GetWeaponsList(
true ), primary_weapons );
1479 ArrayRemoveValue( offhand_weapons_and_alts, level.weaponBaseMelee );
1480 offhand_weapons_and_alts =
array::reverse( offhand_weapons_and_alts );
1482 player playsound(
"wpn_ammo_pickup" );
1483 player playlocalsound(
"wpn_ammo_pickup" );
1487 for ( i = 0; i < offhand_weapons_and_alts.size; i++ )
1489 weapon = offhand_weapons_and_alts[i];
1498 if ( weapon == player.grenadeTypePrimary && isdefined( player.grenadeTypePrimaryCount ) && player.grenadeTypePrimaryCount > 0 )
1500 maxAmmo = player.grenadeTypePrimaryCount;
1502 else if ( weapon == player.grenadeTypeSecondary && isdefined( player.grenadeTypeSecondaryCount ) && player.grenadeTypeSecondaryCount > 0 )
1504 maxAmmo = player.grenadeTypeSecondaryCount;
1507 if ( isdefined( level.customLoasdoutScavenge ) )
1509 maxAmmo =
self [[level.customLoadoutScavenge]]( weapon );
1517 if ( weapon.rootWeapon == level.weaponSatchelCharge )
1525 stock = player GetWeaponAmmoStock( weapon );
1527 if ( stock < maxAmmo )
1531 if ( ammo > maxAmmo )
1535 player SetWeaponAmmoStock( weapon, ammo );
1536 player.scavenged =
true;
1542 if ( weapon.rootWeapon == GetWeapon(
"trophy_system" ) )
1549 for ( i = 0; i < primary_weapons.size; i++ )
1551 weapon = primary_weapons[i];
1558 stock = player GetWeaponAmmoStock( weapon );
1559 start = player GetFractionStartAmmo( weapon );
1560 clip = weapon.clipSize;
1561 clip *= GetDvarFloat(
"scavenger_clip_multiplier", 1 );
1564 if ( isdefined( level.weaponLauncherEx41 ) && ( weapon.statIndex == level.weaponLauncherEx41.statIndex ) )
1567 maxAmmo = weapon.maxAmmo;
1569 if ( stock < maxAmmo - clip )
1571 ammo = stock + clip;
1572 player SetWeaponAmmoStock( weapon, ammo );
1573 player.scavenged =
true;
1577 player SetWeaponAmmoStock( weapon, maxAmmo );
1578 player.scavenged =
true;
1585 self waittill(
"disconnect");
1586 if(isDefined(
self.scavenger_icon))
1592 if( level.wagerMatch )
1597 self.scavenger_icon = NewClientHudElem(
self );
1598 if(isDefined(
self.scavenger_icon))
1602 self.scavenger_icon.horzAlign =
"center";
1603 self.scavenger_icon.vertAlign =
"middle";
1604 self.scavenger_icon.alpha = 0;
1609 if ( level.splitscreen )
1611 width = Int( width * 0.5 );
1612 height = Int( height * 0.5 );
1615 self.scavenger_icon.x = -width/2;
1616 self.scavenger_icon.y = 16;
1618 self.scavenger_icon setShader(
"hud_scavenger_pickup", width, height );
1624 if ( level.wagerMatch )
1627 if ( !isdefined( attacker ) )
1630 if ( attacker ==
self )
1633 if ( level.gameType ==
"hack" )
1635 item =
self dropScavengerItem( GetWeapon(
"scavenger_item_hack" ) );
1637 else if ( isplayer( Attacker ) )
1639 item =
self dropScavengerItem( GetWeapon(
"scavenger_item" ) );
1653 limited_info = SpawnStruct();
1654 limited_info.weapon = weapon;
1655 limited_info.drops = num_drops;
1657 owner.limited_info = limited_info;
1662 limited_info = owner.limited_info;
1664 if ( !isdefined( limited_info ) )
1669 if ( limited_info.weapon != weapon )
1674 if ( limited_info.drops <= 0 )
1685 limited_info = owner.limited_info;
1687 if ( !isdefined( limited_info ) )
1692 if ( limited_info.weapon != weapon )
1697 limited_info.drops = limited_info.drops - 1;
1698 owner.limited_info = undefined;
1706 self endon(
"death" );
1707 self waittill(
"trigger", player, item );
1709 if ( !isdefined( item ) )
1714 player.limited_info = limited_info;
1720 self endon(
"trophy_destroyed" );
1722 self waittill(
"explode", origin, surface );
1724 if ( weapon.rootWeapon == level.weaponFlashGrenade )
1732 level endon(
"game_ended" );
1739 explosionRadiusSq = weapon.explosionRadius * weapon.explosionRadius;
1740 explosionRadiusMinSq = weapon.explosionInnerRadius * weapon.explosionInnerRadius;
1742 cookStages = cookTime / weapon.cookOffHoldTime * maxStages + 1;
1746 if ( cookStages < 2 )
1750 else if ( cookStages < 3 )
1754 else if ( cookStages < 4 )
1764 wait( RandomFloatRange( minDelay, maxDelay ) );
1767 for( i = 1; i < detonations; i++ )
1771 PlaySoundAtPosition(
"wpn_flash_grenade_explode", newPos );
1772 PlayFX( level._effect[
"flashNineBang"], newPos );
1774 closestPlayers = ArraySort( level.players, newPos,
true );
1777 foreach( player
in closestPlayers )
1779 if ( !isdefined( player ) || !IsAlive( player ) )
1784 if ( player.sessionstate !=
"playing" )
1789 viewOrigin = player GetEye();
1792 dist = DistanceSquared( pos, viewOrigin );
1794 if( dist > explosionRadiusSq )
1800 if( !BulletTracePassed( pos, viewOrigin,
false, player ) )
1803 if ( dist <= explosionRadiusMinSq )
1804 percent_distance = 1.0;
1806 percent_distance = 1.0 - ( dist - explosionRadiusMinSq ) / ( explosionRadiusSq - explosionRadiusMinSq );
1808 forward = AnglesToForward( player GetPlayerAngles() );
1810 toBlast = pos - viewOrigin;
1811 toBlast = VectorNormalize( toBlast );
1813 percent_angle = 0.5 * ( 1.0 + VectorDot( forward, toBlast ) );
1815 player notify(
"flashbang", percent_distance, percent_angle, attacker );
1818 wait( RandomFloatRange( minDelay, maxDelay ) );
1824 offset = ( RandomFloatRange( -1.0 * range, range ), RandomFloatRange( -1.0 * range, range ), 0 );
1825 newPos = startPos + offset;
1828 if ( BulletTracePassed( startPos, newPos,
false, undefined ) )
1838 kNineBangEmpRadius = 512;
1839 radiusSq = kNineBangEmpRadius * kNineBangEmpRadius;
1841 PlaySoundAtPosition(
"wpn_emp_explode", position );
1845 foreach ( targetEnt
in level.players )
1849 targetEnt notify(
"emp_grenaded", player );
1856 entpos = ent.origin;
1857 distSq = DistanceSquared( pos, entpos );
1858 return ( distSq < radiusSq
1865 self endon(
"trophy_destroyed" );
1867 self waittill(
"explode", origin, surface );
1869 if ( weapon.rootWeapon == GetWeapon(
"frag_grenade_grenade" ) )
1871 for ( i = 0; i < weapon.multiDetonation; i++ )
1874 if ( !isdefined( ownerEnt ) )
1879 multiblastWeapon = GetWeapon(
"frag_multi_blast" );
1883 vel = dir * multiblastWeapon.multiDetonationFragmentSpeed;
1884 fuseTime = multiblastWeapon.fusetime/1000;
1886 grenade = ownerEnt MagicGrenadeType( multiblastWeapon, origin, vel, fuseTime );
1896 yaw = -180 + ( 360 / multiVal ) * index;
1898 angles = ( pitch, yaw, 45 );
1900 dir = AnglesToForward( angles );
1907 if ( !isdefined( weapon ) )
1910 if ( !isdefined(
self ) )
1913 if ( isdefined( level.weaponSpecialDiscGun ) && weapon.statIndex == level.weaponSpecialDiscGun.statIndex )
1915 if ( isdefined( inflictor ) )
1917 DEFAULT( inflictor.hit_info, [] );
1919 victimEntNum =
self GetEntityNumber();
1921 if ( isdefined( inflictor.hit_info[ victimEntNum ] ) )
1924 inflictor.hit_info[ victimEntNum ] =
true;