1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\laststand_shared;
8 #using scripts\shared\music_shared;
9 #using scripts\shared\system_shared;
10 #using scripts\shared\util_shared;
12 #insert scripts\shared\shared.gsh;
13 #insert scripts\shared\version.gsh;
14 #insert scripts\zm\_zm_audio.gsh;
16 #using scripts\shared\ai\zombie_utility;
18 #using scripts\zm\_zm_laststand;
19 #using scripts\zm\_zm_spawner;
20 #using scripts\zm\_zm_utility;
21 #using scripts\zm\_zm_zonemgr;
42 self.player_exert_id = exert_id;
57 id = level.exert_sounds[0][exert];
58 if( isDefined(
self.player_exert_id) )
60 if (!isdefined(level.exert_sounds) || !isdefined(level.exert_sounds[
self.player_exert_id]) || !isdefined(level.exert_sounds[
self.player_exert_id][exert]))
62 if(IsArray(level.exert_sounds[
self.player_exert_id][exert]))
64 id = array::random(level.exert_sounds[
self.player_exert_id][exert]);
68 id = level.exert_sounds[
self.player_exert_id][exert];
74 self.isexerting =
true;
78 self playsoundwithnotify(
id,
"done_exerting" );
79 self waittill(
"done_exerting" );
80 self.isexerting =
false;
92 self endon(
"disconnect");
95 wait( randomfloatrange (1.5,3));
96 self.isexerting =
false;
111 if( isdefined( level._zmbVoxLevelSpecific ) )
112 level thread [[level._zmbVoxLevelSpecific]]();
115 if( isdefined( level._zmbVoxGametypeSpecific ) )
116 level thread [[level._zmbVoxGametypeSpecific]]();
118 announcer_ent =
spawn(
"script_origin", (0,0,0) );
122 level.exert_sounds[0][
"burp"] =
"evt_belch";
125 level.exert_sounds[0][
"hitmed"] =
"null";
128 level.exert_sounds[0][
"hitlrg"] =
"null";
131 if (isdefined(level.setupCustomCharacterExerts))
132 [[level.setupCustomCharacterExerts]]();
140 if(isdefined(level._custom_zombie_oh_shit_vox_func))
142 self thread [[level._custom_zombie_oh_shit_vox_func]]();
154 level endon(
"unloaded");
155 self endon(
"death_or_disconnect");
157 if(!IsDefined(level._zbv_vox_last_update_time))
159 level._zbv_vox_last_update_time = 0;
169 if(t > level._zbv_vox_last_update_time + 1000)
171 level._zbv_vox_last_update_time = t;
175 zombs = level._audio_zbv_shared_ent_list;
177 played_sound =
false;
179 for(i=0;i<zombs.size;i++)
181 if(!isDefined(zombs[i]))
193 alias = level.vox_behind_zombie;
195 if(IsDefined(zombs[i].zombie_move_speed))
197 switch(zombs[i].zombie_move_speed)
199 case "walk": dist = 150;
break;
200 case "run": dist = 175;
break;
201 case "sprint": dist = 200;
break;
204 if(DistanceSquared(zombs[i].origin,
self.origin) < dist * dist )
207 z_diff =
self.origin[2] - zombs[i].origin[2];
208 if( (yaw < -95 || yaw > 95) && abs( z_diff ) < 50 )
210 zombs[i] notify(
"bhtn_action_notify",
"behind" );
226 self endon(
"death_or_disconnect");
232 players = GetPlayers();
235 if( players.size >= 1 )
238 for( i=0; i<zombs.size; i++ )
240 if( (isDefined(zombs[i].favoriteenemy) && zombs[i].favoriteenemy ==
self) || !isDefined(zombs[i].favoriteenemy) )
242 if( DistanceSquared( zombs[i].origin,
self.origin ) < 250 * 250)
248 if( close_zombs > 4 )
261 self endon(
"disconnect");
264 if(GetDvarString (
"zombie_kills") ==
"")
266 SetDvar (
"zombie_kills",
"7");
268 if(GetDvarString (
"zombie_kill_timer") ==
"")
270 SetDvar (
"zombie_kill_timer",
"5");
273 kills = GetDvarInt(
"zombie_kills");
274 time = GetDvarInt(
"zombie_kill_timer");
276 if (!isdefined (
self.timerIsrunning))
278 self.timerIsrunning = 0;
279 self.killcounter = 0;
284 self waittill(
"zom_kill", zomb );
286 if( IsDefined( zomb._black_hole_bomb_collapse_death ) && zomb._black_hole_bomb_collapse_death == 1 )
291 if(
IS_TRUE( zomb.microwavegun_death ) )
298 if (
self.timerIsrunning != 1)
300 self.timerIsrunning = 1;
308 weapon = player GetCurrentWeapon();
309 dist = DistanceSquared( player.origin, zombie.origin );
311 if( !isdefined(level.zombie_vars[player.team][
"zombie_insta_kill"] ) )
312 level.zombie_vars[player.team][
"zombie_insta_kill"] = 0;
314 instakill = level.zombie_vars[player.team][
"zombie_insta_kill"];
316 death = [[ level.audio_get_mod_type ]]( hit_location, mod, weapon, zombie, instakill, dist, player );
322 if( !
IS_TRUE(player.force_wait_on_kill_line) )
324 player.force_wait_on_kill_line =
true;
327 if(isdefined(player))
329 player.force_wait_on_kill_line =
false;
336 if(!isDefined(level.response_chances[event] ))
340 return level.response_chances[event];
343 function get_mod_type( impact, mod, weapon, zombie, instakill, dist, player )
345 close_dist = 64 * 64;
346 med_dist = 124 * 124;
347 far_dist = 400 * 400;
349 if( weapon.name ==
"hero_annihilator" )
351 return "annihilator";
359 return "weapon_instakill";
362 if ( zombie.damageweapon.name ==
"cymbal_monkey" )
365 return "weapon_instakill";
371 if( weapon.name ==
"ray_gun" && dist > far_dist )
376 return "weapon_instakill";
386 if ( (mod ==
"MOD_MELEE" || mod ==
"MOD_UNKNOWN") && dist < close_dist )
391 return "melee_instakill";
400 return "weapon_instakill";
404 if( weapon.doesFireDamage && ( mod ==
"MOD_BURNED" || mod ==
"MOD_GRENADE" || mod ==
"MOD_GRENADE_SPLASH" ) )
409 return "weapon_instakill";
412 if (!isdefined(impact))
416 if( mod ==
"MOD_RIFLE_BULLET" || mod ==
"MOD_PISTOL_BULLET" )
421 return "weapon_instakill";
430 if( mod !=
"MOD_MELEE" && zombie.missingLegs )
436 if( mod !=
"MOD_BURNED" && dist < close_dist )
446 self endon(
"disconnect");
449 timer = gettime() + (time * 1000);
452 if (
self.killcounter > kills )
459 self.killcounter = 0;
466 self.killcounter = 0;
467 self.timerIsrunning = 0;
478 ent.zmbVoxID = speaker;
480 if( !isdefined(
self.speaker[speaker] ) )
482 self.speaker[speaker] = SpawnStruct();
483 self.speaker[speaker].alias = [];
486 self.speaker[speaker].prefix = prefix;
487 self.speaker[speaker].ent = ent;
490 #define KILL_DAMAGE_VO_DURATION 2
493 self notify(
"sound_damage_player_updated" );
495 self endon(
"death" );
496 self endon(
"sound_damage_player_updated" );
498 self.sound_damage_player = player;
502 self.sound_damage_player = undefined;
518 level.sndPlayerVox = [];
521 row = TableLookupRow( table, index );
523 while ( isdefined( row ) )
531 if( percentage <= 0 )
546 zmbVoxAdd( category, subcategory, suffix, percentage, response, delayBeforePlayAgain );
549 row = TableLookupRow( table, index );
560 if( !isdefined( str ) )
565 if( ToLower( str ) ==
"true" )
572 if( !isdefined( value ) )
580 function zmbVoxAdd( category, subcategory, suffix, percentage, response, delayBeforePlayAgain = 0 )
582 Assert( IsDefined( category ) );
583 Assert( IsDefined( subcategory ) );
584 Assert( IsDefined( suffix ) );
585 Assert( IsDefined( percentage ) );
586 Assert( IsDefined( response ) );
587 Assert( IsDefined( delayBeforePlayAgain ) );
589 vox = level.sndPlayerVox;
591 if( !isdefined( vox[category] ) )
594 vox[category][subcategory] = spawnstruct();
595 vox[category][subcategory].suffix = suffix;
596 vox[category][subcategory].percentage = percentage;
597 vox[category][subcategory].response = response;
598 vox[category][subcategory].delayBeforePlayAgain = delayBeforePlayAgain;
605 if( !IsDefined( level.sndPlayerVox ) )
608 if( !IsDefined( level.sndPlayerVox[category] ) )
611 if( !IsDefined( level.sndPlayerVox[category][subcategory] ) )
622 suffix = level.sndPlayerVox[category][subcategory].suffix;
623 percentage = level.sndPlayerVox[category][subcategory].percentage;
626 if( !isdefined( prefix ) )
631 if( isdefined( sound_to_play ) )
642 self endon(
"death_or_disconnect");
652 if ( !isdefined(
self.isSpeaking ) )
654 self.isSpeaking =
false;
657 if (
self.isSpeaking )
666 self.speakingLine = sound_to_play;
668 self.isSpeaking =
true;
675 playbackTime = soundgetplaybacktime( sound_to_play );
677 if( !isdefined( playbackTime ) )
680 if ( playbackTime >= 0 )
682 playbackTime = playbackTime * .001;
689 if( isdefined( level._do_player_or_npc_playvox_override ) )
691 self thread [[level._do_player_or_npc_playvox_override]](sound_to_play, playbackTime);
694 else if ( !
self IsTestClient() )
696 self PlaySoundOnTag( sound_to_play,
"J_Head" );
700 if( isPlayer(
self) && isDefined(
self.last_vo_played_time) )
702 if( GetTime() < (
self.last_vo_played_time + 5000 ) )
704 self.last_vo_played_time = GetTime();
711 self.isSpeaking =
false;
718 if( !level
flag::get(
"solo_game" ) &&
IS_TRUE( level.sndPlayerVox[category][subcategory].response ) )
720 if(
IS_TRUE( level.vox_response_override ) )
734 if(isdefined(level._audio_custom_response_line))
736 self thread [[level._audio_custom_response_line]]( player, category, subcategory );
740 switch( player.characterindex )
764 players = GetPlayers();
766 hero_player = undefined;
767 rival_player = undefined;
769 foreach(ent
in players)
771 if(ent.characterIndex == hero )
775 else if (ent.characterIndex == rival )
781 if(isDefined(hero_player) && isDefined(rival_player))
783 if( randomint(100) > 50 )
785 hero_player = undefined;
789 rival_player = undefined;
792 if( IsDefined( hero_player ) && distancesquared (player.origin, hero_player.origin) < 500*500 )
803 else if(IsDefined( rival_player ) && distancesquared (player.origin, rival_player.origin) < 500*500 )
818 players = array::get_all_closest( player.origin, level.activeplayers );
820 players_that_can_respond = array::exclude( players, player );
822 if ( players_that_can_respond.size == 0 )
827 player_to_respond = players_that_can_respond[0];
837 if ( !IsDefined(player) )
845 if ( player.sessionstate !=
"playing" )
851 if( player IsPlayerUnderwater() )
858 if( percentage < randomintrange(1,101) )
873 if( level.sndPlayerVox[category][subcategory].delayBeforePlayAgain <= 0 )
876 fullName = category + subcategory;
877 if( !isdefined( player.voxTimer ) )
879 player.voxTimer = [];
881 if( !isdefined( player.voxTimer[fullName] ) )
883 player.voxTimer[fullName] = GetTime();
888 if( ( time - player.voxTimer[fullName] ) <= ( level.sndPlayerVox[category][subcategory].delayBeforePlayAgain * 1000 ) )
893 player.voxTimer[fullName] = time;
898 if( !IsDefined (
self.sound_dialog ) )
900 self.sound_dialog = [];
901 self.sound_dialog_available = [];
904 if ( !IsDefined (
self.sound_dialog[ suffix ] ) )
908 if( num_variants <= 0 )
913 for( i = 0; i < num_variants; i++ )
915 self.sound_dialog[ suffix ][ i ] = i;
918 self.sound_dialog_available[ suffix ] = [];
921 if (
self.sound_dialog_available[ suffix ].size <= 0 )
923 for( i = 0; i <
self.sound_dialog[ suffix ].size; i++ )
925 self.sound_dialog_available[ suffix ][i] =
self.sound_dialog[ suffix ][i];
929 variation = array::random(
self.sound_dialog_available[ suffix ] );
930 ArrayRemoveValue(
self.sound_dialog_available[ suffix ], variation );
932 if( IsDefined( force_variant ) )
934 variation = force_variant;
937 return (prefix + suffix +
"_" + variation);
943 nearbySpeakerActive =
false;
945 speakers = GetPlayers();
947 foreach ( person
in speakers )
949 if (
self == person )
958 if ( person.sessionstate !=
"playing" )
971 if (
IS_TRUE( person.isSpeaking ) && !
IS_TRUE( person.ignoreNearbySpkrs ) )
973 if ( DistanceSquared(
self.origin, person.origin ) < ( radius * radius ) )
975 nearbySpeakerActive =
true;
980 return nearbySpeakerActive;
993 if( !isdefined( level.musicSystem ) )
995 level.musicSystem = spawnstruct();
996 level.musicSystem.queue =
false;
998 level.musicSystem.currentSet = undefined;
999 level.musicSystem.states = [];
1002 level.musicSystem.states[stateName] = spawnstruct();
1003 level.musicSystem.states[stateName].playType = playType;
1004 level.musicSystem.states[stateName].musArray =
array();
1006 if( isdefined( musName1 ) )
1007 array::add(level.musicSystem.states[stateName].musArray,musName1);
1008 if( isdefined( musName2 ) )
1009 array::add(level.musicSystem.states[stateName].musArray,musName2);
1010 if( isdefined( musName3 ) )
1011 array::add(level.musicSystem.states[stateName].musArray,musName3);
1012 if( isdefined( musName4 ) )
1013 array::add(level.musicSystem.states[stateName].musArray,musName4);
1014 if( isdefined( musName5 ) )
1015 array::add(level.musicSystem.states[stateName].musArray,musName5);
1016 if( isdefined( musName6 ) )
1017 array::add(level.musicSystem.states[stateName].musArray,musName6);
1022 if( !isdefined( level.musicSystem ) )
1024 level.musicSystem = spawnstruct();
1025 level.musicSystem.ent =
spawn(
"script_origin", (0,0,0) );
1026 level.musicSystem.queue =
false;
1027 level.musicSystem.currentPlaytype = 0;
1028 level.musicSystem.currentState = undefined;
1029 level.musicSystem.states = [];
1032 m = level.musicSystem;
1033 if( !isdefined( m.states[state] ) )
1035 m.states[state] = spawnstruct();
1036 m.states[state] =
array();
1039 m.states[state][m.states[state].size].stateName = stateName;
1040 m.states[state][m.states[state].size].playtype = playtype;
1044 if( !isdefined( level.musicSystem ) )
1047 m = level.musicSystem;
1049 if( !isdefined( m.states[state] ) )
1052 s = level.musicSystem.states[state];
1053 playtype = s.playtype;
1055 if( m.currentPlaytype > 0 )
1083 level endon(
"sndStateStop" );
1085 m = level.musicSystem;
1086 musArray = level.musicSystem.states[state].musArray;
1088 if( musArray.size <= 0 )
1091 musToPlay = musArray[randomintrange(0,musArray.size)];
1093 m.currentPlaytype = m.states[state].playtype;
1094 m.currentState = state;
1098 if( isdefined( level.sndPlayStateOverride ) )
1100 perPlayer = level [[level.sndPlayStateOverride]](state);
1103 music::setmusicstate(musToPlay);
1108 music::setmusicstate(musToPlay);
1111 aliasname =
"mus_" + musToPlay +
"_intro";
1112 playbacktime = soundgetplaybacktime( aliasname );
1113 if( !isdefined( playbacktime ) || playbacktime <= 0 )
1116 waittime = playbackTime * .001;
1121 m.currentPlaytype = 0;
1122 m.currentState = undefined;
1126 level endon(
"sndQueueFlush" );
1128 m = level.musicSystem;
1139 while(m.currentPlaytype > 0)
1157 level notify(
"sndQueueFlush" );
1158 level.musicSystem.queue =
false;
1160 level notify(
"sndStateStop" );
1162 level.musicSystem.currentPlaytype = 0;
1163 level.musicSystem.currentState = undefined;
1168 if( !isdefined( level.musicSystem ) )
1171 if( !isdefined( level.musicSystem.currentPlaytype ) )
1174 if( level.musicSystem.currentPlaytype >= 4 )
1180 #define LOCATION_NUM_UNTIL_REPEAT 3
1183 if( !isdefined( locationArray ) || locationArray.size <= 0 )
1186 level.musicSystem.locationArray = locationArray;
1192 level.sndLastZone = undefined;
1194 m = level.musicSystem;
1198 level waittill(
"newzoneActive", activeZone );
1210 level.sndLastZone = activeZone;
1217 level waittill(
"between_round_over" );
1230 foreach( place
in array )
1232 if( place == activeZone )
1236 if( shouldPlay ==
false )
1250 current_array = level.musicSystem.locationArray;
1253 foreach( place
in current_array )
1255 if( place == activeZone )
1257 arrayremovevalue( current_array, place );
1261 return current_array;
1265 level endon(
"newzoneActive" );
1270 level notify(
"newzoneActive", zone );
1282 function secretUse(notify_string, color, qualifier_func, arg1, arg2 )
1294 #define ZOMBIE_ANNOUNCER_PREFIX "zmba"
1297 if( !isdefined( level.zmAnnouncerPrefix ) )
1312 if( !isdefined( level.zmAnnouncerVox ) )
1314 level.zmAnnouncerVox =
array();
1317 level.zmAnnouncerVox[type] = suffix;
1321 if( !isdefined( level.zmAnnouncerVox[type] ) )
1324 prefix = level.zmAnnouncerPrefix;
1325 suffix = level.zmAnnouncerVox[type];
1327 if( !
IS_TRUE( level.zmAnnouncerTalking ) )
1329 if( !isdefined( player ) )
1331 level.zmAnnouncerTalking =
true;
1333 temp_ent =
spawn(
"script_origin", (0,0,0));
1334 temp_ent PlaySoundWithNotify(prefix+suffix, prefix+suffix+
"wait");
1335 temp_ent waittill(prefix+suffix+
"wait");
1339 level.zmAnnouncerTalking =
false;
1343 player playsoundtoplayer( prefix+suffix, player );
1356 self endon (
"death" );
1357 self endon (
"disconnect" );
1358 level endon (
"game_ended" );
1365 self waittill(
"bhtn_action_notify", notify_string);
1367 switch( notify_string )
1373 if(
IS_TRUE(
self.bgb_tone_death ) )
1381 case "attack_melee":
1382 if( !isdefined(
self.animname ) || (
self.animname !=
"zombie" &&
self.animname !=
"quad_zombie" ) )
1385 case "attack_melee_zhd":
1403 if ( IsDefined( level._zmbAIVox_SpecialType ) )
1405 if( isdefined( level._zmbAIVox_SpecialType[notify_string] ) )
1417 zombie endon(
"death" );
1419 if( !isdefined( zombie ) )
1422 if( !isdefined( zombie.voicePrefix ) )
1425 if( !isdefined( priority ) )
1428 if( !isdefined( zombie.currentvoxpriority ) )
1429 zombie.currentvoxpriority = 1;
1431 if( !isdefined(
self.delayAmbientVox ) )
1432 self.delayAmbientVox =
false;
1434 if( ( type ==
"ambient" || type ==
"sprint" || type ==
"crawler" ) &&
IS_TRUE(
self.delayAmbientVox ) )
1437 if( delayAmbientVox )
1439 self.delayAmbientVox =
true;
1443 alias =
"zmb_vocals_" + zombie.voicePrefix +
"_" + type;
1449 if (isdefined( zombie.currentvox ) && priority > zombie.currentvoxpriority )
1451 zombie stopsound ( zombie.currentvox );
1454 if( type ==
"death" || type ==
"death_whimsy" )
1456 zombie PlaySound( alias );
1461 if ( zombie.talking ===
true && priority < zombie.currentvoxpriority )
1464 zombie.talking =
true;
1467 alias = alias +
"_loud";
1469 zombie.currentvox = alias;
1470 zombie.currentvoxpriority = priority;
1472 zombie PlaySoundOnTag( alias,
"j_head" );
1473 playbackTime = soundgetplaybacktime( alias );
1475 if( !isdefined( playbackTime ) )
1478 if ( playbackTime >= 0 )
1479 playbackTime = playbackTime * .001;
1484 zombie.talking =
false;
1485 zombie.currentvox = undefined;
1486 zombie.currentvoxpriority = 1;
1492 self endon (
"disconnect" );
1494 self waittill (
"death", attacker, meansOfDeath );
1496 if ( isdefined(
self ) )
1498 if(
IS_TRUE(
self.bgb_tone_death ) )
1506 self endon (
"disconnect" );
1507 self endon(
"death" );
1511 self waittill(
"damage", amount, attacker, direction_vec, point, type, tagName, ModelName, Partname, weapon );
1512 if( weapon.name ==
"zombie_beast_lightning_dwl" || weapon.name ==
"zombie_beast_lightning_dwl2" || weapon.name ==
"zombie_beast_lightning_dwl3" )
1514 self notify(
"bhtn_action_notify",
"electrocute" );
1520 self notify(
"sndAmbientDelay" );
1521 self endon(
"sndAmbientDelay" );
1522 self endon(
"death" );
1523 self endon(
"disconnect" );
1527 self.delayAmbientVox =
false;
1534 level._numZmbAIVox = 0;
1540 if ( !IsDefined( level._numZmbAIVox ) )
1545 if ( level._numZmbAIVox >= 2 )
1550 level._numZmbAIVox++;
1567 function sndRadioSetup(alias_prefix, is_sequential =
false, origin1, origin2, origin3, origin4, origin5)
1581 self endon(
"death" );
1583 if( isdefined(
self.sndJingleCooldown ) )
1585 self.sndJingleCooldown =
false;
1600 self endon(
"death" );
1602 if( !isdefined(
self.sndJingleActive ) )
1604 self.sndJingleActive =
false;
1607 alias =
self.script_sound;
1610 alias =
self.script_label;
1612 if( isdefined( level.musicSystem ) && level.musicSystem.currentPlaytype >=
PLAYTYPE_SPECIAL )
1615 self.str_jingle_alias = alias;
1617 if( !
IS_TRUE(
self.sndJingleActive ) )
1619 self.sndJingleActive =
true;
1620 self playsoundwithnotify( alias,
"sndDone" );
1622 playbacktime = soundgetplaybacktime( alias );
1623 if( !isdefined( playbacktime ) || playbacktime <= 0 )
1626 waittime = playbackTime * .001;
1632 self.sndJingleCooldown =
true;
1636 self.sndJingleActive =
false;
1641 self endon(
"death" );
1644 self.sndJingleCooldown =
false;
1657 #define RANDOM_PLAYER 4
1660 if( !isdefined( level.sndConversations ) )
1662 level.sndConversations =
array();
1665 level.sndConversations[
name] = spawnstruct();
1666 level.sndConversations[
name].specialEndon = specialEndon;
1670 thisConvo = level.sndConversations[
name];
1672 if( !isdefined( thisConvo.line ) )
1674 thisConvo.line =
array();
1677 if( !isdefined( thisConvo.player ) )
1679 thisConvo.player =
array();
1682 if( !isdefined( thisConvo.ignorePlayer ) )
1684 thisConvo.ignorePlayer =
array();
1688 ARRAY_ADD( thisConvo.player, player_or_random );
1689 ARRAY_ADD( thisConvo.ignorePlayer, ignorePlayer );
1693 thisConvo = level.sndConversations[
name];
1695 level endon(
"sndConvoInterrupt" );
1696 if( isdefined( thisConvo.specialEndon ) )
1698 level endon( thisConvo.specialEndon );
1704 while(
IS_TRUE( level.sndVoxOverride ) )
1707 level.sndVoxOverride =
true;
1708 for(i=0;i<thisConvo.line.size;i++)
1715 if( !isdefined( speaker ) )
1720 level.currentConvoPlayer = speaker;
1722 if( isdefined(level.vox_name_complete) )
1724 level.currentConvoLine = thisConvo.line[i];
1728 level.currentConvoLine =
"vox_plr_"+speaker.characterIndex+
"_"+thisConvo.line[i];
1732 speaker PlaySoundOnTag( level.currentConvoLine,
"J_Head" );
1735 level notify(
"sndConvoLineDone" );
1738 level.sndVoxOverride =
false;
1739 level notify(
"sndConversationDone" );
1740 level.currentConvoLine = undefined;
1741 level.currentConvoPlayer = undefined;
1745 level notify(
"sndConvoInterrupt" );
1746 level notify(
"sndConversationDone" );
1747 level.sndVoxOverride =
false;
1749 if( isdefined( level.currentConvoPlayer ) && isdefined( level.currentConvoLine ) )
1751 level.currentConvoPlayer stopsound( level.currentConvoLine );
1752 level.currentConvoLine = undefined;
1753 level.currentConvoPlayer = undefined;
1758 playbackTime = soundgetplaybacktime( alias );
1760 if( !isdefined( playbackTime ) )
1763 if ( playbackTime >= 0 )
1764 playbackTime = playbackTime * .001;
1772 if( !isdefined( player ) )
1775 if ( player.sessionstate !=
"playing" )
1786 array::randomize(
array );
1790 if( guy.characterIndex ==
ignore )
1799 foreach( guy
in level.players )
1801 if( guy.characterIndex == charIndex )
1808 foreach( player
in level.players )
1810 if(
IS_TRUE( player.isSpeaking ) )
1820 level endon(
"sndConvoLineDone");
1824 if( !isdefined(
self ) )
1827 max_dist_squared = 0;
1828 check_pos =
self.origin;
1831 foreach(player
in level.players)
1833 if(
self == player )
1836 if( distance2dsquared(player.origin,
self.origin) >= 900*900 )
1840 if( count == (level.players.size-1))
1851 self endon (
"death" );
1852 self endon (
"disconnect" );
1853 level endon (
"end_game" );
1855 self.voxUnderwaterTime = 0;
1856 self.voxEmergeBreath =
false;
1857 self.voxDrowning =
false;
1861 if (
self IsPlayerUnderwater() )
1863 if ( !
self.voxUnderwaterTime && !
self.voxEmergeBreath )
1866 self.voxUnderwaterTime = GetTime();
1868 else if (
self.voxUnderwaterTime )
1870 if ( GetTime() >
self.voxUnderwaterTime + (3 * 1000) )
1872 self.voxUnderwaterTime = 0;
1873 self.voxEmergeBreath =
true;
1879 if (
self.voxDrowning )
1881 self zm_audio::playerexert(
"underwater_gasp" );
1883 self.voxDrowning =
false;
1884 self.voxEmergeBreath =
false;
1886 if (
self.voxEmergeBreath )
1888 self zm_audio::playerexert(
"underwater_emerge" );
1889 self.voxEmergeBreath =
false;
1893 self.voxUnderwaterTime = 0;
1904 self notify(
"stop_vo_convo" );
1906 self.str_vo_being_spoken =
"";
1907 self.n_vo_priority = 0;
1908 self.isSpeaking =
false;
1909 level.sndVoxOverride =
false;
1912 b_in_a_e_speakers =
false;
1913 foreach( e_checkme
in level.a_e_speakers )
1915 if ( e_checkme ==
self )
1917 b_in_a_e_speakers =
true;
1923 ArrayRemoveValue( level.a_e_speakers,
self );
1929 if( !
IS_TRUE( level.sndZHDAudio ) )
1932 if( !IsPlayer(
self ) )
1944 str_alias =
"zmb_hit_alert";
1950 self endon (
"disconnect");
1952 if(
self.hitSoundTracker )
1954 self.hitSoundTracker =
false;
1956 self playsoundtoplayer( str_alias,
self );
1960 self.hitSoundTracker =
true;
1965 if ( !isdefined( str_meansofdeath ) )
1968 switch( str_meansofdeath )
1971 case "MOD_GRENADE_SPLASH":
1972 case "MOD_HIT_BY_OBJECT":
1973 case "MOD_MELEE_ASSASSINATE":
1975 case "MOD_MELEE_WEAPON_BUTT":