1 #insert scripts\shared\shared.gsh;
2 #insert scripts\shared\version.gsh;
4 #using scripts\codescripts\struct;
5 #using scripts\shared\abilities\gadgets\_gadget_camo;
6 #using scripts\shared\array_shared;
7 #using scripts\shared\callbacks_shared;
8 #using scripts\shared\clientfield_shared;
9 #using scripts\shared\killstreaks_shared;
10 #using scripts\shared\system_shared;
11 #using scripts\shared\util_shared;
13 #using scripts\mp\gametypes\_dev;
15 #using scripts\mp\gametypes\_globallogic;
16 #using scripts\mp\gametypes\_globallogic_audio;
18 #using scripts\mp\killstreaks\_killstreaks;
20 #namespace battlechatter;
24 #define INCOMING_ALERT "incoming_alert"
25 #define INCOMING_DELAY "incoming_delay"
26 #define KILL_DIALOG "kill_dialog"
28 #define DIALOG_FLAG_TEAM 1
29 #define DIALOG_FLAG_ALL 2
30 #define DIALOG_FLAG_INTERRUPT 4
31 #define DIALOG_FLAG_UNDERWATER 8
32 #define DIALOG_FLAG_EXERT 16 // Plays when VO is turned off
33 #define DIALOG_FLAG_GADGET_READY 32
34 #define DIALOG_FLAG_STOLEN_GADGET_READY 64
36 #define DIALOG_FLAGS_SHOUT 6 // ALL + INTERRUPT
37 #define DIALOG_FLAGS_PAIN 30 // ALL + INTERRUPT + UNDERWATER + EXERT
39 #define STOLEN_GADGET_READY_LINE_COUNT 4
41 #define VOICE_TAG "J_Head"
44 #define PLAY_BOOST "play_boost"
46 #define BOOST_RESPONSE 2
64 level.bcSounds[
INCOMING_ALERT ][
"incendiary_grenade" ] =
"incomingIncendiary";
65 level.bcSounds[
INCOMING_ALERT ][
"sticky_grenade" ] =
"incomingSemtex";
70 level.bcSounds[
INCOMING_DELAY ][
"frag_grenade" ] =
"fragGrenadeDelay";
71 level.bcSounds[
INCOMING_DELAY ][
"incendiary_grenade" ] =
"incendiaryGrenadeDelay";
73 level.bcSounds[
INCOMING_DELAY ][
"launcher_standard" ] =
"missileDelay";
76 level.bcSounds[
KILL_DIALOG ][
"assassin" ] =
"killSpectre";
77 level.bcSounds[
KILL_DIALOG ][
"grenadier" ] =
"killGrenadier";
78 level.bcSounds[
KILL_DIALOG ][
"outrider" ] =
"killOutrider";
79 level.bcSounds[
KILL_DIALOG ][
"prophet" ] =
"killTechnomancer";
80 level.bcSounds[
KILL_DIALOG ][
"pyro" ] =
"killFirebreak";
81 level.bcSounds[
KILL_DIALOG ][
"reaper" ] =
"killReaper";
82 level.bcSounds[
KILL_DIALOG ][
"ruin" ] =
"killMercenary";
83 level.bcSounds[
KILL_DIALOG ][
"seraph" ] =
"killEnforcer";
84 level.bcSounds[
KILL_DIALOG ][
"trapper" ] =
"killTrapper";
85 level.bcSounds[
KILL_DIALOG ][
"blackjack" ] =
"killBlackjack";
87 if ( level.teambased && !isdefined( game[
"boostPlayersPicked"] ) )
89 game[
"boostPlayersPicked"] = [];
90 foreach ( team
in level.teams )
92 game[
"boostPlayersPicked"][ team ] =
false;
96 level.allowbattlechatter = GetGametypeSetting(
"allowBattleChatter" );
104 foreach( bundle
in playerDialogBundles )
121 level.allowSpecialistDialog =
mpdialog_value(
"enableHeroDialog",
false ) && level.allowBattlechatter;
122 level.playStartConversation =
mpdialog_value(
"enableConversation",
false ) && level.allowBattlechatter;
135 self endon(
"disconnect" );
137 if ( level.teambased )
139 if (
self.team ==
"allies" )
150 if ( randomIntRange( 0, 2 ) )
162 if ( level.disablePrematchMessages ===
true )
167 if (
IS_TRUE( level.inPrematchPeriod ) && !
IS_TRUE(
self.pers[
"playedGameMode"] ) && isdefined( level.leaderDialog ) )
169 if( level.hardcoreMode )
174 self.pers[
"playedGameMode"] =
true;
180 self.pers[
"mptaacom"] =
"blops_taacom";
181 self.pers[
"mpcommander"] =
"blops_commander";
186 self.pers[
"mptaacom"] =
"cdp_taacom";
187 self.pers[
"mpcommander"] =
"cdp_commander";
200 if ( level.splitscreen )
212 if ( level.teambased )
221 self.enemyThreatTime = 0;
222 self.heartbeatsnd =
false;
224 self.soundMod =
"player";
226 self.voxUnderwaterTime = 0;
227 self.voxEmergeBreath =
false;
228 self.voxDrowning =
false;
230 self.pilotisSpeaking =
false;
231 self.playingDialog =
false;
232 self.playingGadgetReadyDialog =
false;
234 self.playedGadgetSuccess =
true;
241 if ( !isdefined( dialogChance ) || dialogChance <= 0 )
245 else if ( dialogChance >= 100 )
250 return ( RandomInt( 100 ) < dialogChance );
255 if ( !isdefined( mpdialogKey ) )
262 if ( !isdefined( mpdialog ) )
267 structValue = GetStructField( mpdialog, mpdialogKey );
269 if ( !isdefined( structValue ) )
279 self endon (
"death" );
280 level endon (
"game_ended" );
288 assert( interval > 0,
"underWaterInterval mpdialog scriptbundle value must be greater than 0" );
294 if (
self IsPlayerUnderwater() )
296 if ( !
self.voxUnderwaterTime && !
self.voxEmergeBreath )
299 self.voxUnderwaterTime = GetTime();
301 else if (
self.voxUnderwaterTime )
303 if ( GetTime() >
self.voxUnderwaterTime +
mpdialog_value(
"underwaterBreathTime", 0 ) * 1000 )
305 self.voxUnderwaterTime = 0;
306 self.voxEmergeBreath =
true;
312 if (
self.voxDrowning )
316 self.voxDrowning =
false;
317 self.voxEmergeBreath =
false;
319 else if (
self.voxEmergeBreath )
322 self.voxEmergeBreath =
false;
333 if( meansOfDeath ==
"MOD_DROWN" )
335 dialogKey =
"exertPainDrowning";
336 self.voxDrowning =
true;
338 else if ( meansofDeath ==
"MOD_FALLING" )
340 dialogKey =
"exertPainFalling";
342 else if (
self IsPlayerUnderwater() )
344 dialogKey =
"exertPainUnderwater";
348 dialogKey =
"exertPain";
358 self endon(
"death" );
359 level endon(
"game_ended" );
364 if( !level.teamBased )
372 self endon(
"death" );
373 level endon(
"game_ended" );
378 self endon(
"death" );
379 level endon(
"game_ended" );
383 self waittill (
"weapon_ads" );
385 if (
self HasPerk(
"specialty_quieter" ) )
390 if(
self.enemyThreatTime + (
mpdialog_value(
"enemyContactInterval", 0 ) * 1000 ) >= getTime() )
397 if ( !isdefined ( closest_ally ) )
404 if ( DistanceSquared(
self.origin, closest_ally.origin ) < allyRadius * allyRadius )
406 eyePoint =
self getEye();
407 dir = AnglesToForward(
self GetPlayerAngles() );
411 endPoint = eyePoint + dir;
413 traceResult = BulletTrace( eyePoint, endPoint,
true,
self );
415 if ( isdefined( traceResult[
"entity"] ) && traceResult[
"entity"].className ==
"player" && traceResult[
"entity"].team !=
self.team )
421 level notify (
"level_enemy_spotted",
self.team);
423 self.enemyThreatTime = GetTime();
434 self endon(
"disconnect");
435 sniper endon(
"disconnect");
436 level endon(
"game_ended" );
438 if ( !level.teamBased )
452 if( isdefined( closest_ally ) && DistanceSquared(
self.origin, closest_ally.origin ) < allyRadius * allyRadius )
456 sniper.spottedTime = GetTime();
457 sniper.spottedBy = [];
460 players = ArraySort( players,
self.origin );
463 voiceRadiusSq = voiceRadius * voiceRadius;
465 foreach( player
in players )
467 if ( DistanceSquared( closest_ally.origin, player.origin) <= voiceRadiusSq )
469 sniper.spottedBy[sniper.spottedBy.size] = player;
479 if ( !level.teamBased )
484 if (
self === attacker )
493 if( isdefined( killstreakType ) )
495 if ( !isdefined( level.killstreaks[killstreakType] ) ||
496 !isdefined( level.killstreaks[killstreakType].threatOnKill ) ||
497 !level.killstreaks[killstreakType].threatOnKill ||
506 if ( isdefined( ally ) && DistanceSquared(
self.origin, ally.origin ) < allyRadius * allyRadius )
515 if ( weapon.skipBattlechatterKill ||
516 !isdefined( attacker ) ||
517 !IsPlayer( attacker ) ||
518 !IsAlive( attacker ) ||
519 attacker IsRemoteControlling() ||
520 attacker IsInVehicle() ||
521 attacker IsWeaponViewOnlyLinked() ||
522 !isdefined( victim ) ||
523 !IsPlayer( victim ) )
529 if ( isdefined( inflictor ) && !IsPlayer( inflictor ) && inflictor.birthtime < attacker.spawntime )
534 if ( weapon.inventorytype ==
"hero" )
536 DEFAULT( attacker.heroweaponKillCount, 0 );
538 attacker.heroweaponKillCount++;
540 if ( !
IS_TRUE( attacker.playedGadgetSuccess ) && attacker.heroweaponKillCount ===
mpdialog_value(
"heroWeaponKillCount", 0 ) )
548 else if (
IS_TRUE( attacker.speedburstOn ) )
550 if ( !
IS_TRUE( attacker.speedburstKill ) )
553 if ( DistanceSquared( attacker.origin, victim.origin ) < speedBurstKillDist * speedBurstKillDist )
555 attacker.speedburstKill =
true;
560 ( isdefined( attacker.gadget_camo_off_time ) && attacker.gadget_camo_off_time + (
mpdialog_value(
"camoKillTime", 0 ) * 1000 ) >= GetTime() ) )
562 if ( !
IS_TRUE( attacker.playedGadgetSuccess ) )
569 if ( isdefined( victim.spottedTime ) &&
570 victim.spottedTime +
mpdialog_value(
"enemySniperKillTime", 0 ) >= GetTime() &&
571 array::contains( victim.spottedBy, attacker ) &&
578 victimDialogName = victim GetMpDialogName();
588 victim.spottedTime = undefined;
589 victim.spottedBy = undefined;
591 if ( !isdefined( killDialog ) )
602 self endon(
"death" );
603 level endon(
"game_ended" );
607 self waittill (
"grenade_fire", grenade, weapon );
609 if ( !isdefined( grenade.weapon ) ||
610 !isdefined( grenade.weapon.rootweapon ) ||
616 dialogKey = level.bcSounds[
INCOMING_ALERT ][ grenade.weapon.rootweapon.name ];
618 if ( isdefined( dialogKey ) )
628 self endon(
"death" );
629 level endon(
"game_ended" );
633 self waittill (
"missile_fire", missile, weapon );
635 if ( !isdefined( missile.item ) ||
636 !isdefined( missile.item.rootweapon ) ||
642 dialogKey = level.bcSounds[
INCOMING_ALERT ][ missile.item.rootweapon.name ];
644 if ( isdefined ( dialogKey ) )
654 level endon(
"game_ended" );
657 assert( waittime > 0,
"incoming_projectile_alert waittime must be greater than 0" );
666 if ( waittime > 0.2 )
668 waittime = waittime / 2;
672 if ( !isdefined( projectile ) )
678 if( !isdefined( thrower ) || thrower.team ==
"spectator" )
683 if( ( level.players.size ) )
687 incomingProjectileRadius =
mpdialog_value(
"incomingProjectileRadius", 0 );
689 if( isdefined( closest_enemy ) && DistanceSquared( projectile.origin, closest_enemy.origin ) < incomingProjectileRadius * incomingProjectileRadius )
700 self endon(
"death" );
701 level endon(
"game_ended" );
705 self waittill (
"grenade_stuck", grenade );
707 if ( IsAlive(
self ) && isdefined( grenade ) && isdefined( grenade.weapon ) )
709 if ( grenade.weapon.rootweapon.name ==
"sticky_grenade" )
719 self endon(
"death" );
720 level endon(
"game_ended" );
722 if ( !level.teambased )
730 allyRadiusSq *= allyRadiusSq;
732 foreach( player
in level.players )
734 if ( !isdefined( player ) ||
735 !IsAlive( player ) ||
736 player.sessionstate !=
"playing" ||
738 player.team !=
self.team )
743 distSq = DistanceSquared(
self.origin, player.origin );
745 if ( distSq > allyRadiusSq )
750 allies[allies.size] = player;
757 while (
self.playingDialog )
762 allies = ArraySort( allies,
self.origin );
764 foreach( player
in allies )
766 if ( !IsAlive( player ) ||
767 player.sessionstate !=
"playing" ||
768 player.playingDialog ||
769 player IsPlayerUnderwater() ||
770 player IsRemoteControlling() ||
771 player IsInVehicle() ||
772 player IsWeaponViewOnlyLinked() )
777 distSq = DistanceSquared(
self.origin, player.origin );
779 if ( distSq > allyRadiusSq )
791 self endon(
"death" );
792 level endon(
"game_ended" );
794 if ( !level.teambased )
803 players = ArraySort( players,
self.origin );
805 selfDialog =
self GetMpDialogName();
807 voiceRadiusSq = voiceRadius * voiceRadius;
809 foreach( player
in players )
811 if ( player ==
self ||
812 player GetMpDialogName() == selfDialog ||
814 DistanceSquared(
self.origin, player.origin ) >= voiceRadiusSq )
821 if ( !isdefined( dialogAlias ) )
830 if ( isdefined( ally ) )
832 ally PlaySoundOnTag( dialogAlias,
VOICE_TAG, undefined,
self );
840 self endon (
"death" );
841 level endon(
"game_ended" );
849 if ( isdefined( dialogAlias ) )
851 body PlaySoundOnTag( dialogAlias,
VOICE_TAG );
858 if (
self IsPlayerUnderwater() )
860 return "exertDeathDrowned";
863 if ( isdefined( meansOfDeath ) )
865 switch( meansOfDeath )
868 return "exertDeathBurned";
870 return "exertDeathDrowned";
874 if ( isdefined( weapon ) && meansOfDeath !==
"MOD_MELEE_WEAPON_BUTT" )
876 switch( weapon.rootweapon.name )
878 case "knife_loadout":
880 case "hero_armblade":
881 return "exertDeathStabbed";
882 case "hero_firefly_swarm":
883 return "exertDeathBurned";
884 case "hero_lightninggun_arc":
885 return "exertDeathElectrocuted";
894 if ( !isdefined( killstreakType ) || !isdefined( level.killstreaks[killstreakType] ) )
904 self endon(
"death" );
905 level endon(
"game_ended" );
907 if (isdefined( waitTime) && waitTime > 0 )
909 if ( isdefined( endNotify ) )
911 self endon( endNotify );
917 self thread
play_dialog( dialogKey, dialogFlags, dialogBuffer, enemy );
922 self endon(
"death" );
923 level endon(
"game_ended" );
925 if ( !isdefined( dialogKey ) ||
933 if ( !isdefined( dialogFlags ) )
943 if ( !isdefined( dialogBuffer ) )
950 if ( !isdefined( dialogAlias ) )
960 if (
self.playingDialog )
974 self.playingGadgetReadyDialog =
true;
979 DEFAULT(
self.stolenDialogIndex, 0 );
981 dialogAlias = dialogAlias +
"_0" +
self.stolenDialogIndex;
983 self.stolenDialogIndex++;
990 self PlaySoundOnTag( dialogAlias,
VOICE_TAG );
995 if ( isdefined( enemy ) )
998 self PlaySoundOnTag( dialogAlias,
VOICE_TAG,
self.team, enemy );
1002 self PlaySoundOnTag( dialogAlias,
VOICE_TAG,
self.team );
1007 self PlayLocalSound( dialogAlias );
1011 self notify(
"played_dialog" );
1018 self endon(
"death" );
1019 self endon(
"played_dialog" );
1020 self endon(
"stop_dialog" );
1021 level endon(
"game_ended" );
1023 self.playingDialog =
true;
1025 if ( isdefined( dialogBuffer ) && dialogBuffer > 0 )
1027 wait ( dialogBuffer );
1030 self.playingDialog =
false;
1031 self.playingGadgetReadyDialog =
false;
1036 self notify(
"stop_dialog" );
1040 self.playingDialog =
false;
1041 self.playingGadgetReadyDialog =
false;
1052 if ( !IsPlayer(
self ) )
1057 bundleName =
self GetMpDialogName();
1059 if ( !isdefined( bundleName ) )
1066 if ( !isdefined( playerBundle ) )
1077 field = dialogKey + i;
1078 fieldValue = GetStructField( bundle, field );
1080 while ( isdefined( fieldValue ) )
1082 aliasArray[i] = fieldValue;
1085 field = dialogKey + i;
1086 fieldValue = GetStructField( bundle, field );
1089 if ( !isdefined( bundle.keyCounts ) )
1091 bundle.keyCounts = [];
1094 bundle.keyCounts[dialogKey] = i;
1099 bundleName =
self GetMpDialogName();
1101 if ( !isdefined( bundleName ) )
1108 if ( !isdefined( playerBundle ) ||
1109 !isdefined( playerBundle.keyCounts ) ||
1110 !isdefined( playerBundle.keyCounts[dialogKey] ) )
1115 return dialogKey + RandomInt( playerBundle.keyCounts[dialogKey] );
1121 if ( !isdefined( weapon ) )
1124 dialogKey = undefined;
1126 switch( weapon.name )
1128 case "hero_gravityspikes":
1129 dialogKey =
"gravspikesWeaponReady";
1131 case "gadget_speed_burst":
1132 dialogKey =
"overdriveAbilityReady";
1134 case "hero_bowlauncher":
1135 case "hero_bowlauncher2":
1136 case "hero_bowlauncher3":
1137 case "hero_bowlauncher4":
1138 dialogKey =
"sparrowWeaponReady";
1140 case "gadget_vision_pulse":
1141 dialogKey =
"visionpulseAbilityReady";
1143 case "hero_lightninggun":
1144 case "hero_lightninggun_arc":
1145 dialogKey =
"tempestWeaponReady";
1147 case "gadget_flashback":
1148 dialogKey =
"glitchAbilityReady";
1150 case "hero_pineapplegun":
1151 dialogKey =
"warmachineWeaponREady";
1153 case "gadget_armor":
1154 dialogKey =
"kineticArmorAbilityReady";
1156 case "hero_annihilator":
1157 dialogKey =
"annihilatorWeaponReady";
1159 case "gadget_combat_efficiency":
1160 dialogKey =
"combatfocusAbilityReady";
1162 case "hero_chemicalgelgun":
1163 dialogKey =
"hiveWeaponReady";
1165 case "gadget_resurrect":
1166 dialogKey =
"rejackAbilityReady";
1168 case "hero_minigun":
1169 case "hero_minigun_body3":
1170 dialogKey =
"scytheWeaponReady";
1172 case "gadget_clone":
1173 dialogKey =
"psychosisAbilityReady";
1175 case "hero_armblade":
1176 dialogKey =
"ripperWeaponReady";
1179 dialogKey =
"activeCamoAbilityReady";
1181 case "hero_flamethrower":
1182 dialogKey =
"purifierWeaponReady";
1184 case "gadget_heat_wave":
1185 dialogKey =
"heatwaveAbilityReady";
1204 if (
self.playingGadgetReadyDialog )
1212 delayKey =
"thiefFlipDelay";
1216 delayKey =
"rouletteFlipDelay";
1226 genericKey =
"thiefWeaponReady";
1227 repeatKey =
"thiefWeaponRepeat";
1228 repeatThresholdKey =
"thiefRepeatThreshold";
1229 chanceKey =
"thiefReadyChance";
1230 delayKey =
"thiefRevealDelay";
1234 genericKey =
"rouletteAbilityReady";
1235 repeatKey =
"rouletteAbilityRepeat";
1236 repeatThresholdKey =
"rouletteRepeatThreshold";
1237 chanceKey =
"rouletteReadyChance";
1238 delayKey =
"rouletteRevealDelay";
1244 dialogKey = genericKey;
1250 if (
self.lastStolenGadget === weapon &&
1251 (
self.lastStolenGadgetTime +
mpdialog_value( repeatThresholdKey, 0 ) * 1000 ) > GetTime() )
1254 dialogKey = repeatKey;
1263 self.lastStolenGadget = weapon;
1264 self.lastStolenGadgetTime = GetTime();
1269 self notify(
"cancel_kill_dialog" );
1277 if ( !isdefined( weapon ) )
1280 dialogKey = undefined;
1282 switch( weapon.name )
1284 case "hero_gravityspikes":
1285 dialogKey =
"gravspikesWeaponUse";
1287 dialogBuffer = 0.05;
1289 case "gadget_speed_burst":
1290 dialogKey =
"overdriveAbilityUse";
1292 case "hero_bowlauncher":
1293 case "hero_bowlauncher2":
1294 case "hero_bowlauncher3":
1295 case "hero_bowlauncher4":
1296 dialogKey =
"sparrowWeaponUse";
1298 case "gadget_vision_pulse":
1299 dialogKey =
"visionpulseAbilityUse";
1301 case "hero_lightninggun":
1302 case "hero_lightninggun_arc":
1303 dialogKey =
"tempestWeaponUse";
1305 case "gadget_flashback":
1306 dialogKey =
"glitchAbilityUse";
1308 case "hero_pineapplegun":
1309 dialogKey =
"warmachineWeaponUse";
1311 case "gadget_armor":
1312 dialogKey =
"kineticArmorAbilityUse";
1314 case "hero_annihilator":
1315 dialogKey =
"annihilatorWeaponUse";
1317 case "gadget_combat_efficiency":
1318 dialogKey =
"combatfocusAbilityUse";
1320 case "hero_chemicalgelgun":
1321 dialogKey =
"hiveWeaponUse";
1323 case "gadget_resurrect":
1324 dialogKey =
"rejackAbilityUse";
1326 case "hero_minigun":
1327 case "hero_minigun_body3":
1328 dialogKey =
"scytheWeaponUse";
1330 case "gadget_clone":
1331 dialogKey =
"psychosisAbilityUse";
1333 case "hero_armblade":
1334 dialogKey =
"ripperWeaponUse";
1337 dialogKey =
"activeCamoAbilityUse";
1339 case "hero_flamethrower":
1340 dialogKey =
"purifierWeaponUse";
1342 case "gadget_heat_wave":
1343 dialogKey =
"heatwaveAbilityUse";
1349 self thread
play_dialog( dialogKey, dialogFlags, dialogBuffer );
1354 if ( !isdefined( weapon ) )
1357 dialogKey = undefined;
1359 switch( weapon.name )
1361 case "hero_gravityspikes":
1362 dialogKey =
"gravspikesWeaponSuccess";
1364 case "gadget_speed_burst":
1365 dialogKey =
"overdriveAbilitySuccess";
1367 case "hero_bowlauncher":
1368 case "hero_bowlauncher2":
1369 case "hero_bowlauncher3":
1370 case "hero_bowlauncher4":
1371 dialogKey =
"sparrowWeaponSuccess";
1373 case "gadget_vision_pulse":
1374 dialogKey =
"visionpulseAbilitySuccess";
1376 case "hero_lightninggun":
1377 case "hero_lightninggun_arc":
1378 dialogKey =
"tempestWeaponSuccess";
1380 case "gadget_flashback":
1381 dialogKey =
"glitchAbilitySuccess";
1383 case "hero_pineapplegun":
1384 dialogKey =
"warmachineWeaponSuccess";
1386 case "gadget_armor":
1387 dialogKey =
"kineticArmorAbilitySuccess";
1389 case "hero_annihilator":
1390 dialogKey =
"annihilatorWeaponSuccess";
1392 case "gadget_combat_efficiency":
1393 dialogKey =
"combatfocusAbilitySuccess";
1395 case "hero_chemicalgelgun":
1396 dialogKey =
"hiveWeaponSuccess";
1398 case "gadget_resurrect":
1399 dialogKey =
"rejackAbilitySuccess";
1401 case "hero_minigun":
1402 case "hero_minigun_body3":
1403 dialogKey =
"scytheWeaponSuccess";
1405 case "gadget_clone":
1406 dialogKey =
"psychosisAbilitySuccess";
1408 case "hero_armblade":
1409 dialogKey =
"ripperWeaponSuccess";
1412 dialogKey =
"activeCamoAbilitySuccess";
1414 case "hero_flamethrower":
1415 dialogKey =
"purifierWeaponSuccess";
1417 case "gadget_heat_wave":
1418 dialogKey =
"heatwaveAbilitySuccess";
1424 if ( isdefined( waitKey ) )
1430 dialogKey = dialogKey +
"0";
1432 self.playedGadgetSuccess =
true;
1447 if ( level.teambased )
1449 foreach( team
in level.teams )
1451 if ( team ==
self.team )
1456 foreach( player
in level.alivePlayers[team] )
1458 players[players.size] = player;
1464 foreach( player
in level.activeplayers )
1466 if ( player !=
self )
1468 players[players.size] = player;
1480 if ( level.teambased )
1482 foreach( player
in level.alivePlayers[
self.team] )
1484 players[players.size] = player;
1497 if ( !IsPlayer(
self ) ||
1499 self.playingDialog ===
true ||
1500 self IsPlayerUnderwater() ||
1501 self IsRemoteControlling() ||
1502 self IsInVehicle() ||
1503 self IsWeaponViewOnlyLinked() )
1508 if ( isdefined( teamOnly ) && !teamOnly &&
self HasPerk(
"specialty_quieter" ) )
1522 players = ArraySort( players, origin );
1524 foreach( player
in players )
1539 if ( !level.teambased )
1545 players = ArraySort( players,
self.origin );
1547 foreach( player
in players )
1549 if ( player ==
self ||
1565 if ( !level.playStartConversation )
1570 if ( !level.inPrematchPeriod ||
1572 game[
"boostPlayersPicked"][
self.team ] )
1582 players = array::randomize( players );
1585 foreach( player
in players )
1587 playerDialog = player GetMpDialogName();
1589 for( i = playerIndex; i < players.size; i++ )
1591 playerI = players[i];
1593 if ( playerDialog != playerI GetMpDialogName() )
1609 game[
"boostPlayersPicked"][player1.team] =
true;
1616 if ( !level.allowSpecialistDialog )
1621 gameIsDraw = !isdefined( winner ) || ( level.teamBased && winner ==
"tie" );
1623 foreach( player
in level.players )
1625 if ( player IsSplitScreen() )
1632 dialogKey =
"boostDraw";
1634 else if ( ( level.teamBased && isdefined( level.teams[ winner ] ) && player.pers[
"team"] == winner ) ||
1635 ( !level.teamBased && player == winner ) )
1637 dialogKey =
"boostWin";
1641 dialogKey =
"boostLoss";
1646 if ( isdefined( dialogAlias ) )
1648 player PlayLocalSound( dialogAlias );