1 #using scripts\shared\array_shared;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\exploder_shared;
4 #using scripts\shared\flag_shared;
5 #using scripts\shared\lui_shared;
6 #using scripts\shared\math_shared;
7 #using scripts\shared\sound_shared;
8 #using scripts\shared\util_shared;
10 #insert scripts\shared\shared.gsh;
11 #insert scripts\shared\statstable_shared.gsh;
15 #define HINT_TEXT_DISPLAY_TIME_DEFAULT 4.0
16 #define N_HINT_TEXT_FADE_TIME 0.75
17 #define HINT_TEXT_DISPLAY_HEIGHT -160
18 #define HINT_TEXT_TURN_OFF_NOTIFY "notify_turn_off_hint_text"
20 #precache( "lui_menu", "MPHintText" );
21 #precache( "lui_menu_data", "hint_text_line" );
23 #precache( "string", "blinking");
24 #precache( "string", "display_noblink");
25 #precache( "string", "fadeout");
30 println(
"^c*ERROR* ", msg);
33 if (GetDvarString(
"debug") !=
"1")
34 assertmsg(
"This is a forced error - attach the log file");
40 /# println(
"^1WARNING: " + msg ); #/
56 function within_fov( start_origin, start_angles, end_origin, fov )
58 normal = VectorNormalize( end_origin - start_origin );
59 forward = AnglesToForward( start_angles );
60 dot = VectorDot( forward, normal );
73 return IsSubStr( sMeansOfDeath,
"BULLET" ) || sMeansOfDeath ==
"MOD_HEAD_SHOT";
78 self endon(
"disconnect");
79 self endon(
"end_respawn");
81 while(
self useButtonPressed() !=
true)
88 if ( !isdefined(
self.lowerMessage ) )
91 if ( isdefined(
self.lowerMessageOverride ) && text != &
"" )
93 text =
self.lowerMessageOverride;
97 self notify(
"lower_message_set");
99 self.lowerMessage setText( text );
101 if ( isdefined( time ) && time > 0 )
103 if ( !isdefined( combineMessageAndTimer ) || !combineMessageAndTimer )
104 self.lowerTimer.label = &
"";
107 self.lowerMessage setText(
"" );
108 self.lowerTimer.label = text;
110 self.lowerTimer setTimer( time );
114 self.lowerTimer setText(
"" );
115 self.lowerTimer.label = &
"";
117 if(
self IsSplitscreen() )
118 self.lowerMessage.fontscale = 1.4;
120 self.lowerMessage fadeOverTime( 0.05 );
121 self.lowerMessage.alpha = 1;
122 self.lowerTimer fadeOverTime( 0.05 );
123 self.lowerTimer.alpha = 1;
128 if ( !isdefined(
self.lowerMessage ) )
131 if ( isdefined(
self.lowerMessageOverride ) && text != &
"" )
133 text =
self.lowerMessageOverride;
137 self notify(
"lower_message_set");
138 if ( !isdefined( combineMessage ) || !combineMessage )
139 self.lowerMessage setText( text );
141 self.lowerMessage setText(
"" );
143 if ( isdefined( value ) && value > 0 )
145 if ( !isdefined( combineMessage ) || !combineMessage )
146 self.lowerTimer.label = &
"";
148 self.lowerTimer.label = text;
149 self.lowerTimer setValue( value );
153 self.lowerTimer setText(
"" );
154 self.lowerTimer.label = &
"";
157 if(
self IsSplitscreen() )
158 self.lowerMessage.fontscale = 1.4;
160 self.lowerMessage fadeOverTime( 0.05 );
161 self.lowerMessage.alpha = 1;
162 self.lowerTimer fadeOverTime( 0.05 );
163 self.lowerTimer.alpha = 1;
168 if ( !isdefined(
self.lowerMessage ) )
171 self notify(
"lower_message_set");
173 if ( !isdefined( fadetime) || fadetime == 0 )
179 self endon(
"disconnect");
180 self endon(
"lower_message_set");
182 self.lowerMessage fadeOverTime( fadetime );
183 self.lowerMessage.alpha = 0;
184 self.lowerTimer fadeOverTime( fadetime );
185 self.lowerTimer.alpha = 0;
195 assert( isdefined( level.players ) );
196 for ( i = 0; i < level.players.size; i++ )
198 player = level.players[i];
199 if ( ( isdefined(player.pers[
"team"]) ) && (player.pers[
"team"] == team) )
200 player iprintln(text);
207 assert( isdefined( level.players ) );
208 for ( i = 0; i < level.players.size; i++ )
210 player = level.players[i];
211 if ( ( isdefined(player.pers[
"team"]) ) && (player.pers[
"team"] == team) )
212 player iprintlnbold(text);
220 assert( isdefined( level.players ) );
221 for ( i = 0; i < level.players.size; i++ )
223 player = level.players[i];
224 if ( ( isdefined(player.pers[
"team"]) ) && (player.pers[
"team"] == team) )
225 player iprintlnbold(text, arg);
237 players = level.players;
238 for(i = 0; i < players.size; i++)
240 if ( isdefined( team ) )
242 if((isdefined(players[i].pers[
"team"])) && (players[i].pers[
"team"] == team))
243 players[i] iprintln(text);
247 players[i] iprintln(text);
254 shouldDoSounds = isdefined( soundFriendly );
256 shouldDoEnemySounds =
false;
257 if ( isdefined( soundEnemy ) )
259 assert( shouldDoSounds );
260 shouldDoEnemySounds =
true;
263 if ( !isdefined( printarg ) )
268 if ( level.splitscreen || !shouldDoSounds )
270 for ( i = 0; i < level.players.size; i++ )
272 player = level.players[i];
273 playerteam = player.pers[
"team"];
274 if ( isdefined( playerteam ) )
276 if ( playerteam == team && isdefined( printFriendly ) && printFriendly != &
"" )
277 player iprintln( printFriendly, printarg );
278 else if ( isdefined( printEnemy ) && printEnemy != &
"" )
280 if ( isdefined(enemyteam) && playerteam == enemyteam )
281 player iprintln( printEnemy, printarg );
282 else if ( !isdefined(enemyteam) && playerteam != team )
283 player iprintln( printEnemy, printarg );
287 if ( shouldDoSounds )
289 assert( level.splitscreen );
290 level.players[0] playLocalSound( soundFriendly );
295 assert( shouldDoSounds );
296 if ( shouldDoEnemySounds )
298 for ( i = 0; i < level.players.size; i++ )
300 player = level.players[i];
301 playerteam = player.pers[
"team"];
302 if ( isdefined( playerteam ) )
304 if ( playerteam == team )
306 if( isdefined( printFriendly ) && printFriendly != &
"" )
307 player iprintln( printFriendly, printarg );
308 player playLocalSound( soundFriendly );
310 else if ( (isdefined(enemyteam) && playerteam == enemyteam) || ( !isdefined( enemyteam ) && playerteam != team ) )
312 if( isdefined( printEnemy ) && printEnemy != &
"" )
313 player iprintln( printEnemy, printarg );
314 player playLocalSound( soundEnemy );
321 for ( i = 0; i < level.players.size; i++ )
323 player = level.players[i];
324 playerteam = player.pers[
"team"];
325 if ( isdefined( playerteam ) )
327 if ( playerteam == team )
329 if( isdefined( printFriendly ) && printFriendly != &
"" )
330 player iprintln( printFriendly, printarg );
331 player playLocalSound( soundFriendly );
333 else if ( isdefined( printEnemy ) && printEnemy != &
"" )
335 if ( isdefined(enemyteam) && playerteam == enemyteam )
337 player iprintln( printEnemy, printarg );
339 else if ( !isdefined(enemyteam) && playerteam != team )
341 player iprintln( printEnemy, printarg );
353 if ( level.splitscreen && !
self IsHost() )
356 self playLocalSound( soundAlias );
363 if ( team ==
"allies" )
365 else if ( team ==
"axis" )
370 assertMsg(
"getOtherTeam: invalid team " + team );
376 if ( !level.teambased || !isdefined(team) || !isdefined(level.spawnsystem.iSPAWN_TEAMMASK[team]) )
377 return level.spawnsystem.iSPAWN_TEAMMASK_FREE;
379 return level.spawnsystem.iSPAWN_TEAMMASK[team];
385 foreach( team
in level.teams )
387 if ( team == skip_team )
396 function wait_endon( waitTime, endOnString, endonString2, endonString3, endonString4 )
398 self endon ( endOnString );
399 if ( isdefined( endonString2 ) )
400 self endon ( endonString2 );
401 if ( isdefined( endonString3 ) )
402 self endon ( endonString3 );
403 if ( isdefined( endonString4 ) )
404 self endon ( endonString4 );
416 assert( isdefined( level._effect[ fx ] ),
"Fx " + fx +
" is not defined in level._effect." );
417 return level._effect[ fx ];
425 if (!isdefined(reset))
428 if (reset || GetDvarString(dvar)==
"")
430 SetDvar(dvar, value);
434 return GetDvarString(dvar);
442 if (!isdefined(reset))
445 if (reset || GetDvarString(dvar)==
"")
447 SetDvar(dvar, value);
450 return GetDvarFloat(dvar);
458 if (!isdefined(reset))
461 if (reset || GetDvarString(dvar)==
"")
463 SetDvar(dvar, value);
467 return GetDvarInt(dvar);
472 if(!isdefined(ent._triggers))
477 ent._triggers[
self GetEntityNumber()] = 1;
485 if(!isdefined(ent._triggers))
488 if(!isdefined(ent._triggers[
self GetEntityNumber()]))
491 ent._triggers[
self GetEntityNumber()] = 0;
496 if(!isdefined(
self._triggers))
499 if(!isdefined(
self._triggers[trig GetEntityNumber()]))
502 if(!
self._triggers[trig GetEntityNumber()])
510 ent waittill(
"death");
517 ent endon(
"entityshutdown");
525 ender =
"end_trig_death_monitor" +
self GetEntityNumber() +
" " + ent GetEntityNumber();
530 endon_condition =
"leave_trigger_" +
self GetEntityNumber();
532 if(isdefined(on_enter_payload))
534 self thread [[on_enter_payload]](ent, endon_condition);
537 while(isdefined(ent) && ent IsTouching(
self))
542 ent notify(endon_condition);
546 if(isdefined(ent) && isdefined(on_exit_payload))
548 self thread [[on_exit_payload]](ent);
561 return ( getSubStr( string1, 0, subStr.size ) == subStr );
566 return isdefined( level.killstreaksenabled ) && level.killstreaksenabled;
571 if ( isdefined(
self.carryIcon) )
572 self.carryIcon.alpha = 0;
575 self.usingRemote = remoteName;
578 self.killstreak_delay_killcam = remoteName;
580 self disableOffhandWeapons();
582 self notify(
"using_remote" );
587 game[
"strings"][
"objective_"+team] = text;
592 game[
"strings"][
"objective_score_"+team] = text;
597 game[
"strings"][
"objective_hint_"+team] = text;
602 return game[
"strings"][
"objective_"+team];
607 return game[
"strings"][
"objective_score_"+team];
612 return game[
"strings"][
"objective_hint_"+team];
617 level.roundSwitch =
math::clamp( GetGametypeSetting(
"roundSwitch" ), minValue, maxValue );
618 level.roundSwitchMin = minValue;
619 level.roundSwitchMax = maxValue;
624 level.roundLimit =
math::clamp( GetGametypeSetting(
"roundLimit" ), minValue, maxValue );
625 level.roundLimitMin = minValue;
626 level.roundLimitMax = maxValue;
632 level.roundWinLimit =
math::clamp( GetGametypeSetting(
"roundWinLimit" ), minValue, maxValue );
633 level.roundWinLimitMin = minValue;
634 level.roundWinLimitMax = maxValue;
640 level.scoreLimit =
math::clamp( GetGametypeSetting(
"scoreLimit" ), minValue, maxValue );
641 level.scoreLimitMin = minValue;
642 level.scoreLimitMax = maxValue;
643 SetDvar(
"ui_scorelimit", level.scoreLimit );
649 level.roundScoreLimit =
math::clamp( GetGametypeSetting(
"roundScoreLimit" ), minValue, maxValue );
650 level.roundScoreLimitMin = minValue;
651 level.roundScoreLimitMax = maxValue;
657 level.timeLimit =
math::clamp( GetGametypeSetting(
"timeLimit" ), minValue, maxValue );
658 level.timeLimitMin = minValue;
659 level.timeLimitMax = maxValue;
660 SetDvar(
"ui_timelimit", level.timeLimit );
666 DEFAULT( teamLivesMinValue, minValue );
667 DEFAULT( teamLivesMaxValue, maxValue );
670 level.numLives =
math::clamp( GetGametypeSetting(
"playerNumLives" ), minValue, maxValue );
671 level.numLivesMin = minValue;
672 level.numLivesMax = maxValue;
673 level.numTeamLives =
math::clamp( GetGametypeSetting(
"teamNumLives" ), teamLivesMinValue, teamLivesMaxValue );
674 level.numTeamLivesMin = teamLivesMinValue;
675 level.numTeamLivesMax = teamLivesMaxValue;
683 for ( i = 0; i < level.players.size; i++ )
685 if ( level.players[i] getEntityNumber() == clientNum )
686 return level.players[i];
693 buildType = GetDvarString(
"buildType" );
695 if ( isdefined( buildType ) && buildtype ==
"press" )
705 return isdefined(
self.flashEndTime ) && gettime() <
self.flashEndTime;
710 if ( isdefined(
self.damagedToDeath ) &&
self.damagedToDeath )
715 if ( isdefined(
self.maxHealth ) )
724 self.damagedToDeath =
true;
726 self DoDamage(
damage, origin, attacker, inflictor, headshot, mod );
741 if ( isdefined(
self ) )
764 level notify(
"screen_message_create" );
765 level endon(
"screen_message_create" );
769 if( isdefined( level.missionfailed ) && level.missionfailed )
774 if( GetDvarInt(
"hud_missionFailed" ) == 1 )
777 if ( !isdefined( n_offset_y ) )
783 if( !isdefined(level._screen_message_1) )
786 level._screen_message_1 = NewHudElem();
787 level._screen_message_1.elemType =
"font";
788 level._screen_message_1.font =
"objective";
789 level._screen_message_1.fontscale = 1.8;
790 level._screen_message_1.horzAlign =
"center";
791 level._screen_message_1.vertAlign =
"middle";
792 level._screen_message_1.alignX =
"center";
793 level._screen_message_1.alignY =
"middle";
794 level._screen_message_1.y = -60 + n_offset_y;
795 level._screen_message_1.sort = 2;
797 level._screen_message_1.color = ( 1, 1, 1 );
798 level._screen_message_1.alpha = 1;
800 level._screen_message_1.hidewheninmenu =
true;
804 level._screen_message_1 SetText( string_message_1 );
806 if( isdefined(string_message_2) )
809 if( !isdefined(level._screen_message_2) )
812 level._screen_message_2 = NewHudElem();
813 level._screen_message_2.elemType =
"font";
814 level._screen_message_2.font =
"objective";
815 level._screen_message_2.fontscale = 1.8;
816 level._screen_message_2.horzAlign =
"center";
817 level._screen_message_2.vertAlign =
"middle";
818 level._screen_message_2.alignX =
"center";
819 level._screen_message_2.alignY =
"middle";
820 level._screen_message_2.y = -33 + n_offset_y;
821 level._screen_message_2.sort = 2;
823 level._screen_message_2.color = ( 1, 1, 1 );
824 level._screen_message_2.alpha = 1;
826 level._screen_message_2.hidewheninmenu =
true;
830 level._screen_message_2 SetText( string_message_2 );
832 else if( isdefined(level._screen_message_2) )
834 level._screen_message_2 Destroy();
837 if( isdefined(string_message_3) )
840 if( !isdefined(level._screen_message_3) )
843 level._screen_message_3 = NewHudElem();
844 level._screen_message_3.elemType =
"font";
845 level._screen_message_3.font =
"objective";
846 level._screen_message_3.fontscale = 1.8;
847 level._screen_message_3.horzAlign =
"center";
848 level._screen_message_3.vertAlign =
"middle";
849 level._screen_message_3.alignX =
"center";
850 level._screen_message_3.alignY =
"middle";
851 level._screen_message_3.y = -6 + n_offset_y;
852 level._screen_message_3.sort = 2;
854 level._screen_message_3.color = ( 1, 1, 1 );
855 level._screen_message_3.alpha = 1;
857 level._screen_message_3.hidewheninmenu =
true;
861 level._screen_message_3 SetText( string_message_3 );
863 else if( isdefined(level._screen_message_3) )
865 level._screen_message_3 Destroy();
868 if ( isdefined( n_time ) && n_time > 0 )
892 if( isdefined(level._screen_message_1) )
894 level._screen_message_1 Destroy();
896 if( isdefined(level._screen_message_2) )
898 level._screen_message_2 Destroy();
900 if( isdefined(level._screen_message_3) )
902 level._screen_message_3 Destroy();
918 self endon(
"death" );
939 if ( !isdefined(
self ) )
942 self endon(
"death" );
943 self.abort_ghost_wait_show_to_player = undefined;
945 if ( isdefined( player ) )
947 player endon(
"death" );
948 player endon(
"disconnect" );
949 player endon(
"joined_team" );
950 player endon(
"joined_spectators" );
953 if ( isdefined( self_endon_string1 ) )
954 self endon( self_endon_string1 );
957 self SetInvisibleToAll();
958 self SetVisibleToPlayer( player );
961 if ( !isdefined(
self.abort_ghost_wait_show_to_player ) )
962 self ShowToPlayer( player );
979 if ( !isdefined(
self ) )
982 self endon(
"death" );
983 self.abort_ghost_wait_show_to_others = undefined;
985 if ( isdefined( player ) )
987 player endon(
"death" );
988 player endon(
"disconnect" );
989 player endon(
"joined_team" );
990 player endon(
"joined_spectators" );
993 if ( isdefined( self_endon_string1 ) )
994 self endon( self_endon_string1 );
997 self SetInvisibleToPlayer( player );
1000 if ( !isdefined(
self.abort_ghost_wait_show_to_others ) )
1003 self SetInvisibleToPlayer( player );
1010 Assert( IsPlayer(
self ),
"Must call use_button_pressed() on a player." );
1011 return (
self UseButtonPressed() );
1045 self endon(
"hint_text_removed" );
1048 if ( isdefined(
self.hint_menu_handle) )
1054 self.hint_menu_handle =
self OpenLUIMenu(
"MPHintText" );
1055 self SetLUIMenuData(
self.hint_menu_handle,
"hint_text_line", str_text_to_show );
1067 if( n_display_time != -1 )
1086 self endon(
"hint_text_removed" );
1088 if ( isdefined(
self.hint_menu_handle) )
1090 if (b_fade_before_hiding)
1096 self CloseLUIMenu(
self.hint_menu_handle);
1097 self.hint_menu_handle = undefined;
1101 self notify(
"hint_text_removed");
1108 self endon(
"hint_text_removed" );
1109 self endon(
"death" );
1110 self endon(
"kill_hint_text" );
1121 self endon(
"hint_text_removed" );
1122 self endon(
"disconnect" );
1131 if( team ==
"allies" )
1133 SetMatchFlag(
"radar_allies", value );
1135 else if ( team ==
"axis" )
1137 SetMatchFlag(
"radar_axis", value );
1143 if ( !isdefined( level.player_contract_events ) )
1144 level.player_contract_events = [];
1149 if ( !isdefined( level.player_contract_events[event_name] ) )
1151 level.player_contract_events[event_name] = SpawnStruct();
1152 level.player_contract_events[event_name].param_count = max_param_count;
1153 level.player_contract_events[event_name].events = [];
1156 assert( max_param_count == level.player_contract_events[event_name].param_count );
1158 level.player_contract_events[event_name].events[ level.player_contract_events[event_name].events.size ] = event_func;
1163 if ( !isdefined( level.player_contract_events[event_name] ) )
1166 param_count =
VAL( level.player_contract_events[event_name].param_count, 0 );
1168 switch ( param_count )
1172 foreach( event_func
in level.player_contract_events[event_name].events )
1174 if ( isdefined( event_func ) )
1175 self [[ event_func ]]();
1180 foreach( event_func
in level.player_contract_events[event_name].events )
1182 if ( isdefined( event_func ) )
1183 self [[ event_func ]]( param1 );
1188 foreach( event_func
in level.player_contract_events[event_name].events )
1190 if ( isdefined( event_func ) )
1191 self [[ event_func ]]( param1, param2 );
1196 foreach( event_func
in level.player_contract_events[event_name].events )
1198 if ( isdefined( event_func ) )
1199 self [[ event_func ]]( param1, param2, param3 );
1207 switch ( game_type )