diff --git a/scripts/zm/replaced/_globallogic_ui.gsc b/scripts/zm/replaced/_globallogic_ui.gsc new file mode 100644 index 00000000..fe682dba --- /dev/null +++ b/scripts/zm/replaced/_globallogic_ui.gsc @@ -0,0 +1,174 @@ +#include maps\mp\_utility; +#include maps\mp\gametypes_zm\_hud_util; +#include maps\mp\gametypes_zm\_globallogic; +#include maps\mp\gametypes_zm\_spectating; +#include maps\mp\gametypes_zm\_globallogic_player; +#include maps\mp\gametypes_zm\_globallogic_ui; + +menuautoassign( comingfrommenu ) +{ + teamkeys = getarraykeys( level.teams ); + assignment = teamkeys[randomint( teamkeys.size )]; + self closemenus(); + + if ( isdefined( level.forceallallies ) && level.forceallallies ) + assignment = "allies"; + else if ( level.teambased ) + { + if ( getdvarint( "party_autoteams" ) == 1 ) + { + if ( level.allow_teamchange == "1" && ( self.hasspawned || comingfrommenu ) ) + assignment = ""; + else + { + team = getassignedteam( self ); + + switch ( team ) + { + case 1: + assignment = teamkeys[1]; + break; + case 2: + assignment = teamkeys[0]; + break; + case 3: + assignment = teamkeys[2]; + break; + case 4: + if ( !isdefined( level.forceautoassign ) || !level.forceautoassign ) + { + self setclientscriptmainmenu( game["menu_class"] ); + return; + } + default: + assignment = ""; + + if ( isdefined( level.teams[team] ) ) + assignment = team; + else if ( team == "spectator" && !level.forceautoassign ) + { + self setclientscriptmainmenu( game["menu_class"] ); + return; + } + } + } + } + + if ( assignment == "" || getdvarint( "party_autoteams" ) == 0 ) + { + if ( sessionmodeiszombiesgame() ) + { + if (level.allow_teamchange) + { + if (assignment == "") + { + guids = strTok(getDvar("team_axis"), " "); + foreach (guid in guids) + { + if (self getguid() == int(guid)) + { + assignment = "axis"; + break; + } + } + } + + if (assignment == "") + { + guids = strTok(getDvar("team_allies"), " "); + foreach (guid in guids) + { + if (self getguid() == int(guid)) + { + assignment = "allies"; + break; + } + } + } + } + + if (assignment == "") + { + assignment = get_lowest_team(); + } + } + } + + if ( assignment == self.pers["team"] && ( self.sessionstate == "playing" || self.sessionstate == "dead" ) ) + { + self beginclasschoice(); + return; + } + } + else if ( getdvarint( "party_autoteams" ) == 1 ) + { + if ( level.allow_teamchange != "1" || !self.hasspawned && !comingfrommenu ) + { + team = getassignedteam( self ); + + if ( isdefined( level.teams[team] ) ) + assignment = team; + else if ( team == "spectator" && !level.forceautoassign ) + { + self setclientscriptmainmenu( game["menu_class"] ); + return; + } + } + } + + self.pers["team"] = assignment; + self.team = assignment; + self.pers["class"] = undefined; + self.class = undefined; + self.pers["weapon"] = undefined; + self.pers["savedmodel"] = undefined; + self updateobjectivetext(); + + if ( level.teambased ) + self.sessionteam = assignment; + else + { + self.sessionteam = "none"; + self.ffateam = assignment; + } + + self.joined_team = true; + self notify( "joined_team" ); + level notify( "joined_team" ); + self notify( "end_respawn" ); + self beginclasschoice(); + self setclientscriptmainmenu( game["menu_class"] ); +} + +get_lowest_team() +{ + teamplayers = []; + teamplayers["axis"] = countplayers("axis"); + teamplayers["allies"] = countplayers("allies"); + + // don't count self + teamplayers[self.team]--; + + if ( teamplayers["allies"] == teamplayers["axis"] ) + { + if ( randomint( 100 ) >= 50 ) + { + return "axis"; + } + else + { + return "allies"; + } + } + else + { + if ( teamplayers["allies"] > teamplayers["axis"] ) + { + return "axis"; + } + else + { + return "allies"; + } + } +} \ No newline at end of file diff --git a/scripts/zm/replaced/_zm.gsc b/scripts/zm/replaced/_zm.gsc index 3b66c107..b377c729 100644 --- a/scripts/zm/replaced/_zm.gsc +++ b/scripts/zm/replaced/_zm.gsc @@ -907,11 +907,6 @@ getfreespawnpoint( spawnpoints, player ) } } - if(!is_true(self.team_set)) - { - self waittill("team_set"); - } - if ( isdefined( player ) && isdefined( player.team ) ) { i = 0; @@ -965,7 +960,7 @@ getfreespawnpoint( spawnpoints, player ) foreach(player in players) { - if(player != self && isDefined(player.team_set) && player.team == self.team && player.playernum == num) + if(is_true(player.joined_team) && player != self && player.team == self.team && player.playernum == num) { valid_num = false; break; diff --git a/scripts/zm/replaced/_zm_gametype.gsc b/scripts/zm/replaced/_zm_gametype.gsc index 9c96f2cb..35f331b2 100644 --- a/scripts/zm/replaced/_zm_gametype.gsc +++ b/scripts/zm/replaced/_zm_gametype.gsc @@ -199,4 +199,217 @@ hide_gump_loading_for_hotjoiners() self.health = 100; self thread [[ level.custom_intermission ]](); } +} + +menu_onmenuresponse() +{ + self endon( "disconnect" ); + + for (;;) + { + self waittill( "menuresponse", menu, response ); + + if ( response == "back" ) + { + self closemenu(); + self closeingamemenu(); + + if ( level.console ) + { + if ( menu == game["menu_changeclass"] || menu == game["menu_changeclass_offline"] || menu == game["menu_team"] || menu == game["menu_controls"] ) + { + if ( self.pers["team"] == "allies" ) + self openmenu( game["menu_class"] ); + + if ( self.pers["team"] == "axis" ) + self openmenu( game["menu_class"] ); + } + } + + continue; + } + + if ( menu == game["menu_team"] ) + { + self closemenu(); + self closeingamemenu(); + + if ( !level.allow_teamchange ) + { + teamplayers = countplayers( self.pers["team"] ); + otherteamplayers = countplayers( getotherteam( self.pers["team"] ) ); + + if ( teamplayers - 1 <= otherteamplayers ) + { + self iprintln( "Can only change teams if unbalanced." ); + continue; + } + } + + set_team( getotherteam( self.pers["team"] ) ); + + continue; + } + + if ( response == "changeclass_marines" ) + { + self closemenu(); + self closeingamemenu(); + self openmenu( game["menu_changeclass_allies"] ); + continue; + } + + if ( response == "changeclass_opfor" ) + { + self closemenu(); + self closeingamemenu(); + self openmenu( game["menu_changeclass_axis"] ); + continue; + } + + if ( response == "changeclass_wager" ) + { + self closemenu(); + self closeingamemenu(); + self openmenu( game["menu_changeclass_wager"] ); + continue; + } + + if ( response == "changeclass_custom" ) + { + self closemenu(); + self closeingamemenu(); + self openmenu( game["menu_changeclass_custom"] ); + continue; + } + + if ( response == "changeclass_barebones" ) + { + self closemenu(); + self closeingamemenu(); + self openmenu( game["menu_changeclass_barebones"] ); + continue; + } + + if ( response == "changeclass_marines_splitscreen" ) + self openmenu( "changeclass_marines_splitscreen" ); + + if ( response == "changeclass_opfor_splitscreen" ) + self openmenu( "changeclass_opfor_splitscreen" ); + + if ( response == "endgame" ) + { + if ( self issplitscreen() ) + { + level.skipvote = 1; + + if ( !( isdefined( level.gameended ) && level.gameended ) ) + { + self maps\mp\zombies\_zm_laststand::add_weighted_down(); + self maps\mp\zombies\_zm_stats::increment_client_stat( "deaths" ); + self maps\mp\zombies\_zm_stats::increment_player_stat( "deaths" ); + self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); + level.host_ended_game = 1; + maps\mp\zombies\_zm_game_module::freeze_players( 1 ); + level notify( "end_game" ); + } + } + + continue; + } + + if ( response == "restart_level_zm" ) + { + self maps\mp\zombies\_zm_laststand::add_weighted_down(); + self maps\mp\zombies\_zm_stats::increment_client_stat( "deaths" ); + self maps\mp\zombies\_zm_stats::increment_player_stat( "deaths" ); + self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); + missionfailed(); + } + + if ( response == "killserverpc" ) + { + level thread maps\mp\gametypes_zm\_globallogic::killserverpc(); + continue; + } + + if ( response == "endround" ) + { + if ( !( isdefined( level.gameended ) && level.gameended ) ) + { + self maps\mp\gametypes_zm\_globallogic::gamehistoryplayerquit(); + self maps\mp\zombies\_zm_laststand::add_weighted_down(); + self closemenu(); + self closeingamemenu(); + level.host_ended_game = 1; + maps\mp\zombies\_zm_game_module::freeze_players( 1 ); + level notify( "end_game" ); + } + else + { + self closemenu(); + self closeingamemenu(); + self iprintln( &"MP_HOST_ENDGAME_RESPONSE" ); + } + + continue; + } + + if ( menu == game["menu_team"] && level.allow_teamchange == "1" ) + { + switch ( response ) + { + case "allies": + self [[ level.allies ]](); + break; + case "axis": + self [[ level.teammenu ]]( response ); + break; + case "autoassign": + self [[ level.autoassign ]]( 1 ); + break; + case "spectator": + self [[ level.spectator ]](); + break; + } + + continue; + } + + 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"] ) + { + self closemenu(); + self closeingamemenu(); + + if ( level.rankedmatch && issubstr( response, "custom" ) ) + { + + } + + self.selectedclass = 1; + self [[ level.class ]]( response ); + } + } +} + +set_team(team) +{ + if ( team == "axis" ) + { + self.team = "axis"; + self.sessionteam = "axis"; + self.pers["team"] = "axis"; + self._encounters_team = "A"; + self.characterindex = 0; + } + else + { + self.team = "allies"; + self.sessionteam = "allies"; + self.pers["team"] = "allies"; + self._encounters_team = "B"; + self.characterindex = 1; + } + + self [[ level.givecustomcharacters ]](); } \ No newline at end of file diff --git a/scripts/zm/zgrief/zgrief_reimagined.gsc b/scripts/zm/zgrief/zgrief_reimagined.gsc index 0f0b3cb9..c2465ec7 100644 --- a/scripts/zm/zgrief/zgrief_reimagined.gsc +++ b/scripts/zm/zgrief/zgrief_reimagined.gsc @@ -24,6 +24,7 @@ main() replaceFunc(maps\mp\gametypes_zm\_zm_gametype::onspawnplayer, scripts\zm\replaced\_zm_gametype::onspawnplayer); replaceFunc(maps\mp\gametypes_zm\_zm_gametype::onplayerspawned, scripts\zm\replaced\_zm_gametype::onplayerspawned); replaceFunc(maps\mp\gametypes_zm\_zm_gametype::hide_gump_loading_for_hotjoiners, scripts\zm\replaced\_zm_gametype::hide_gump_loading_for_hotjoiners); + replaceFunc(maps\mp\gametypes_zm\_zm_gametype::menu_onmenuresponse, scripts\zm\replaced\_zm_gametype::menu_onmenuresponse); replaceFunc(maps\mp\gametypes_zm\zgrief::meat_stink, scripts\zm\replaced\zgrief::meat_stink); replaceFunc(maps\mp\gametypes_zm\zmeat::item_meat_on_spawn_retrieve_trigger, scripts\zm\replaced\zmeat::item_meat_on_spawn_retrieve_trigger); } @@ -82,6 +83,7 @@ init() level.can_revive_game_module = ::can_revive; level._powerup_grab_check = ::powerup_can_player_grab; level.meat_bounce_override = scripts\zm\replaced\zgrief::meat_bounce_override; + level.autoassign = scripts\zm\replaced\_globallogic_ui::menuautoassign; level.custom_spectate_permissions = undefined; level.is_respawn_gamemode_func = ::is_respawn_gamemode; @@ -95,60 +97,11 @@ init() level thread remove_round_number(); level thread unlimited_zombies(); level thread unlimited_powerups(); + level thread save_teams_on_intermission(); level thread all_voice_on_intermission(); level thread spawn_bots(); } -set_team() -{ - self.team_set = true; - self notify("team_set"); - - teamplayers = []; - teamplayers["axis"] = countplayers("axis"); - teamplayers["allies"] = countplayers("allies"); - - // don't count self - teamplayers[self.team]--; - - if(teamplayers["allies"] == teamplayers["axis"]) - { - if(cointoss()) - { - self.team = "axis"; - self.sessionteam = "axis"; - self.pers["team"] = "axis"; - self._encounters_team = "A"; - } - else - { - self.team = "allies"; - self.sessionteam = "allies"; - self.pers["team"] = "allies"; - self._encounters_team = "B"; - } - } - else - { - if(teamplayers["allies"] > teamplayers["axis"]) - { - self.team = "axis"; - self.sessionteam = "axis"; - self.pers["team"] = "axis"; - self._encounters_team = "A"; - } - else - { - self.team = "allies"; - self.sessionteam = "allies"; - self.pers["team"] = "allies"; - self._encounters_team = "B"; - } - } - - self [[ level.givecustomcharacters ]](); -} - grief_gamemode_hud() { level.grief_gamemode_hud = newHudElem(); @@ -350,8 +303,16 @@ set_grief_vars() { setDvar("ui_gametype_pro", 0); } + level.scr_zm_ui_gametype_pro = getDvarInt("ui_gametype_pro"); + if(getDvar("ui_gametype_team_change") == "") + { + setDvar("ui_gametype_team_change", 0); + } + + level.allow_teamchange = getDvarInt("ui_gametype_team_change"); + level.noroundnumber = 1; level.zombie_powerups["meat_stink"].solo = 1; level.zombie_powerups["meat_stink"].func_should_drop_with_regular_powerups = ::func_should_drop_meat; @@ -719,7 +680,6 @@ player_spawn_override() grief_onplayerconnect() { - self set_team(); self thread on_player_spawned(); self thread on_player_spectate(); self thread on_player_downed(); @@ -2588,6 +2548,29 @@ remove_round_number() } } +save_teams_on_intermission() +{ + level waittill("intermission"); + + text = ""; + players = get_players("axis"); + foreach (player in players) + { + text += player getguid() + " "; + } + + setDvar("team_axis", text); + + text = ""; + players = get_players("allies"); + foreach (player in players) + { + text += player getguid() + " "; + } + + setDvar("team_allies", text); +} + all_voice_on_intermission() { level waittill("intermission");