1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\flag_shared;
6 #using scripts\shared\gameobjects_shared;
7 #using scripts\shared\hud_shared;
8 #using scripts\shared\laststand_shared;
9 #using scripts\shared\lui_shared;
10 #using scripts\shared\math_shared;
11 #using scripts\shared\spawner_shared;
12 #using scripts\shared\util_shared;
13 #using scripts\shared\music_shared;
15 #insert scripts\shared\shared.gsh;
17 #using scripts\zm\gametypes\_globallogic;
18 #using scripts\zm\gametypes\_globallogic_defaults;
19 #using scripts\zm\gametypes\_globallogic_score;
20 #using scripts\zm\gametypes\_globallogic_spawn;
21 #using scripts\zm\gametypes\_globallogic_ui;
22 #using scripts\zm\gametypes\_globallogic_utils;
23 #using scripts\zm\gametypes\_hud_message;
24 #using scripts\zm\gametypes\_spawning;
25 #using scripts\zm\gametypes\_weapons;
27 #using scripts\zm\_util;
28 #using scripts\zm\_zm;
29 #using scripts\zm\_zm_audio;
30 #using scripts\zm\_zm_blockers;
31 #using scripts\zm\_zm_game_module;
32 #using scripts\zm\_zm_laststand;
33 #using scripts\zm\_zm_pers_upgrades_functions;
34 #using scripts\zm\_zm_spawner;
35 #using scripts\zm\_zm_stats;
36 #using scripts\zm\_zm_utility;
38 #insert scripts\zm\_zm_perks.gsh;
40 #precache( "menu", MENU_TEAM );
41 #precache( "menu", MENU_CLASS );
42 #precache( "menu", MENU_CHANGE_CLASS );
43 #precache( "menu", MENU_CONTROLS );
44 #precache( "menu", MENU_OPTIONS );
45 #precache( "menu", MENU_LEAVEGAME );
46 #precache( "menu", MENU_SPECTATE );
47 #precache( "menu", MENU_RESTART_GAME );
48 #precache( "menu", MENU_SCOREBOARD );
49 #precache( "menu", MENU_INIT_TEAM_ALLIES );
50 #precache( "menu", MENU_INIT_TEAM_AXIS );
51 #precache( "menu", MENU_WAGER_SIDE_BET );
52 #precache( "menu", MENU_WAGER_SIDE_BET_PLAYER );
53 #precache( "menu", MENU_CHANGE_CLASS_WAGER );
54 #precache( "menu", MENU_CHANGE_CLASS_CUSTOM );
55 #precache( "menu", MENU_CHANGE_CLASS_BAREBONES );
56 #precache( "string", "MP_HOST_ENDED_GAME" );
57 #precache( "string", "MP_HOST_ENDGAME_RESPONSE" );
59 #namespace zm_gametype;
96 level.takeLivesOnDeath =
true;
97 level.teamBased =
true;
98 level.disablePrematchMessages =
true;
99 level.disableMomentum =
true;
101 level.overrideTeamScore =
false;
102 level.overridePlayerScore =
false;
103 level.displayHalftimeText =
false;
104 level.displayRoundEndText =
false;
106 level.allowAnnouncer =
false;
109 level.endGameOnScoreLimit =
false;
110 level.endGameOnTimeLimit =
false;
111 level.resetPlayerScoreEveryRound =
true;
113 level.doPrematch =
false;
114 level.noPersistence =
true;
115 level.cumulativeRoundScores =
true;
117 level.forceAutoAssign =
true;
118 level.dontShowEndReason =
true;
119 level.forceAllAllies =
true;
122 level.allow_teamchange =
false;
123 SetDvar(
"scr_disable_team_selection", 1 );
126 SetDvar(
"scr_disable_weapondrop", 1 );
142 map_name = level.script;
146 mode = GetDvarString(
"ui_gametype" );
148 if((!isdefined(mode) || mode ==
"") && isdefined(level.default_game_mode))
150 mode = level.default_game_mode;
157 location = level.default_start_location;
171 gametype = GetDvarString(
"ui_gametype");
173 game[
"dialog"][
"gametype"] = gametype +
"_start";
174 game[
"dialog"][
"gametype_hardcore"] = gametype +
"_start";
175 game[
"dialog"][
"offense_obj"] =
"generic_boost";
176 game[
"dialog"][
"defense_obj"] =
"generic_boost";
184 setscoreboardcolumns(
"score",
"kills",
"downs",
"revives",
"headshots" );
234 level.onPlayerKilledExtraUnthreadedCBs = [];
259 self endon(
"disconnect");
261 self._being_shellshocked =
true;
262 self shellshock(
"grief_stab_zm",.75);
264 self._being_shellshocked =
false;
276 if(isDefined(level.game_mode_custom_onPlayerDisconnect))
278 level [[level.game_mode_custom_onPlayerDisconnect]](
self);
280 if( isdefined( level.check_quickrevive_hotjoin ) )
282 level thread [[ level.check_quickrevive_hotjoin ]]();
294 spawnpointname =
"info_intermission";
295 spawnpoints = getentarray( spawnpointname,
"classname" );
298 if(spawnpoints.size < 1)
304 spawnpoint = spawnpoints[RandomInt(spawnpoints.size)];
305 if( isDefined( spawnpoint ) )
307 self spawn( spawnpoint.origin, spawnpoint.angles );
319 if ( IsDefined(level.customMaySpawnLogic) )
320 return self [[ level.customMaySpawnLogic ]]();
322 if (
self.pers[
"lives"] == 0 )
324 level notify(
"player_eliminated" );
325 self notify(
"player_eliminated" );
333 setClientNameMode(
"auto_change");
335 level.spawnMins = ( 0, 0, 0 );
336 level.spawnMaxs = ( 0, 0, 0 );
338 foreach(
struct in structs)
345 setMapCenter( level.mapCenter );
384 level.displayRoundEndText =
false;
392 level.displayRoundEndText =
true;
393 if( level.scoreRoundWinBased )
443 if (!isdefined(spawnPoint))
447 location = level.scr_zm_map_start_location;
448 if ((location ==
"default" || location ==
"" ) && IsDefined(level.default_start_location))
450 location = level.default_start_location;
453 match_string = level.scr_zm_ui_gametype +
"_" + location;
457 if(IsDefined(structs))
459 foreach(
struct in structs)
461 if(IsDefined(
struct.script_string) )
464 tokens = strtok(
struct.script_string,
" ");
465 foreach(token
in tokens)
467 if(token == match_string )
469 spawnPoints[spawnPoints.size] =
struct;
477 if(!IsDefined(spawnPoints) || spawnPoints.size == 0)
482 assert(IsDefined(spawnPoints),
"Could not find initial spawn points!");
495 if(!IsDefined(predictedSpawn))
497 predictedSpawn =
false;
500 pixbeginevent(
"ZSURVIVAL:onSpawnPlayer");
501 self.usingObj = undefined;
503 self.is_zombie =
false;
508 if( IsDefined( level.custom_spawnPlayer ) &&
IS_TRUE(
self.player_initialized))
510 self [[level.custom_spawnPlayer]]();
515 if( isdefined(level.customSpawnLogic) )
518 spawnPoint =
self [[level.customSpawnLogic]](predictedSpawn);
528 if ( predictedSpawn )
530 self predictSpawnPoint( spawnPoint.origin, spawnPoint.angles );
542 self spawn( spawnPoint.origin, spawnPoint.angles,
"zsurvival" );
548 self.entity_num =
self GetEntityNumber();
551 self freezecontrols(
true );
552 self.spectator_respawn = spawnPoint;
557 self.pers[
"participation"] = 0;
559 self.score_total =
self.score;
560 self.old_score =
self.score;
562 self.player_initialized =
false;
563 self.zombification_time = 0;
564 self.enableText =
true;
569 if(!
IS_TRUE(level.host_ended_game))
572 self enableWeapons();
574 if(isDefined(level.game_mode_spawn_player_logic))
576 spawn_in_spectate = [[level.game_mode_spawn_player_logic]]();
577 if(spawn_in_spectate)
593 location = level.scr_zm_map_start_location;
594 if ((location ==
"default" || location ==
"" ) && IsDefined(level.default_start_location))
596 location = level.default_start_location;
599 match_string = level.scr_zm_ui_gametype +
"_" + location;
603 foreach(
struct in structs)
605 if(IsDefined(
struct.script_string) )
607 tokens = strtok(
struct.script_string,
" ");
608 foreach(token
in tokens)
610 if(token == match_string )
612 player_spawns[player_spawns.size] =
struct;
618 player_spawns[player_spawns.size] =
struct;
621 return player_spawns;
631 if ( game[
"roundswon"][
"allies"] == game[
"roundswon"][
"axis"] )
633 else if ( game[
"roundswon"][
"axis"] > game[
"roundswon"][
"allies"] )
678 level waittill(
"connecting", player);
685 self endon(
"disconnect");
689 self waittill(
"menuresponse", menu, response);
695 if ( response ==
"back" )
697 self closeInGameMenu();
701 if( menu == game[
"menu_changeclass"] || menu == game[
"menu_changeclass_offline"] || menu == game[
"menu_team"] || menu == game[
"menu_controls"] )
705 if(
self.pers[
"team"] ==
"allies" )
706 self openMenu( game[
"menu_start_menu" ] );
707 if(
self.pers[
"team"] ==
"axis" )
708 self openMenu( game[
"menu_start_menu" ] );
714 if(response ==
"changeteam" && level.allow_teamchange ==
"1")
716 self closeInGameMenu();
717 self openMenu(game[
"menu_team"]);
720 if(response ==
"changeclass_marines" )
722 self closeInGameMenu();
723 self openMenu( game[
"menu_changeclass_allies"] );
727 if(response ==
"changeclass_opfor" )
729 self closeInGameMenu();
730 self openMenu( game[
"menu_changeclass_axis"] );
734 if(response ==
"changeclass_wager" )
736 self closeInGameMenu();
737 self openMenu( game[
"menu_changeclass_wager"] );
741 if(response ==
"changeclass_custom" )
743 self closeInGameMenu();
744 self openMenu( game[
"menu_changeclass_custom"] );
748 if(response ==
"changeclass_barebones" )
750 self closeInGameMenu();
751 self openMenu( game[
"menu_changeclass_barebones"] );
755 if(response ==
"changeclass_marines_splitscreen" )
756 self openMenu(
"changeclass_marines_splitscreen" );
758 if(response ==
"changeclass_opfor_splitscreen" )
759 self openMenu(
"changeclass_opfor_splitscreen" );
761 if(response ==
"endgame")
764 if(
self IsSplitscreen() )
768 level.skipVote =
true;
776 level.host_ended_game =
true;
778 level notify(
"end_game");
785 if ( response ==
"restart_level_zm")
793 if(response ==
"killserverpc")
800 if ( response ==
"endround" )
806 self closeInGameMenu();
808 level.host_ended_game =
true;
810 level notify(
"end_game");
814 self closeInGameMenu();
815 self iprintln( &
"MP_HOST_ENDGAME_RESPONSE" );
820 if(menu == game[
"menu_team"] && level.allow_teamchange ==
"1")
826 self [[level.allies]]();
831 self [[level.teamMenu]](response);
836 self [[level.autoassign]]( true );
841 self [[level.spectator]]();
845 else if( menu == game[
"menu_changeclass"] || menu == game[
"menu_changeclass_offline"] || menu == game[
"menu_changeclass_wager"] || menu == game[
"menu_changeclass_custom"] || menu == game[
"menu_changeclass_barebones"] )
847 self closeInGameMenu();
849 if( level.rankedMatch && isSubstr(response,
"custom") )
855 self.selectedClass =
true;
856 self [[level.curClass]](response);
865 if ( !level.console && level.allow_teamchange ==
"0" && (isdefined(
self.hasDoneCombat) &&
self.hasDoneCombat) )
870 if(
self.pers[
"team"] !=
"allies")
873 if ( level.inGracePeriod && (!isdefined(
self.hasDoneCombat) || !
self.hasDoneCombat) )
874 self.hasSpawned =
false;
876 if(
self.sessionstate ==
"playing")
878 self.switching_teams =
true;
879 self.joining_team =
"allies";
880 self.leaving_team =
self.pers[
"team"];
884 self.pers[
"team"] =
"allies";
885 self.team =
"allies";
886 self.pers[
"class"] = undefined;
887 self.curClass = undefined;
888 self.pers[
"weapon"] = undefined;
889 self.pers[
"savedmodel"] = undefined;
893 self.sessionteam =
"allies";
895 self SetClientScriptMainMenu( game[
"menu_start_menu" ] );
897 self notify(
"joined_team");
898 level notify(
"joined_team" );
900 self notify(
"end_respawn");
925 level waittill(
"connected", player );
927 if(isDefined(level.game_module_onPlayerConnect))
929 player [[level.game_module_onPlayerConnect]]();
936 level endon(
"end_game" );
937 self endon(
"disconnect" );
943 if (
IS_TRUE( level.match_is_ending) )
953 if ( IsDefined( level.custom_player_fake_death_cleanup ) )
955 self [[ level.custom_player_fake_death_cleanup ]]();
958 self SetStance(
"stand" );
959 self.zmbDialogQueue = [];
960 self.zmbDialogActive =
false;
961 self.zmbDialogGroups = [];
962 self.zmbDialogGroup =
"";
964 self TakeAllWeapons();
966 if ( IsDefined( level.giveCustomCharacters ) )
968 self [[ level.giveCustomCharacters ]]();
973 self GiveWeapon( level.weaponBaseMelee );
975 if(isDefined(level.onPlayerSpawned_restore_previous_weapons) &&
IS_TRUE(level.isresetting_grief))
977 weapons_restored =
self [[level.onPlayerSpawned_restore_previous_weapons]]();
984 weapons_restored = 0;
986 if ( IsDefined( level._team_loadout ) )
988 self GiveWeapon( level._team_loadout );
989 self SwitchToWeapon( level._team_loadout );
992 if(isdefined(level.gamemode_post_spawn_logic))
994 self [[level.gamemode_post_spawn_logic]]();
1002 map_logic_exists = level
flag::exists(
"start_zombie_round_logic" );
1003 map_logic_started = level
flag::get(
"start_zombie_round_logic" );
1005 if( map_logic_exists && map_logic_started )
1013 self endon(
"disconnect");
1017 self.rebuild_barrier_reward = 1;
1018 self.is_hotjoining =
true;
1022 if ( IsDefined( level.giveCustomCharacters ) )
1024 self [[ level.giveCustomCharacters ]]();
1029 music::setmusicstate(
"none");
1031 self.is_hotjoining =
false;
1032 self.is_hotjoin =
true;
1038 self SetClientThirdPerson( 0 );
1042 self thread [[level.custom_intermission]]();
1053 if ( isdefined( level.hotjoin_extra_blackscreen_time ) )
1055 wait level.hotjoin_extra_blackscreen_time;
1063 self CloseMenu(
"InitialBlack" );
1064 self OpenMenu(
"InitialBlack" );
1069 self CloseMenu(
"InitialBlack" );