1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\challenges_shared;
5 #using scripts\shared\dev_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\flagsys_shared;
8 #using scripts\shared\killstreaks_shared;
9 #using scripts\shared\loadout_shared;
10 #using scripts\shared\system_shared;
11 #using scripts\shared\tweakables_shared;
12 #using scripts\shared\util_shared;
13 #using scripts\shared\abilities\_ability_util;
14 #using scripts\shared\weapons\_weapon_utils;
15 #using scripts\shared\abilities\gadgets\_gadget_roulette;
17 #insert scripts\shared\shared.gsh;
18 #insert scripts\shared\statstable_shared.gsh;
20 #using scripts\mp\_armor;
21 #using scripts\mp\_challenges;
22 #using scripts\mp\_util;
23 #using scripts\mp\gametypes\_dev;
24 #using scripts\mp\gametypes\_globallogic_score;
25 #using scripts\mp\gametypes\_globallogic_utils;
26 #using scripts\mp\gametypes\_weapons;
27 #using scripts\mp\killstreaks\_killstreak_weapons;
28 #using scripts\mp\killstreaks\_killstreaks;
29 #using scripts\mp\teams\_teams;
31 #insert scripts\mp\_bonuscard.gsh;
50 level.classMap[
"class_smg"] =
"CLASS_SMG";
51 level.classMap[
"class_cqb"] =
"CLASS_CQB";
52 level.classMap[
"class_assault"] =
"CLASS_ASSAULT";
53 level.classMap[
"class_lmg"] =
"CLASS_LMG";
54 level.classMap[
"class_sniper"] =
"CLASS_SNIPER";
56 level.classMap[
"custom0"] =
"CLASS_CUSTOM1";
57 level.classMap[
"custom1"] =
"CLASS_CUSTOM2";
58 level.classMap[
"custom2"] =
"CLASS_CUSTOM3";
59 level.classMap[
"custom3"] =
"CLASS_CUSTOM4";
60 level.classMap[
"custom4"] =
"CLASS_CUSTOM5";
61 level.classMap[
"custom5"] =
"CLASS_CUSTOM6";
62 level.classMap[
"custom6"] =
"CLASS_CUSTOM7";
63 level.classMap[
"custom7"] =
"CLASS_CUSTOM8";
64 level.classMap[
"custom8"] =
"CLASS_CUSTOM9";
65 level.classMap[
"custom9"] =
"CLASS_CUSTOM10";
67 level.maxKillstreaks = 4;
68 level.maxSpecialties = 6;
69 level.maxBonuscards = 3;
70 level.maxAllocation = GetGametypeSetting(
"maxAllocation" );
71 level.loadoutKillstreaksEnabled = GetGametypeSetting(
"loadoutKillstreaksEnabled" );
72 if( GetDvarInt(
"teamOpsEnabled" ) == 1 )
73 level.loadoutKillstreaksEnabled = 1;
76 level.weaponBaseMeleeHeld = GetWeapon(
"bare_hands" );
77 level.weaponKnifeLoadout = GetWeapon(
"knife_loadout" );
78 level.weaponMeleeKnuckles = GetWeapon(
"melee_knuckles" );
79 level.weaponMeleeButterfly = GetWeapon(
"melee_butterfly" );
80 level.weaponMeleeWrench = GetWeapon(
"melee_wrench" );
81 level.weaponMeleeSword = GetWeapon(
"melee_sword" );
82 level.weaponMeleeCrowbar = GetWeapon(
"melee_crowbar" );
83 level.weaponSpecialCrossbow = GetWeapon(
"special_crossbow" );
84 level.weaponMeleeDagger = GetWeapon(
"melee_dagger" );
85 level.weaponMeleeBat = GetWeapon(
"melee_bat" );
86 level.weaponMeleeBowie = GetWeapon(
"melee_bowie" );
87 level.weaponMeleeMace = GetWeapon(
"melee_mace" );
88 level.weaponMeleeFireAxe = GetWeapon(
"melee_fireaxe" );
89 level.weaponMeleeBoneGlass = GetWeapon(
"melee_boneglass" );
90 level.weaponMeleeImprovise = GetWeapon(
"melee_improvise" );
91 level.weaponShotgunEnergy = GetWeapon(
"shotgun_energy" );
92 level.weaponPistolEnergy = GetWeapon(
"pistol_energy" );
93 level.weaponMeleeShockBaton = GetWeapon(
"melee_shockbaton" );
94 level.weaponMeleeNunchuks = GetWeapon(
"melee_nunchuks" );
95 level.weaponMeleeBoxing = GetWeapon(
"melee_boxing" );
96 level.weaponMeleeKatana = GetWeapon(
"melee_katana" );
97 level.weaponMeleeShovel = GetWeapon(
"melee_shovel" );
98 level.weaponMeleeProsthetic = GetWeapon(
"melee_prosthetic" );
99 level.weaponMeleeChainsaw = GetWeapon(
"melee_chainsaw" );
100 level.weaponSpecialDiscGun = GetWeapon(
"special_discgun" );
101 level.weaponSmgNailGun = GetWeapon(
"smg_nailgun" );
102 level.weaponLauncherMulti = GetWeapon(
"launcher_multi" );
103 level.weaponMeleeCrescent = GetWeapon(
"melee_crescent" );
104 level.weaponLauncherEx41 = GetWeapon(
"launcher_ex41" );
106 level.meleeWeapons = [];
107 ARRAY_ADD( level.meleeWeapons, level.weaponKnifeLoadout );
108 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeKnuckles );
109 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeButterfly );
110 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeWrench );
111 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeSword );
112 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeCrowbar );
113 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeDagger );
114 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeBat );
115 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeBowie );
116 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeMace );
117 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeFireAxe );
118 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeBoneGlass );
119 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeImprovise );
120 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeShockBaton );
121 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeNunchuks );
122 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeBoxing );
123 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeKatana );
124 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeShovel );
125 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeProsthetic );
126 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeChainsaw );
127 ARRAY_ADD( level.meleeWeapons, level.weaponMeleeCrescent );
130 level.weaponBouncingBetty = GetWeapon(
"bouncingbetty" );
132 level.PrestigeNumber = 5;
134 level.defaultClass =
"CLASS_ASSAULT";
138 level.weapons[
"frag"] = GetWeapon(
"frag_grenade" );
142 level.weapons[
"frag"] =
"";
147 level.weapons[
"smoke"] = GetWeapon(
"smoke_grenade" );
151 level.weapons[
"smoke"] =
"";
156 level.weapons[
"flash"] = GetWeapon(
"flash_grenade" );
160 level.weapons[
"flash"] =
"";
163 level.weapons[
"concussion"] = GetWeapon(
"concussion_grenade" );
167 level.weapons[
"satchel_charge"] = GetWeapon(
"satchel_charge" );
171 level.weapons[
"satchel_charge"] =
"";
176 level.weapons[
"betty"] = GetWeapon(
"mine_bouncing_betty" );
180 level.weapons[
"betty"] =
"";
185 level.weapons[
"rpg"] = GetWeapon(
"rpg" );
189 level.weapons[
"rpg"] =
"";
205 level.primary_weapon_array = [];
206 level.side_arm_array = [];
207 level.grenade_array = [];
208 level.inventory_array = [];
210 for( i = 0; i < max_weapon_num; i++ )
212 if( !isdefined( level.tbl_weaponIDs[i] ) || level.tbl_weaponIDs[i][
"group"] ==
"" )
216 if( !isdefined( level.tbl_weaponIDs[i] ) || level.tbl_weaponIDs[i][
"reference"] ==
"" )
221 weapon_type = level.tbl_weaponIDs[i][
"group"];
222 weapon = level.tbl_weaponIDs[i][
"reference"];
223 attachment = level.tbl_weaponIDs[i][
"attachment"];
227 if( isdefined( attachment ) && attachment !=
"" )
229 attachment_tokens = strtok( attachment,
" " );
230 if( isdefined( attachment_tokens ) )
232 if( attachment_tokens.size == 0 )
237 for( k = 0; k < attachment_tokens.size; k++ )
250 if ( weapon != level.weaponSpecialDiscGun )
254 playsoundatposition (
"wpn_disc_bounce_fatal",
self.origin);
261 level.itemExclusions = [];
263 while( GetDvarInt(
"item_exclusion_" + currentDvar ) )
265 level.itemExclusions[ currentDvar ] = GetDvarInt(
"item_exclusion_" + currentDvar );
269 level.attachmentExclusions = [];
272 while( GetDvarString(
"attachment_exclusion_" + currentDvar ) !=
"" )
274 level.attachmentExclusions[ currentDvar ] = GetDvarString(
"attachment_exclusion_" + currentDvar );
282 numExclusions = level.attachmentExclusions.size;
284 for ( exclusionIndex = 0; exclusionIndex < numExclusions; exclusionIndex++ )
286 if ( attachment == level.attachmentExclusions[ exclusionIndex ] )
297 if ( !isdefined( level.statsTableID ) )
300 level.statsTableID = TableLookupFindCoreAsset( statsTableName );
319 itemReference = GetDefaultClassSlot( className, slotName );
330 return itemReference;
335 level.classToClassNum[ weaponclass ] = classNum;
340 if( isSubstr(
"weapon_smg weapon_cqb weapon_assault weapon_lmg weapon_sniper weapon_shotgun weapon_launcher weapon_knife weapon_special", weapon_type ) )
341 level.primary_weapon_array[GetWeapon( weaponName )] = 1;
342 else if( isSubstr(
"weapon_pistol", weapon_type ) )
343 level.side_arm_array[GetWeapon( weaponName )] = 1;
344 else if( weapon_type ==
"weapon_grenade" )
345 level.grenade_array[GetWeapon( weaponName )] = 1;
346 else if( weapon_type ==
"weapon_explosive" )
347 level.inventory_array[GetWeapon( weaponName )] = 1;
348 else if( weapon_type ==
"weapon_rifle" )
349 level.inventory_array[GetWeapon( weaponName )] = 1;
351 assert(
false,
"Weapon group info is missing from statsTable for: " + weapon_type );
356 readyVO = weapon.name +
"_ready";
358 game[
"dialog"][readyVO] = readyVO;
364 level.tbl_weaponIDs = [];
365 level.heroWeaponsTable = [];
377 if ( isSubStr( group_s,
"weapon_" ) || group_s ==
"hero" )
380 if( reference_s !=
"" )
382 weapon = GetWeapon( reference_s );
384 if ( weapon.inventoryType ==
"hero" )
386 level.heroWeaponsTable[reference_s] = [];
387 level.heroWeaponsTable[reference_s][
"index"] = i;
392 level.tbl_weaponIDs[i][
"reference"] = reference_s;
393 level.tbl_weaponIDs[i][
"group"] = group_s;
394 level.tbl_weaponIDs[i][
"count"] = int( tableLookupColumnForRow( level.statsTableID, itemRow,
STATS_TABLE_COL_COUNT ) );
401 level.perkNames = [];
402 level.perkIcons = [];
403 level.perkSpecialties = [];
414 if ( group_s ==
"specialty" )
418 if( reference_s !=
"" )
423 level.perkNames[ perkIcon ] = perkName;
426 level.perkIcons[ perk_name ] = perkIcon;
427 level.perkSpecialties[ perk_name ] = reference_s;
433 level.killStreakNames = [];
434 level.killStreakIcons = [];
435 level.KillStreakIndices = [];
446 if ( group_s ==
"killstreak" )
450 if( reference_s !=
"" )
452 level.tbl_KillStreakData[i] = reference_s;
453 level.killStreakIndices[ reference_s ] = i;
457 level.killStreakNames[ reference_s ] =
name;
458 level.killStreakIcons[ reference_s ] = icon;
459 level.killStreakIndices[ reference_s ] = i;
468 assert( isdefined( level.classMap[ response ] ) );
470 return ( level.classMap[ response ] );
479 attachmentString = GetItemAttachment( weaponNum, attachmentNum );
483 attachmentString = attachmentString +
"_";
487 attachmentString =
"";
490 return attachmentString;
495 if ( !isdefined( level.attachmentsDisabled ) )
500 return level.attachmentsDisabled;
508 killstreakString =
"killstreak" + killstreakNum;
511 if ( GetDvarInt(
"custom_killstreak_mode" ) == 2 )
513 return GetDvarInt(
"custom_" + killstreakString );
517 return(
self GetLoadoutItem( weaponclass, killstreakString ) );
523 self.killstreak = [];
525 if ( !level.loadoutKillstreaksEnabled )
528 classNum =
self.class_num_for_global_weapons;
530 sortedKillstreaks = [];
531 currentKillstreak = 0;
533 for ( killstreakNum = 0; killstreakNum < level.maxKillstreaks; killstreakNum++ )
537 if ( isdefined( killstreakIndex ) && ( killstreakIndex > 0 ) )
539 assert( isdefined( level.tbl_KillStreakData[ killstreakIndex ] ),
"KillStreak #:" + killstreakIndex +
"'s data is undefined" );
541 if ( isdefined( level.tbl_KillStreakData[ killstreakIndex ] ) )
543 self.killstreak[ currentKillstreak ] = level.tbl_KillStreakData[ killstreakIndex ];
544 if ( isdefined( level.usingMomentum ) && level.usingMomentum )
547 if ( isdefined( killstreakType ) )
551 self GiveWeapon( weapon );
553 if ( isdefined( level.usingScoreStreaks ) && level.usingScoreStreaks )
555 if( weapon.isCarriedKillstreak )
557 if( !isdefined(
self.pers[
"held_killstreak_ammo_count"][weapon] ) )
558 self.pers[
"held_killstreak_ammo_count"][weapon] = 0;
560 if( !isDefined(
self.pers[
"held_killstreak_clip_count"][weapon] ) )
561 self.pers[
"held_killstreak_clip_count"][weapon] = 0;
563 if(
self.pers[
"held_killstreak_ammo_count"][weapon] > 0 )
565 self setWeaponAmmoClip( weapon,
self.pers[
"held_killstreak_clip_count"][weapon] );
566 self setWeaponAmmoStock( weapon,
self.pers[
"held_killstreak_ammo_count"][weapon] -
self.pers[
"held_killstreak_clip_count"][weapon] );
575 quantity =
self.pers[
"killstreak_quantity"][weapon];
576 if ( !isdefined( quantity ) )
580 self setWeaponAmmoClip( weapon, quantity );
585 sortData = spawnstruct();
586 sortData.cost = level.killstreaks[killstreakType].momentumCost;
587 sortData.weapon = weapon;
589 for ( sortIndex = 0 ; sortIndex < sortedKillstreaks.size ; sortIndex++ )
591 if ( sortedKillstreaks[sortIndex].cost > sortData.cost )
594 for ( i = sortedKillstreaks.size ; i > sortIndex ; i-- )
596 sortedKillstreaks[i] = sortedKillstreaks[i-1];
598 sortedKillstreaks[sortIndex] = sortData;
606 actionSlotOrder = [];
607 actionSlotOrder[0] = 4;
608 actionSlotOrder[1] = 2;
609 actionSlotOrder[2] = 1;
611 if ( isdefined( level.usingMomentum ) && level.usingMomentum )
613 for ( sortIndex = 0 ; (sortIndex < sortedKillstreaks.size && sortIndex < actionSlotOrder.size) ; sortIndex++ )
615 if( sortedKillstreaks[sortIndex].weapon != level.weaponNone )
616 self SetActionSlot( actionSlotOrder[sortIndex],
"weapon", sortedKillstreaks[sortIndex].weapon );
623 return ( isdefined( perkName ) && IsString( perkName ) );
638 self.staticWeaponsStartTime = getTime();
643 if ( equipment_name == level.weapontacticalInsertion.name && level.disableTacInsert )
651 if ( level.leagueMatch )
653 return ( IsItemRestricted( item ) );
661 if ( isdefined( level.giveCustomCharacters ) )
663 self [[level.giveCustomCharacters]]();
666 if ( isdefined( level.giveCustomLoadout ) )
668 self [[level.giveCustomLoadout]]();
676 self takeAllWeapons();
681 self.killstreak = [];
682 self.primaryWeaponKill =
false;
683 self.secondaryWeaponKill =
false;
685 self.grenadeTypePrimary = level.weaponNone;
686 self.grenadeTypePrimaryCount = 0;
687 self.grenadeTypeSecondary = level.weaponNone;
688 self.grenadeTypeSecondaryCount = 0;
691 self notify(
"give_map" );
696 self.specialty =
self GetLoadoutPerks(
self.class_num );
700 self SetPlayerStateLoadoutBonusCards(
self.class_num );
701 self SetPlayerStateLoadoutWeapons(
self.class_num );
703 if ( level.leagueMatch )
705 for ( i = 0; i <
self.specialty.size; i++ )
709 ArrayRemoveIndex(
self.specialty, i );
720 anteup_bonus = GetDvarInt(
"perk_killstreakAnteUpResetValue" );
721 momentum_at_spawn_or_game_end =
VAL(
self.pers[
"momentum_at_spawn_or_game_end"], 0 );
722 hasNotDoneCombat = !(
self.hasDoneCombat === true );
723 if ( ( level.inPreMatchPeriod || ( level.inGracePeriod && hasNotDoneCombat ) ) && momentum_at_spawn_or_game_end < anteup_bonus )
725 new_momentum = (
self HasPerk(
"specialty_anteup" ) ? anteup_bonus : momentum_at_spawn_or_game_end );
732 if( isSubstr( weaponclass,
"CLASS_CUSTOM" ) )
737 self.class_num = int( weaponclass[weaponclass.size-1] )-1;
740 if( -1 ==
self.class_num )
746 self.class_num_for_global_weapons =
self.class_num;
751 playerRenderOptions =
self CalcPlayerOptions(
self.class_num );
752 self SetPlayerRenderOptions( playerRenderOptions );
759 assert( isdefined(
self.pers[
"class"]),
"Player during spawn and loadout got no class!" );
761 self.class_num = level.classToClassNum[ weaponclass ];
762 self.class_num_for_global_weapons = 0;
764 self SetPlayerRenderOptions( 0 );
767 self recordLoadoutIndex(
self.class_num );
773 self.spawnWeapon = level.weaponBaseMeleeHeld;
776 knifeWeaponOptions =
self CalcWeaponOptions(
self.class_num, 2 );
777 self GiveWeapon( level.weaponBaseMeleeHeld, knifeWeaponOptions );
779 self.pers[
"spawnWeapon"] =
self.spawnWeapon;
781 switchImmediate = isdefined(
self.alreadySetSpawnWeaponOnce );
782 self setSpawnWeapon(
self.spawnWeapon, switchImmediate );
783 self.alreadySetSpawnWeaponOnce =
true;
788 spawnWeapon = level.weaponNull;
789 initialWeaponCount = 0;
793 if ( isdefined(
self.pers[
"weapon"] ) &&
self.pers[
"weapon"] != level.weaponNone && !
self.pers[
"weapon"].isCarriedKillstreak )
795 primaryWeapon =
self.pers[
"weapon"];
799 primaryWeapon =
self GetLoadoutWeapon(
self.class_num,
"primary" );
802 if( primaryWeapon.isCarriedKillstreak )
804 primaryWeapon = level.weaponNull;
807 self.pers[
"primaryWeapon"] = primaryWeapon;
810 if ( primaryWeapon != level.weaponNull )
812 primaryWeaponOptions =
self CalcWeaponOptions(
self.class_num, 0 );
816 acvi =
self GetAttachmentCosmeticVariantForWeapon(
self.class_num,
"primary" );
817 self GiveWeapon( primaryWeapon, primaryWeaponOptions, acvi );
821 self.primaryLoadoutWeapon = primaryWeapon;
822 self.primaryLoadoutAltWeapon = primaryWeapon.altWeapon;
823 self.primaryLoadoutGunSmithVariantIndex =
self GetLoadoutGunSmithVariantIndex(
self.class_num, 0 );
824 if(
self HasPerk(
"specialty_extraammo" ) )
826 self giveMaxAmmo( primaryWeapon );
829 spawnWeapon = primaryWeapon;
830 initialWeaponCount++;
834 sidearm =
self GetLoadoutWeapon(
self.class_num,
"secondary" );
836 if( sidearm.isCarriedKillstreak )
837 sidearm = level.weaponNull;
839 if( sidearm.name ==
"bowie_knife" )
840 sidearm = level.weaponNull;
842 if ( sidearm != level.weaponNull )
844 secondaryWeaponOptions =
self CalcWeaponOptions(
self.class_num, 1 );
848 acvi =
self GetAttachmentCosmeticVariantForWeapon(
self.class_num,
"secondary" );
849 self GiveWeapon( sidearm, secondaryWeaponOptions, acvi );
850 self.secondaryLoadoutWeapon = sidearm;
851 self.secondaryLoadoutAltWeapon = sidearm.altWeapon;
852 self.secondaryLoadoutGunSmithVariantIndex =
self GetLoadoutGunSmithVariantIndex(
self.class_num, 1 );
854 if (
self HasPerk(
"specialty_extraammo" ) )
856 self giveMaxAmmo( sidearm );
859 if ( spawnWeapon == level.weaponNull )
861 spawnWeapon = sidearm;
864 initialWeaponCount++;
867 if ( !
self HasMaxPrimaryWeapons() )
869 if ( !isUsingT7Melee() )
872 knifeWeaponOptions =
self CalcWeaponOptions(
self.class_num, 2 );
873 self GiveWeapon( level.weaponBaseMeleeHeld, knifeWeaponOptions );
876 if ( initialWeaponCount == 0 )
878 spawnWeapon = level.weaponBaseMeleeHeld;
882 if ( !isdefined(
self.spawnWeapon ) && isdefined(
self.pers[
"spawnWeapon"] ) )
884 self.spawnWeapon =
self.pers[
"spawnWeapon"];
887 if ( isdefined(
self.spawnWeapon ) && DoesWeaponReplaceSpawnWeapon(
self.spawnWeapon, spawnWeapon ) && !
self.pers[
"changed_class"] )
889 spawnWeapon =
self.spawnWeapon;
894 self.pers[
"changed_class"] =
false;
895 self.spawnWeapon = spawnWeapon;
896 self.pers[
"spawnWeapon"] =
self.spawnWeapon;
898 switchImmediate = isdefined(
self.alreadySetSpawnWeaponOnce );
899 self setSpawnWeapon( spawnWeapon, switchImmediate );
900 self.alreadySetSpawnWeaponOnce =
true;
904 self bbClassChoice(
self.class_num, primaryWeapon, sidearm );
909 changedClass =
self.pers[
"changed_class"];
913 primaryOffhand = level.weaponNone;
914 primaryOffhandCount = 0;
916 if ( GetDvarint(
"gadgetEnabled") == 1 || GetDvarint(
"equipmentAsGadgets") == 1 )
918 primaryOffhand =
self GetLoadoutWeapon(
self.class_num,
"primaryGadget" );
919 primaryOffhandCount = primaryOffhand.startammo;
923 primaryOffhandName =
self GetLoadoutItemRef(
self.class_num,
"primarygrenade" );
925 if ( primaryOffhandName !=
"" && primaryOffhandName !=
"weapon_null" )
927 primaryOffhand = GetWeapon( primaryOffhand );
928 primaryOffhandCount =
self GetLoadoutItem(
self.class_num,
"primarygrenadecount" );
934 primaryOffhand = level.weaponNone;
935 primaryOffhandCount = 0;
938 if ( primaryOffhand == level.weaponNone )
940 primaryOffhand = GetWeapon(
"null_offhand_primary" );
941 primaryOffhandCount = 0;
944 if ( primaryOffhand != level.weaponNull )
948 self GiveWeapon( primaryOffhand );
950 self SetWeaponAmmoClip( primaryOffhand, primaryOffhandCount );
951 self SwitchToOffhand( primaryOffhand );
952 self.grenadeTypePrimary = primaryOffhand;
953 self.grenadeTypePrimaryCount = primaryOffhandCount;
961 changedClass =
self.pers[
"changed_class"];
965 secondaryOffhand = level.weaponNone;
966 secondaryOffhandCount = 0;
968 if ( GetDvarint(
"gadgetEnabled") == 1 || GetDvarint(
"equipmentAsGadgets") == 1 )
970 secondaryOffhand =
self GetLoadoutWeapon(
self.class_num,
"secondaryGadget" );
971 secondaryOffhandCount = secondaryOffhand.startammo;
975 secondaryOffhandName =
self GetLoadoutItemRef(
self.class_num,
"specialgrenade" );
977 if ( secondaryOffhandName !=
"" && secondaryOffhandName !=
"weapon_null" )
979 secondaryOffhand = GetWeapon( secondaryOffhand );
980 secondaryOffhandCount =
self GetLoadoutItem(
self.class_num,
"specialgrenadecount" );
986 secondaryOffhand = level.weaponNone;
987 secondaryOffhandCount = 0;
990 if ( secondaryOffhand == level.weaponNone )
992 secondaryOffhand = GetWeapon(
"null_offhand_secondary" );
993 secondaryOffhandCount = 0;
996 if ( secondaryOffhand != level.weaponNull )
998 self GiveWeapon( secondaryOffhand );
1000 self SetWeaponAmmoClip( secondaryOffhand, secondaryOffhandCount );
1001 self SwitchToOffhand( secondaryOffhand );
1002 self.grenadeTypeSecondary = secondaryOffhand;
1003 self.grenadeTypeSecondaryCount = secondaryOffhandCount;
1011 changedClass =
self.pers[
"changed_class"];
1015 classNum =
self.class_num_for_global_weapons;
1017 specialOffhand = level.weaponNone;
1018 specialOffhandCount = 0;
1020 specialOffhand =
self GetLoadoutWeapon(
self.class_num_for_global_weapons,
"herogadget" );
1021 specialOffhandCount = specialOffhand.startammo;
1023 if ( isdefined(
self.pers[#
"rouletteWeapon"] ) )
1025 assert( specialOffhand.name ==
"gadget_roulette" );
1026 specialOffhand =
self.pers[#
"rouletteWeapon"];
1032 specialOffhand = level.weaponNone;
1033 specialOffhandCount = 0;
1036 if ( specialOffhand == level.weaponNone )
1038 specialOffhand = level.weaponNull;
1039 specialOffhandCount = 0;
1042 if ( specialOffhand != level.weaponNull )
1044 self GiveWeapon( specialOffhand );
1046 self SetWeaponAmmoClip( specialOffhand, specialOffhandCount );
1047 self SwitchToOffhand( specialOffhand );
1048 self.grenadeTypeSpecial = specialOffhand;
1049 self.grenadeTypeSpecialCount = specialOffhandCount;
1057 changedClass =
self.pers[
"changed_class"];
1061 classNum =
self.class_num_for_global_weapons;
1062 heroWeapon = level.weaponNone;
1063 heroWeaponName =
self GetLoadoutItemRef(
self.class_num_for_global_weapons,
"heroWeapon" );
1065 if ( heroWeaponName !=
"" && heroWeaponName !=
"weapon_null" )
1067 if ( heroWeaponName ==
"hero_minigun" )
1069 model =
self GetCharacterBodyModel();
1070 if ( IsDefined( model ) && IsSubStr(model,
"body3") )
1072 heroWeaponName =
"hero_minigun_body3";
1076 heroWeapon = GetWeapon( heroWeaponName );
1079 if ( heroWeapon != level.weaponNone )
1081 self.heroWeapon = heroWeapon;
1082 self GiveWeapon( heroWeapon );
1090 if ( isdefined( level.giveCustomLoadout ) )
1092 spawnWeapon =
self [[level.giveCustomLoadout]]();
1093 if( isdefined( spawnWeapon ) )
1097 self.spawnWeapon = spawnWeapon;
1105 self SetActionSlot( 3,
"altMode" );
1106 self SetActionSlot( 4,
"" );
1108 allocationSpent =
self GetLoadoutAllocation(
self.class_num );
1109 overAllocation = ( allocationSpent > level.maxAllocation );
1112 if( !overAllocation )
1127 if ( GetDvarint(
"tu11_enableClassicMode") == 0 )
1138 if( isdefined(
self.movementSpeedModifier ) )
1140 self setMoveSpeedScale(
self.movementSpeedModifier *
self getMoveSpeedScale() );
1152 if ( !isdefined(
self.firstSpawn ) )
1154 if ( isdefined( spawnWeapon ) )
1155 self InitialWeaponRaise( spawnWeapon );
1157 self InitialWeaponRaise( primaryWeapon );
1162 self SetEverHadWeaponAll(
true );
1165 self.firstSpawn =
false;
1166 self.switchedTeamsResetGadgets =
false;
1175 if ( weapon.isClipOnly )
1177 self setWeaponAmmoClip( weapon, amount );
1181 self setWeaponAmmoClip( weapon, amount );
1182 diff = amount -
self getWeaponAmmoClip( weapon );
1183 assert( diff >= 0 );
1184 self setWeaponAmmoStock( weapon, diff );
1190 if ( !isdefined(
self.pers[
"class"] ) )
1192 self.pers[
"class"] =
"";
1194 self.curClass =
self.pers[
"class"];
1195 self.lastClass =
"";
1197 self.detectExplosives =
false;
1198 self.bombSquadIcons = [];
1199 self.bombSquadIds = [];
1200 self.reviveIcons = [];
1201 self.reviveIds = [];
1209 self fadeOverTime( fadeDelay );
1216 self.curClass = newClass;
1227 level.cac_armorpiercing_data = GetDvarInt(
"perk_armorpiercing", 40 ) / 100;
1228 level.cac_bulletdamage_data = GetDvarInt(
"perk_bulletDamage", 35 );
1229 level.cac_fireproof_data = GetDvarInt(
"perk_fireproof", 20 );
1230 level.cac_armorvest_data = GetDvarInt(
"perk_armorVest", 80 );
1231 level.cac_flakjacket_data = GetDvarInt(
"perk_flakJacket", 35 );
1232 level.cac_flakjacket_hardcore_data = GetDvarInt(
"perk_flakJacket_hardcore", 9 );
1240 self.detectExplosives =
false;
1243 if ( IsDefined(
self.specialty ) )
1245 perks =
self.specialty;
1246 for( i=0; i<perks.size; i++ )
1250 if( perk ==
"specialty_detectexplosive" )
1251 self.detectExplosives =
true;
1258 perks =
self.specialty;
1260 for( i=0; i<perks.size; i++ )
1266 if ( perk ==
"specialty_null" || isSubStr( perk,
"specialty_weapon_" ) || perk ==
"weapon_null" )
1269 if ( !level.perksEnabled )
1272 self setPerk( perk );
1279 if ( !isdefined( victim) || !isdefined( attacker ) || !isplayer( attacker ) )
1281 if ( !isdefined(
damage ) || !isdefined( meansofdeath ) || !isdefined( weapon ) )
1289 if ( attacker HasPerk(
"specialty_bulletdamage" ) &&
isPrimaryDamage( meansofdeath ) )
1291 final_damage =
damage*(100+level.cac_bulletdamage_data)/100;
1295 final_damage = old_damage;
1299 return int( final_damage );
1304 assert( isdefined( victim ) );
1305 assert( isdefined( attacker ) );
1306 assert( IsPlayer( victim ) );
1308 attacker_is_player = IsPlayer( attacker );
1317 if ( victim != attacker )
1319 if ( attacker_is_player && attacker HasPerk(
"specialty_bulletdamage" ) &&
isPrimaryDamage( mod ) )
1322 if( victim HasPerk(
"specialty_armorvest" ) && !
isHeadDamage( hitloc ) )
1327 final_damage =
damage * ( 100 + level.cac_bulletdamage_data ) / 100;
1333 final_damage =
damage * ( level.cac_armorvest_data * .01 );
1335 else if ( victim HasPerk(
"specialty_fireproof" ) &&
isFireDamage( weapon, mod ) )
1337 final_damage =
damage * ( level.cac_fireproof_data * .01 );
1342 cac_data = ( level.hardcoreMode ? level.cac_flakjacket_hardcore_data : level.cac_flakjacket_data );
1346 if ( level.teambased && attacker.team != victim.team )
1350 else if ( attacker != victim )
1356 final_damage = int(
damage * ( cac_data / 100 ) );
1360 final_damage = int( final_damage );
1362 if ( final_damage < 1 )
1367 return ( final_damage );
1373 switch( meansofdeath )
1376 case "MOD_GRENADE_SPLASH":
1377 case "MOD_PROJECTILE":
1378 case "MOD_PROJECTILE_SPLASH":
1379 case "MOD_EXPLOSIVE":
1388 return ( player HasPerk(
"specialty_stunprotection" ) || player HasPerk(
"specialty_flashprotection" ) || player HasPerk(
"specialty_proximityprotection" ) );
1394 return( meansofdeath ==
"MOD_RIFLE_BULLET" || meansofdeath ==
"MOD_PISTOL_BULLET" );
1399 return( meansofdeath ==
"MOD_RIFLE_BULLET" || meansofdeath ==
"MOD_PISTOL_BULLET" || meansofdeath ==
"MOD_HEAD_SHOT" );
1405 return IsDefined( attacker ) && IsPlayer( attacker ) && attacker HasPerk(
"specialty_armorpiercing" ) && IsDefined( sMeansOfDeath ) &&
isBulletDamage( sMeansOfDeath );
1410 if ( weapon.doesFireDamage && (meansofdeath ==
"MOD_BURNED" || meansofdeath ==
"MOD_GRENADE" || meansofdeath ==
"MOD_GRENADE_SPLASH") )
1418 return ( hitloc ==
"helmet" || hitloc ==
"head" || hitloc ==
"neck" );
1423 return ( isdefined( inflictor ) && isdefined( inflictor.stucktoplayer ) && inflictor.stucktoplayer ==
self );