From 29cef959a05afca923dfd2d3068b732f0bd2ebc1 Mon Sep 17 00:00:00 2001 From: Jbleezy Date: Mon, 15 Jan 2024 00:30:45 -0800 Subject: [PATCH] Scoreboard: fix showing incorrect team on Survival after restart --- README.md | 1 + scripts/zm/_zm_reimagined.gsc | 1 + scripts/zm/replaced/_globallogic_player.gsc | 364 ++++++++ ui_mp/t6/hud.lua | 916 ++++++++++++++++++++ 4 files changed, 1282 insertions(+) create mode 100644 scripts/zm/replaced/_globallogic_player.gsc create mode 100644 ui_mp/t6/hud.lua diff --git a/README.md b/README.md index 5d7b1bb2..c712391e 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ * Player is reviving you text gets removed instantly when player drops the revive * Player needs to be revived text updates to new player instantly * Removed NAV cards +* Fixed scoreboard showing incorrect team on Survival after restart ## Players * Unlimited sprint diff --git a/scripts/zm/_zm_reimagined.gsc b/scripts/zm/_zm_reimagined.gsc index a6fbf3cd..570bab8f 100644 --- a/scripts/zm/_zm_reimagined.gsc +++ b/scripts/zm/_zm_reimagined.gsc @@ -12,6 +12,7 @@ main() replaceFunc(maps\mp\animscripts\zm_utility::wait_network_frame, scripts\zm\replaced\_zm_utility::wait_network_frame); replaceFunc(maps\mp\animscripts\traverse\zm_shared::dotraverse, scripts\zm\replaced\zm_shared::dotraverse); replaceFunc(maps\mp\gametypes_zm\_damagefeedback::onplayerconnect, scripts\zm\replaced\_damagefeedback::onplayerconnect); + replaceFunc(maps\mp\gametypes_zm\_globallogic_player::callback_playerconnect, scripts\zm\replaced\_globallogic_player::callback_playerconnect); replaceFunc(maps\mp\gametypes_zm\_hud_message::onplayerconnect, scripts\zm\replaced\_hud_message::onplayerconnect); 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\zombies\_zm::init_fx, scripts\zm\replaced\_zm::init_fx); diff --git a/scripts/zm/replaced/_globallogic_player.gsc b/scripts/zm/replaced/_globallogic_player.gsc new file mode 100644 index 00000000..301ab43b --- /dev/null +++ b/scripts/zm/replaced/_globallogic_player.gsc @@ -0,0 +1,364 @@ +#include maps\mp\gametypes_zm\_globallogic_player; +#include maps\mp\_utility; +#include common_scripts\utility; +#include maps\mp\gametypes_zm\_globallogic; +#include maps\mp\zombies\_zm_stats; +#include maps\mp\gametypes_zm\_globallogic_score; +#include maps\mp\gametypes_zm\_hostmigration; +#include maps\mp\gametypes_zm\_globallogic_ui; +#include maps\mp\gametypes_zm\_globallogic_spawn; +#include maps\mp\gametypes_zm\_spectating; +#include maps\mp\gametypes_zm\_globallogic_utils; +#include maps\mp\gametypes_zm\_spawning; +#include maps\mp\gametypes_zm\_hud_message; +#include maps\mp\gametypes_zm\_hud_util; +#include maps\mp\_demo; +#include maps\mp\gametypes_zm\_weapons; +#include maps\mp\gametypes_zm\_spawnlogic; +#include maps\mp\_challenges; +#include maps\mp\gametypes_zm\_tweakables; +#include maps\mp\gametypes_zm\_globallogic_audio; + +callback_playerconnect() +{ + thread notifyconnecting(); + self.statusicon = "hud_status_connecting"; + self waittill("begin"); + + if (isdefined(level.reset_clientdvars)) + self [[level.reset_clientdvars]](); + + waittillframeend; + self.statusicon = ""; + self.guid = self getguid(); + profilelog_begintiming(4, "ship"); + level notify("connected", self); + + if (self ishost()) + self thread maps\mp\gametypes_zm\_globallogic::listenforgameend(); + + if (!level.splitscreen && !isdefined(self.pers["score"])) + iprintln(&"MP_CONNECTED", self); + + if (!isdefined(self.pers["score"])) + self thread maps\mp\zombies\_zm_stats::adjustrecentstats(); + + if (gamemodeismode(level.gamemode_public_match) && !isdefined(self.pers["matchesPlayedStatsTracked"])) + { + gamemode = maps\mp\gametypes_zm\_globallogic::getcurrentgamemode(); + self maps\mp\gametypes_zm\_globallogic::incrementmatchcompletionstat(gamemode, "played", "started"); + + if (!isdefined(self.pers["matchesHostedStatsTracked"]) && self islocaltohost()) + { + self maps\mp\gametypes_zm\_globallogic::incrementmatchcompletionstat(gamemode, "hosted", "started"); + self.pers["matchesHostedStatsTracked"] = 1; + } + + self.pers["matchesPlayedStatsTracked"] = 1; + self thread maps\mp\zombies\_zm_stats::uploadstatssoon(); + } + + lpselfnum = self getentitynumber(); + lpguid = self getguid(); + logprint("J;" + lpguid + ";" + lpselfnum + ";" + self.name + "\\n"); + bbprint("mpjoins", "name %s client %s", self.name, lpselfnum); + + if (!sessionmodeiszombiesgame()) + self setclientuivisibilityflag("hud_visible", 1); + + if (level.forceradar == 1) + { + self.pers["hasRadar"] = 1; + self.hasspyplane = 1; + level.activeuavs[self getentitynumber()] = 1; + } + + if (level.forceradar == 2) + self setclientuivisibilityflag("g_compassShowEnemies", level.forceradar); + else + self setclientuivisibilityflag("g_compassShowEnemies", 0); + + self setclientplayersprinttime(level.playersprinttime); + self setclientnumlives(level.numlives); + makedvarserverinfo("cg_drawTalk", 1); + + if (level.hardcoremode) + self setclientdrawtalk(3); + + if (sessionmodeiszombiesgame()) + self [[level.player_stats_init]](); + else + { + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("score"); + + if (level.resetplayerscoreeveryround) + self.pers["score"] = 0; + + self.score = self.pers["score"]; + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("momentum", 0); + self.momentum = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("momentum"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("suicides"); + self.suicides = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("suicides"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("headshots"); + self.headshots = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("headshots"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("challenges"); + self.challenges = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("challenges"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("kills"); + self.kills = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("kills"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("deaths"); + self.deaths = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("deaths"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("assists"); + self.assists = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("assists"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("defends", 0); + self.defends = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("defends"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("offends", 0); + self.offends = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("offends"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("plants", 0); + self.plants = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("plants"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("defuses", 0); + self.defuses = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("defuses"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("returns", 0); + self.returns = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("returns"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("captures", 0); + self.captures = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("captures"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("destructions", 0); + self.destructions = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("destructions"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("backstabs", 0); + self.backstabs = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("backstabs"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("longshots", 0); + self.longshots = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("longshots"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("survived", 0); + self.survived = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("survived"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("stabs", 0); + self.stabs = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("stabs"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("tomahawks", 0); + self.tomahawks = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("tomahawks"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("humiliated", 0); + self.humiliated = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("humiliated"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("x2score", 0); + self.x2score = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("x2score"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("agrkills", 0); + self.x2score = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("agrkills"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("hacks", 0); + self.x2score = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("hacks"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("sessionbans", 0); + self.sessionbans = self maps\mp\gametypes_zm\_globallogic_score::getpersstat("sessionbans"); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("gametypeban", 0); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("time_played_total", 0); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("time_played_alive", 0); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("teamkills", 0); + self maps\mp\gametypes_zm\_globallogic_score::initpersstat("teamkills_nostats", 0); + self.teamkillpunish = 0; + + if (level.minimumallowedteamkills >= 0 && self.pers["teamkills_nostats"] > level.minimumallowedteamkills) + self thread reduceteamkillsovertime(); + } + + if (getdvar(#"r_reflectionProbeGenerate") == "1") + level waittill("eternity"); + + self.killedplayerscurrent = []; + + if (!isdefined(self.pers["best_kill_streak"])) + { + self.pers["killed_players"] = []; + self.pers["killed_by"] = []; + self.pers["nemesis_tracking"] = []; + self.pers["artillery_kills"] = 0; + self.pers["dog_kills"] = 0; + self.pers["nemesis_name"] = ""; + self.pers["nemesis_rank"] = 0; + self.pers["nemesis_rankIcon"] = 0; + self.pers["nemesis_xp"] = 0; + self.pers["nemesis_xuid"] = ""; + self.pers["best_kill_streak"] = 0; + } + + if (!isdefined(self.pers["music"])) + { + self.pers["music"] = spawnstruct(); + self.pers["music"].spawn = 0; + self.pers["music"].inque = 0; + self.pers["music"].currentstate = "SILENT"; + self.pers["music"].previousstate = "SILENT"; + self.pers["music"].nextstate = "UNDERSCORE"; + self.pers["music"].returnstate = "UNDERSCORE"; + } + + self.leaderdialogqueue = []; + self.leaderdialogactive = 0; + self.leaderdialoggroups = []; + self.currentleaderdialoggroup = ""; + self.currentleaderdialog = ""; + self.currentleaderdialogtime = 0; + + if (!isdefined(self.pers["cur_kill_streak"])) + self.pers["cur_kill_streak"] = 0; + + if (!isdefined(self.pers["cur_total_kill_streak"])) + { + self.pers["cur_total_kill_streak"] = 0; + self setplayercurrentstreak(0); + } + + if (!isdefined(self.pers["totalKillstreakCount"])) + self.pers["totalKillstreakCount"] = 0; + + if (!isdefined(self.pers["killstreaksEarnedThisKillstreak"])) + self.pers["killstreaksEarnedThisKillstreak"] = 0; + + if (isdefined(level.usingscorestreaks) && level.usingscorestreaks && !isdefined(self.pers["killstreak_quantity"])) + self.pers["killstreak_quantity"] = []; + + if (isdefined(level.usingscorestreaks) && level.usingscorestreaks && !isdefined(self.pers["held_killstreak_ammo_count"])) + self.pers["held_killstreak_ammo_count"] = []; + + self.lastkilltime = 0; + self.cur_death_streak = 0; + self disabledeathstreak(); + self.death_streak = 0; + self.kill_streak = 0; + self.gametype_kill_streak = 0; + self.spawnqueueindex = -1; + self.deathtime = 0; + self.lastgrenadesuicidetime = -1; + self.teamkillsthisround = 0; + + if (!isdefined(level.livesdonotreset) || !level.livesdonotreset || !isdefined(self.pers["lives"])) + self.pers["lives"] = level.numlives; + + if (!level.teambased) + self.pers["team"] = undefined; + + self.hasspawned = 0; + self.waitingtospawn = 0; + self.wantsafespawn = 0; + self.deathcount = 0; + self.wasaliveatmatchstart = 0; + level.players[level.players.size] = self; + + if (level.splitscreen) + setdvar("splitscreen_playerNum", level.players.size); + + if (game["state"] == "postgame") + { + self.pers["needteam"] = 1; + self.pers["team"] = "spectator"; + self.team = "spectator"; + self setclientuivisibilityflag("hud_visible", 0); + self [[level.spawnintermission]](); + self closemenu(); + self closeingamemenu(); + profilelog_endtiming(4, "gs=" + game["state"] + " zom=" + sessionmodeiszombiesgame()); + return; + } + + if (level.scr_zm_ui_gametype_group == "zencounter") + { + self maps\mp\zombies\_zm_stats::increment_client_stat("losses"); + self updatestatratio("wlratio", "wins", "losses"); + + if (gamemodeismode(level.gamemode_public_match)) + self maps\mp\zombies\_zm_stats::add_location_gametype_stat(level.scr_zm_map_start_location, level.scr_zm_ui_gametype, "losses", 1); + } + else if (level.scr_zm_ui_gametype_group == "zsurvival") + { + if (isdefined(level.should_use_cia)) + { + self luinotifyevent(&"hud_update_survival_team", 1, level.should_use_cia); + } + } + + level endon("game_ended"); + + if (isdefined(level.hostmigrationtimer)) + self thread maps\mp\gametypes_zm\_hostmigration::hostmigrationtimerthink(); + + if (level.oldschool) + { + self.pers["class"] = undefined; + self.class = self.pers["class"]; + } + + if (isdefined(self.pers["team"])) + self.team = self.pers["team"]; + + if (isdefined(self.pers["class"])) + self.class = self.pers["class"]; + + if (!isdefined(self.pers["team"]) || isdefined(self.pers["needteam"])) + { + self.pers["needteam"] = undefined; + self.pers["team"] = "spectator"; + self.team = "spectator"; + self.sessionstate = "dead"; + self maps\mp\gametypes_zm\_globallogic_ui::updateobjectivetext(); + [[level.spawnspectator]](); + + if (level.rankedmatch) + { + [[level.autoassign]](0); + self thread maps\mp\gametypes_zm\_globallogic_spawn::kickifdontspawn(); + } + else + [[level.autoassign]](0); + + if (self.pers["team"] == "spectator") + { + self.sessionteam = "spectator"; + + if (!level.teambased) + self.ffateam = "spectator"; + + self thread spectate_player_watcher(); + } + + if (level.teambased) + { + self.sessionteam = self.pers["team"]; + + if (!isalive(self)) + self.statusicon = "hud_status_dead"; + + self thread maps\mp\gametypes_zm\_spectating::setspectatepermissions(); + } + } + else if (self.pers["team"] == "spectator") + { + self setclientscriptmainmenu(game["menu_class"]); + [[level.spawnspectator]](); + self.sessionteam = "spectator"; + self.sessionstate = "spectator"; + + if (!level.teambased) + self.ffateam = "spectator"; + + self thread spectate_player_watcher(); + } + else + { + self.sessionteam = self.pers["team"]; + self.sessionstate = "dead"; + + if (!level.teambased) + self.ffateam = self.pers["team"]; + + self maps\mp\gametypes_zm\_globallogic_ui::updateobjectivetext(); + [[level.spawnspectator]](); + + if (maps\mp\gametypes_zm\_globallogic_utils::isvalidclass(self.pers["class"])) + self thread [[level.spawnclient]](); + else + self maps\mp\gametypes_zm\_globallogic_ui::showmainmenuforteam(); + + self thread maps\mp\gametypes_zm\_spectating::setspectatepermissions(); + } + + if (self.sessionteam != "spectator") + self thread maps\mp\gametypes_zm\_spawning::onspawnplayer_unified(1); + + profilelog_endtiming(4, "gs=" + game["state"] + " zom=" + sessionmodeiszombiesgame()); + + if (isdefined(self.pers["isBot"])) + return; +} \ No newline at end of file diff --git a/ui_mp/t6/hud.lua b/ui_mp/t6/hud.lua new file mode 100644 index 00000000..7a64767d --- /dev/null +++ b/ui_mp/t6/hud.lua @@ -0,0 +1,916 @@ +require("T6.CoDBase") +require("T6.HUD.OffhandIcons") +require("T6.HUD.AmmoCounter") +require("T6.HUD.DeadSpectate") +require("T6.HUD.GameMessages") +require("T6.HUD.GameTimer") +require("T6.HUD.GrenadeEffect") +require("T6.HUD.InGameMenus") +require("T6.HUD.Killcam") +require("T6.HUD.ManageSegments") +require("T6.HUD.Migration") +require("T6.HUD.ReaperHUD") +require("T6.HUD.ScoreBoard") +require("T6.HUD.ScoreFeed") +require("T6.HUD.TurretHUD") +require("T6.HUD.Spectate") +require("T6.HUD.WeaponLabel") +require("T6.HUD.Loading") +if Engine.GameModeIsMode(CoD.GAMEMODE_LOCAL_SPLITSCREEN) == false then + require("T6.HUD.DemoHighlightReel") + require("T6.HUD.DemoHUD") + require("T6.HUD.DemoInGame") + require("T6.HUD.DemoPopup") +end +if CoD.isZombie == true then + require("T6.Zombie.BaseZombie") + require("T6.Zombie.Hud3DScoreBoardZombie") + require("T6.Zombie.HudBuildablesZombie") + require("T6.Zombie.HudCompetitiveScoreboardZombie") + require("T6.Zombie.HudDPadAreaZombie") + require("T6.Zombie.HudPerksZombie") + require("T6.Zombie.HudPowerUpsZombie") + require("T6.Zombie.HudRoundStatusZombie") + require("T6.Zombie.HudTimerZombie") + require("T6.Zombie.OtherAmmoCounters") +else + require("T6.VcsMenu") + require("T6.HUD.AirVehicleHUD") + require("T6.HUD.AITank") + require("T6.HUD.AmmoArea") + require("T6.HUD.BombTimer") + require("T6.HUD.ChopperGunnerHUD") + require("T6.HUD.HUDDigit") + require("T6.HUD.IngameVoipDock") + require("T6.HUD.NamePlate") + require("T6.HUD.PredatorHUD") + require("T6.HUD.QRDrone") + require("T6.HUD.RewardSelection") + require("T6.HUD.ScoreArea") + require("T6.HUD.ScoreBottomLeft") + require("T6.HUD.ScorePopup") + require("T6.HUD.NotificationPopups") + require("T6.HUD.Compass") + require("T6.HUD.gametypes.GametypeBase") + require("T6.HUD.gametypes.ctf") + require("T6.HUD.gametypes.dem") + require("T6.HUD.gametypes.dom") + require("T6.HUD.gametypes.hq") + require("T6.HUD.gametypes.koth") + require("T6.HUD.gametypes.oic") + require("T6.HUD.gametypes.oneflag") + require("T6.Menus.LiveStream") +end +if CoD.isWIIU or CoD.isPC then + require("T6.LiveNotification") +end +if CoD.isWIIU then + require("T6.WiiUSystemServices") +end +local HUD_OpenIngameMenu, HUD_SetupEventHandlers, HUD_KillcamUpdate, HUD_UpdateKillstreakHud, HUD_ForceKillKillstreakHud, HUD_SelectingLocationUpdate, HUD_GameEndedUpdate, HUD_ReloadShoutcasterHud, HUD_UpdateVehicleHud, HUD_FactionPopup, FactionPopupAddTextEvent, f0_local11, f0_local12 = nil +function HUD_IngameMenuClosed() +end + +LUI.createMenu.HUD = function (LocalClientIndex) + local HUDWidget = CoD.Menu.NewFromState("HUD", { + leftAnchor = true, + rightAnchor = true, + left = 0, + right = 0, + topAnchor = true, + bottomAnchor = true, + top = 0, + bottom = 0 + }) + if not LUI.roots.UIRootFull.safeAreaOverlay then + LUI.roots.UIRootFull.safeAreaOverlay = CoD.SetupSafeAreaOverlay() + LUI.roots.UIRootFull:addElement(LUI.roots.UIRootFull.safeAreaOverlay) + end + HUDWidget:setOwner(LocalClientIndex) + HUDWidget.controller = LocalClientIndex + HUD_SetupEventHandlers(HUDWidget) + HUDWidget:registerEventHandler("debug_reload", HUD_DebugReload) + HUDWidget:registerEventHandler("update_safe_area", HUD_UpdateSafeArea) + if CoD.isWIIU then + HUDWidget:registerEventHandler("occlusion_change", HUD_OcclusionChange) + end + if CoD.isPC then + Engine.Exec(LocalClientIndex, "ui_keyboard_cancel") + Engine.SetForceMouseRootFull(false) + end + Engine.PlayMenuMusic("") + HUDWidget.loadingMenu = LUI.createMenu.Loading(LocalClientIndex) + HUDWidget:addElement(HUDWidget.loadingMenu) + return HUDWidget +end + +function HUD_UpdateSafeArea(HUDWidget, ClientInstance) + if HUDWidget.SpectateHUD ~= nil then + HUDWidget.SpectateHUD:processEvent(ClientInstance) + end + HUDWidget:dispatchEventToChildren(ClientInstance) +end + +function HUD_OcclusionChange(HUDWidget, ClientInstance) + CoD.Menu.OcclusionChange(HUDWidget, ClientInstance) + Engine.EnableWiiURemotePointer(ClientInstance.controller, not ClientInstance.occluded) +end + +HUD_SetupEventHandlers = function (HUDWidget) + HUD_SetupEventHandlers_Common(HUDWidget) + if CoD.isZombie == false then + HUD_SetupEventHandlers_Multiplayer(HUDWidget) + else + HUD_SetupEventHandlers_Zombie(HUDWidget) + end +end + +function HUD_Hide(HUDWidget, ClientInstance) + HUDWidget:setAlpha(0) +end + +function HUD_Show(HUDWidget, ClientInstance) + HUDWidget:setAlpha(1) +end + +local WiiToggleFriends = function (HUDWidget, ClientInstance) + if LUI.roots["UIRoot" .. ClientInstance.controller].ingameFriendsList then + LUI.roots[rootName]:processEvent({ + name = "closeFriendsList", + controller = ClientInstance.controller + }) + LUI.roots[rootName]:processEvent({ + name = "closeallpopups", + controller = ClientInstance.controller + }) + else + HUDWidget:openPopup("FriendsList", ClientInstance.controller) + end +end + +local PCInputSourceChanged = function (HUDWidget, ClientInstance) + if HUDWidget.scoreBoard then + HUDWidget.scoreBoard:processEvent(ClientInstance) + end + HUDWidget:dispatchEventToChildren(ClientInstance) +end + +function HUD_SetupEventHandlers_Common(HUDWidget) + HUDWidget:registerEventHandler("destroy_hud", HUD_DestroyHUD) + HUDWidget:registerEventHandler("first_snapshot", HUD_FirstSnapshot) + HUDWidget:registerEventHandler("open_ingame_menu", HUD_OpenIngameMenu) + HUDWidget:registerEventHandler("close_ingame_menu", HUD_CloseInGameMenu) + HUDWidget:registerEventHandler("open_scoreboard_menu", HUD_OpenScoreBoard) + HUDWidget:registerEventHandler("close_scoreboard_menu", HUD_CloseScoreBoard) + HUDWidget:registerEventHandler("open_migration_menu", HUD_StartMigration) + HUDWidget:registerEventHandler("spectate_hide_gamehud", HUD_Hide) + HUDWidget:registerEventHandler("spectate_show_gamehud", HUD_Show) + HUDWidget:registerEventHandler("fullscreen_viewport_start", HUD_FullscreenStart) + HUDWidget:registerEventHandler("fullscreen_viewport_stop", HUD_FullscreenStop) + if Engine.GameModeIsMode(CoD.GAMEMODE_LOCAL_SPLITSCREEN) == false then + HUDWidget:registerEventHandler("activate_demo_information_screen", CoD.DemoHUD.ActivateInformationScreen) + HUDWidget:registerEventHandler("open_demo_ingame_menu", CoD.DemoInGame.Open) + HUDWidget:registerEventHandler("open_dollycam_marker_options", CoD.DemoPopup.OpenDollyCamMarkerOptionsPopup) + HUDWidget:registerEventHandler("open_demo_save_popup", CoD.DemoPopup.OpenSavePopup) + HUDWidget:registerEventHandler("open_demo_manage_segments", CoD.ManageSegments.Open) + end + if CoD.isWIIU or CoD.isPC then + HUDWidget:registerEventHandler("live_notification", CoD.LiveNotifications.NotifyMessage) + end + if CoD.isWIIU then + HUDWidget:registerEventHandler("drc_toggle_friends", WiiToggleFriends) + end + if CoD.isPC then + HUDWidget:registerEventHandler("input_source_changed", PCInputSourceChanged) + end +end + +function HUD_SetupEventHandlers_Multiplayer(HUDWidget) + HUDWidget:registerEventHandler("hud_update_killstreak_hud", HUD_UpdateKillstreakHud) + HUDWidget:registerEventHandler("hud_force_kill_killstreak_hud", HUD_ForceKillKillstreakHud) + HUDWidget:registerEventHandler("hud_update_vehicle", HUD_UpdateVehicleHud) + HUDWidget:registerEventHandler("faction_popup", HUD_FactionPopup) + HUDWidget:registerEventHandler("hud_update_team_change", HUD_UpdateRefresh) + HUDWidget:registerEventHandler("hud_update_bit_" .. CoD.BIT_SPECTATING_CLIENT, HUD_UpdateRefresh) + HUDWidget:registerEventHandler("hud_update_bit_" .. CoD.BIT_TEAM_SPECTATOR, HUD_UpdateRefresh) + HUDWidget:registerEventHandler("hud_update_spectate", HUD_UpdateRefresh) + HUDWidget:registerEventHandler("hud_update_bit_" .. CoD.BIT_UI_ACTIVE, HUD_UpdateRefresh) + HUDWidget:registerEventHandler("hud_update_bit_" .. CoD.BIT_GAME_ENDED, HUD_GameEndedUpdate) + HUDWidget:registerEventHandler("hud_update_refresh", HUD_UpdateRefresh) + HUDWidget:registerEventHandler("hud_update_bit_" .. CoD.BIT_IN_KILLCAM, HUD_UpdateRefresh) + HUDWidget:registerEventHandler("hud_update_bit_" .. CoD.BIT_FINAL_KILLCAM, HUD_UpdateRefresh) + HUDWidget:registerEventHandler("hud_update_bit_" .. CoD.BIT_ROUND_END_KILLCAM, HUD_UpdateRefresh) + HUDWidget:registerEventHandler("hud_update_bit_" .. CoD.BIT_SELECTING_LOCATION, HUD_SelectingLocationUpdate) + HUDWidget:registerEventHandler("reload_shoutcaster_hud", HUD_ReloadShoutcasterHud) + if CoD.isPC then + HUDWidget:registerEventHandler("chooseclass_hotkey", HUD_Handle_ChooseClass_HotKey) + end +end + +function HUD_SetupEventHandlers_Zombie(HUDWidget) + CoD.Zombie.IsSurvivalUsingCIAModel = false + HUDWidget:registerEventHandler("hud_update_survival_team", HUD_UpdateSurvivalTeamZombie) + HUDWidget:registerEventHandler("allow_round_animation", HUD_AllowRoundAnimation) +end + +function HUD_AllowRoundAnimation(HUDWidget, ClientInstance) + CoD.Zombie.AllowRoundAnimation = ClientInstance.allow +end + +function HUD_UpdateSurvivalTeamZombie(HUDWidget, ClientInstance) + print(ClientInstance.data[1]) + CoD.Zombie.IsSurvivalUsingCIAModel = ClientInstance.data[1] == 1 +end + +function HUD_FirstSnapshot(HUDWidget, ClientInstance) + HUDWidget:dispatchEventToChildren({ + name = "close_all_popups", + controller = ClientInstance.controller + }) + HUDWidget:removeAllChildren() + HUDWidget:setOwner(ClientInstance.controller) + HUDWidget.controller = ClientInstance.controller + HUD_FirstSnapshot_Common(HUDWidget, ClientInstance) + if CoD.isZombie == false then + HUD_FirstSnapshot_Multiplayer(HUDWidget, ClientInstance) + else + HUD_FirstSnapshot_Zombie(HUDWidget, ClientInstance) + end + Engine.ForceHUDRefresh(ClientInstance.controller) +end + +function HUD_StartMigration(HUDWidget, ClientInstance) + HUDWidget:removeAllChildren() + HUDWidget:addElement(LUI.createMenu.migration_ingame(ClientInstance.controller, HUDWidget)) +end + +function HUD_FirstSnapshot_Common(HUDWidget, ClientInstance) + local safeArea = CoD.Menu.NewSafeAreaFromState("hud_safearea", ClientInstance.controller) + HUDWidget:addElement(safeArea) + HUDWidget.safeArea = safeArea + + local f17_local1 = CoD.GrenadeEffect.new() + f17_local1:setLeftRight(true, true, 0, 0) + f17_local1:setTopBottom(true, true, 0, 0) + HUDWidget:addElement(f17_local1) + if CoD.isZombie == true then + CoD.Zombie.SoloQuestMode = false + local f17_local2 = Engine.PartyGetPlayerCount() + if f17_local2 == 1 and (CoD.isOnlineGame() == false or Engine.GameModeIsMode(CoD.GAMEMODE_PRIVATE_MATCH) == false) then + CoD.Zombie.SoloQuestMode = true + end + if Engine.GameModeIsMode(CoD.GAMEMODE_LOCAL_SPLITSCREEN) == true and f17_local2 > 2 then + CoD.Zombie.LocalSplitscreenMultiplePlayers = true + end + end + HUD_CloseScoreBoard(HUDWidget, ClientInstance) + HUDWidget.scoreBoard = LUI.createMenu.Scoreboard(ClientInstance.controller) + HUDWidget.scoreboardUpdateTimer = LUI.UITimer.new(1000, { + name = "update_scoreboard", + controller = ClientInstance.controller + }, false) + HUDWidget:addElement(LUI.createMenu.DeadSpectate(ClientInstance.controller)) +end + +function HUD_FirstSnapshot_Multiplayer(HUDWidget, ClientInstance) + if Engine.GetGametypeSetting("loadoutKillstreaksEnabled") == 1 then + HUDWidget:addElement(LUI.createMenu.RewardSelection(ClientInstance.controller)) + end + HUDWidget:addElement(LUI.createMenu.ScoreBottomLeft(ClientInstance.controller)) + HUDWidget:addElement(LUI.createMenu.AmmoArea(ClientInstance.controller)) + local f18_local0 = "gametype_" .. UIExpression.DvarString(nil, "g_gametype") + local f18_local1 = LUI.createMenu[f18_local0] + if f18_local1 ~= nil then + HUDWidget:addElement(f18_local1(ClientInstance.controller)) + else + HUDWidget:addElement(CoD.GametypeBase.new(f18_local0, ClientInstance.controller)) + end + local f18_local2 = nil + if CoD.isZombie == true then + f18_local2 = CoD.ScorePopup.new({ + leftAnchor = true, + rightAnchor = true, + left = 0, + right = 0, + topAnchor = true, + bottomAnchor = true, + top = 0, + bottom = 0 + }) + else + f18_local2 = CoD.ScorePopup.new({ + leftAnchor = true, + rightAnchor = true, + left = 0, + right = 0, + topAnchor = true, + bottomAnchor = true, + top = 0, + bottom = 0 + }) + end + HUDWidget:addElement(f18_local2) + HUDWidget:addElement(LUI.createMenu.NotificationPopups(ClientInstance.controller)) + CoD.Compass.AddMinimap(HUDWidget) + local f18_local3 = 5 + HUDWidget.ingameTalker = CoD.IngameVoipDock.New() + HUDWidget.ingameTalker:setLeftRight(false, true, f18_local3, f18_local3 + CoD.IngameVoipDock.IconWidth) + HUDWidget.ingameTalker:setTopBottom(true, false, 0, CoD.IngameVoipDock.IconWidth) + HUDWidget.miniMapContainer:addElement(HUDWidget.ingameTalker) + if not Engine.IsSplitscreen() then + CoD.GameMessages.AddObituaryWindow(HUDWidget, { + leftAnchor = true, + rightAnchor = false, + left = 13, + right = 277, + topAnchor = false, + bottomAnchor = true, + top = -249, + bottom = -149 + }) + end + CoD.GameMessages.BoldGameMessagesWindow(HUDWidget, { + leftAnchor = false, + rightAnchor = false, + left = 0, + right = 0, + topAnchor = false, + bottomAnchor = false, + top = 50, + bottom = 70 + }) + if Engine.GameModeIsMode(CoD.GAMEMODE_LOCAL_SPLITSCREEN) == false then + CoD.LiveStream.AddInGameStatusWidget(HUDWidget, ClientInstance.controller, { + leftAnchor = false, + rightAnchor = true, + left = -200, + right = 0, + topAnchor = true, + bottomAnchor = false, + top = 0, + bottom = 150 + }) + CoD.DemoHUD.AddHUDWidgets(HUDWidget, ClientInstance) + end +end + +function HUD_FirstSnapshot_Zombie(HUDWidget, ClientInstance) + local Widget = LUI.UIElement.new() + Widget:setLeftRight(true, true, 0, 0) + Widget:setTopBottom(true, true, 0, 0) + HUDWidget:addElement(Widget) + if CoD.Zombie.IsDLCMap(CoD.Zombie.DLC3Maps) then + Widget:registerEventHandler("time_bomb_hud_toggle", HUD_ToggleZombieHudContainer) + end + Widget:addElement(LUI.createMenu.PerksArea(ClientInstance.controller)) + Widget:addElement(LUI.createMenu.PowerUpsArea(ClientInstance.controller)) + if CoD.Zombie.IsDLCMap(CoD.Zombie.DLC2Maps) then + if CoD.Zombie.GAMETYPE_ZCLASSIC == Dvar.ui_gametype:get() then + require("T6.Zombie.HudCraftablesZombie") + Widget:addElement(LUI.createMenu.CraftablesArea(ClientInstance.controller)) + end + require("T6.Zombie.HudAfterlifeDisplay") + local f19_local1 = LUI.createMenu.AfterlifeArea(ClientInstance.controller) + f19_local1:setUseGameTime(true) + Widget:addElement(f19_local1) + elseif CoD.Zombie.IsDLCMap(CoD.Zombie.DLC4Maps) then + if CoD.Zombie.GAMETYPE_ZCLASSIC == Dvar.ui_gametype:get() then + require("T6.Zombie.HudCraftablesTombZombie") + Widget:addElement(LUI.createMenu.CraftablesTombArea(ClientInstance.controller)) + require("T6.HUD.gametypes.GametypeBase") + require("T6.Zombie.TombCaptureZoneDisplay") + Widget:addElement(LUI.createMenu.TombCaptureZoneDisplay(ClientInstance.controller)) + if not CoD.Zombie.LocalSplitscreenMultiplePlayers then + require("T6.Zombie.HudChallengeMedals") + Widget:addElement(LUI.createMenu.ChallengeMedalsArea(ClientInstance.controller)) + end + end + else + Widget:addElement(LUI.createMenu.BuildablesArea(ClientInstance.controller)) + end + if CoD.Zombie.IsDLCMap(CoD.Zombie.DLC3Maps) then + require("T6.Zombie.HudTimeBomb") + Widget:addElement(LUI.createMenu.TimeBombArea(ClientInstance.controller)) + end + local f19_local1 = LUI.createMenu.CompetitiveScoreboard(ClientInstance.controller) + f19_local1:setUseGameTime(true) + Widget:addElement(f19_local1) + if CoD.Zombie.IsDLCMap(CoD.Zombie.DLC2Maps) or CoD.Zombie.IsDLCMap(CoD.Zombie.DLC3Maps) or CoD.Zombie.IsDLCMap(CoD.Zombie.DLC4Maps) then + require("T6.Zombie.AmmoAreaZombie") + local f19_local2 = LUI.createMenu.AmmoAreaZombie(ClientInstance.controller) + f19_local2:setUseGameTime(true) + Widget:addElement(f19_local2) + else + local f19_local2 = LUI.createMenu.DPadArea(ClientInstance.controller) + f19_local2:setUseGameTime(true) + Widget:addElement(f19_local2) + end + if CoD.Zombie.GAMETYPE_ZCLEANSED == Dvar.ui_gametype:get() then + local f19_local2 = LUI.createMenu.TimerAreaZM(ClientInstance.controller) + f19_local2:setUseGameTime(true) + Widget:addElement(f19_local2) + else + local f19_local2 = LUI.createMenu.RoundStatus(ClientInstance.controller) + f19_local2:setUseGameTime(true) + Widget:addElement(f19_local2) + end + if CoD.Zombie.GAMETYPEGROUP_ZENCOUNTER == UIExpression.DvarString(nil, "ui_zm_gamemodegroup") then + Widget:addElement(CoD.Hud3DScoreBoardZombie.new({ + leftAnchor = true, + rightAnchor = true, + left = 0, + right = 0, + topAnchor = true, + bottomAnchor = true, + bottom = 0, + top = 0, + ui3DWindow = 0 + })) + end + if not Engine.IsSplitscreen() then + CoD.GameMessages.AddObituaryWindow(HUDWidget, { + leftAnchor = true, + rightAnchor = false, + left = 13, + right = 277, + topAnchor = false, + bottomAnchor = true, + top = -320, + bottom = -220 + }) + CoD.GameMessages.BoldGameMessagesWindow(HUDWidget, { + leftAnchor = false, + rightAnchor = false, + left = 0, + right = 0, + topAnchor = true, + bottomAnchor = false, + top = 50, + bottom = 70 + }) + end + if Engine.GameModeIsMode(CoD.GAMEMODE_LOCAL_SPLITSCREEN) == false then + CoD.DemoHUD.AddHUDWidgets(HUDWidget, ClientInstance) + end +end + +function HUD_ToggleZombieHudContainer(HUDWidget, ClientInstance) + if ClientInstance.newValue == 0 then + HUDWidget:beginAnimation("fade_in", 500) + HUDWidget:setAlpha(1) + else + HUDWidget:beginAnimation("fade_out", 500) + HUDWidget:setAlpha(0) + end +end + +HUD_OpenIngameMenu = function (HUDWidget, ClientInstance) + if HUDWidget.m_inputDisabled then + return + elseif ClientInstance.menuName == "class" and Engine.IsMigrating(ClientInstance.controller) == true then + return + elseif true == CoD.isZombie then + if CoD.InGameMenu.m_unpauseDisabled == nil then + CoD.InGameMenu.m_unpauseDisabled = {} + end + CoD.InGameMenu.m_unpauseDisabled[ClientInstance.controller + 1] = 0 + if ClientInstance.unpausable ~= nil and ClientInstance.unpausable == 0 then + CoD.InGameMenu.m_unpauseDisabled[ClientInstance.controller + 1] = 1 + end + end + if ClientInstance.data ~= nil then + ClientInstance.menuName = Engine.GetIString(ClientInstance.data[1], "CS_SCRIPT_MENUS") + end + if HUDWidget.SpectateHUD ~= nil and HUDWidget.SpectateHUD.m_controlsOpen then + return + end + local f21_local0 = LUI.createMenu[ClientInstance.menuName] + HUDWidget:dispatchEventToChildren(ClientInstance) + if f21_local0 ~= nil then + HUDWidget:openPopup(ClientInstance.menuName, ClientInstance.controller) + end + if HUDWidget.SpectateHUD ~= nil then + HUDWidget.SpectateHUD:processEvent({ + name = "spectate_ingame_menu_opened" + }) + end +end + +function HUD_CloseInGameMenu(HUDWidget, ClientInstance) + if CoD.isZombie == true then + if CoD.InGameMenu.m_unpauseDisabled == nil then + CoD.InGameMenu.m_unpauseDisabled = {} + end + CoD.InGameMenu.m_unpauseDisabled[ClientInstance.controller + 1] = 0 + end + if HUDWidget.SpectateHUD ~= nil then + HUDWidget.SpectateHUD:processEvent({ + name = "spectate_ingame_menu_closed" + }) + end + if CoD.isZombie == true then + Engine.SetActiveMenu(ClientInstance.controller, CoD.UIMENU_NONE) + end +end + +function HUD_OpenScoreBoard(HUDWidget, ClientInstance) + if CoD.isZombie == true and CoD.InGameMenu.m_unpauseDisabled ~= nil and CoD.InGameMenu.m_unpauseDisabled[ClientInstance.controller + 1] ~= nil and CoD.InGameMenu.m_unpauseDisabled[ClientInstance.controller + 1] > 0 then + return + elseif HUDWidget.scoreBoard and (HUDWidget.SpectateHUD == nil or not HUDWidget.SpectateHUD.m_controlsOpen) then + HUDWidget:addElement(HUDWidget.scoreBoard) + HUDWidget.scoreBoard:processEvent({ + name = "update_scoreboard", + controller = ClientInstance.controller + }) + HUDWidget:addElement(HUDWidget.scoreboardUpdateTimer) + if CoD.isZombie == true then + if HUDWidget.scoreBoard.questItemDisplay then + HUDWidget.scoreBoard.questItemDisplay:processEvent({ + name = "update_quest_item_display_scoreboard", + controller = ClientInstance.controller + }) + end + if HUDWidget.scoreBoard.persistentItemDisplay then + HUDWidget.scoreBoard.persistentItemDisplay:processEvent({ + name = "update_persistent_item_display_scoreboard", + controller = ClientInstance.controller + }) + end + if HUDWidget.scoreBoard.craftableItemDisplay then + HUDWidget.scoreBoard.craftableItemDisplay:processEvent({ + name = "update_craftable_item_display_scoreboard", + controller = ClientInstance.controller + }) + end + if HUDWidget.scoreBoard.captureZoneWheelDisplay then + HUDWidget.scoreBoard.captureZoneWheelDisplay:processEvent({ + name = "update_capture_zone_wheel_display_scoreboard", + controller = ClientInstance.controller + }) + end + end + if HUDWidget.SpectateHUD ~= nil then + HUDWidget.SpectateHUD:processEvent({ + name = "spectate_scoreboard_opened" + }) + if HUDWidget.SpectateHUD.m_selectedClientNum ~= nil then + HUDWidget.scoreBoard:processEvent({ + name = "focus_client", + controller = ClientInstance.controller, + clientNum = HUDWidget.SpectateHUD.m_selectedClientNum + }) + end + end + end +end + +function HUD_CloseScoreBoard(HUDWidget, ClientInstance) + if HUDWidget.scoreBoard then + HUDWidget.scoreBoard:close() + HUDWidget.scoreboardUpdateTimer:close() + HUDWidget.scoreboardUpdateTimer:reset() + if HUDWidget.SpectateHUD ~= nil then + HUDWidget.SpectateHUD:processEvent({ + name = "spectate_scoreboard_closed" + }) + end + end +end + +function HUD_DebugReload(HUDWidget, ClientInstance) + if HUDWidget.m_eventHandlers.debug_reload ~= HUD_DebugReload then + HUDWidget:registerEventHandler("debug_reload", HUD_DebugReload) + HUDWidget:processEvent({ + name = "debug_reload" + }) + return + else + HUDWidget.chopperGunnerHUD = nil + HUDWidget.predatorHUD = nil + HUDWidget.reaperHUD = nil + HUD_SetupEventHandlers(HUDWidget) + HUD_FirstSnapshot(HUDWidget, { + controller = HUDWidget.controller + }) + Engine.ForceHUDRefresh(HUDWidget.controller) + end +end + +function HUD_UpdateRefresh(HUDWidget, ClientInstance) + HUD_KillcamUpdate(HUDWidget, ClientInstance) + HUD_GameEndedUpdate(HUDWidget, ClientInstance) +end + +function HUD_FullscreenStart(HUDWidget, ClientInstance) + HUDWidget.scoreBoard:processEvent(ClientInstance) + HUDWidget:dispatchEventToChildren(ClientInstance) +end + +function HUD_FullscreenStop(HUDWidget, ClientInstance) + HUDWidget.scoreBoard:processEvent(ClientInstance) + HUDWidget:dispatchEventToChildren(ClientInstance) +end + +function HUD_StartKillcamHud(HUDWidget, ClientInstance) + if not HUDWidget.killcamHUD then + HUDWidget.killcamHUD = LUI.createMenu.Killcam(ClientInstance.controller) + HUDWidget:addElement(HUDWidget.killcamHUD) + local f29_local0 = LUI.roots.UIRootDrc + if f29_local0 then + f29_local0:processEvent({ + name = "killcam_open", + controller = ClientInstance.controller + }) + end + end +end + +function HUD_StopKillcamHud(HUDWidget, ClientInstance) + if HUDWidget.killcamHUD then + HUDWidget.killcamHUD:close() + HUDWidget.killcamHUD = nil + local f30_local0 = LUI.roots.UIRootDrc + if f30_local0 then + f30_local0:processEvent({ + name = "killcam_close", + controller = ClientInstance.controller + }) + end + end +end + +HUD_KillcamUpdate = function (HUDWidget, ClientInstance) + if UIExpression.IsVisibilityBitSet(ClientInstance.controller, CoD.BIT_IN_KILLCAM) == 1 then + if HUDWidget.killcamHUD then + if HUDWidget.killcamHUD.isFinalKillcam ~= UIExpression.IsVisibilityBitSet(ClientInstance.controller, CoD.BIT_FINAL_KILLCAM) then + HUD_StopKillcamHud(HUDWidget, ClientInstance) + elseif HUDWidget.killcamHUD.isRoundEndKillcam ~= UIExpression.IsVisibilityBitSet(ClientInstance.controller, CoD.BIT_ROUND_END_KILLCAM) then + HUD_StopKillcamHud(HUDWidget, ClientInstance) + end + end + HUD_StartKillcamHud(HUDWidget, ClientInstance) + else + HUD_StopKillcamHud(HUDWidget, ClientInstance) + end + HUDWidget:dispatchEventToChildren(ClientInstance) +end + +local f0_local18 = function (f32_arg0) + local f32_local0 + if Engine.IsSplitscreen() ~= false or Engine.IsDemoShoutcaster() ~= true and (UIExpression.IsVisibilityBitSet(f32_arg0, CoD.BIT_SPECTATING_CLIENT) ~= 1 or UIExpression.IsVisibilityBitSet(f32_arg0, CoD.BIT_TEAM_SPECTATOR) ~= 1 or UIExpression.IsVisibilityBitSet(f32_arg0, CoD.BIT_GAME_ENDED) ~= 0 or UIExpression.IsVisibilityBitSet(f32_arg0, CoD.BIT_UI_ACTIVE) ~= 0) then + f32_local0 = false + else + f32_local0 = true + end + return f32_local0 +end + +HUD_GameEndedUpdate = function (HUDWidget, ClientInstance) + if f0_local18(ClientInstance.controller) then + if HUDWidget.SpectateHUD == nil then + local f33_local0 = CoD.SpectateHUD.new(ClientInstance) + LUI.roots.UIRootFull:addElement(f33_local0) + HUDWidget.SpectateHUD = f33_local0 + HUDWidget.SpectateHUD.m_gameHUD = HUDWidget + end + CoD.SpectateHUD.update(HUDWidget.SpectateHUD, ClientInstance) + elseif HUDWidget.SpectateHUD ~= nil then + HUDWidget.SpectateHUD:close() + HUDWidget.SpectateHUD = nil + end + HUDWidget:dispatchEventToChildren(ClientInstance) +end + +HUD_ReloadShoutcasterHud = function (HUDWidget, ClientInstance) + if HUDWidget.SpectateHUD ~= nil then + HUDWidget.SpectateHUD:close() + HUDWidget.SpectateHUD = nil + end + HUD_GameEndedUpdate(HUDWidget, ClientInstance) +end + +local f0_local19 = function (f35_arg0) + local f35_local0 + if UIExpression.IsVisibilityBitSet(f35_arg0, CoD.BIT_SELECTING_LOCATION) ~= 1 or UIExpression.IsVisibilityBitSet(f35_arg0, CoD.BIT_SPECTATING_CLIENT) ~= 0 or UIExpression.IsVisibilityBitSet(f35_arg0, CoD.BIT_IS_DEMO_PLAYING) ~= 0 or UIExpression.IsVisibilityBitSet(f35_arg0, CoD.BIT_SCOREBOARD_OPEN) ~= 0 then + f35_local0 = false + else + f35_local0 = true + end + return f35_local0 +end + +HUD_SelectingLocationUpdate = function (HUDWidget, ClientInstance) + if f0_local19(ClientInstance.controller) then + if HUDWidget.locationSelectorMap == nil then + if HUDWidget.selectorContainer == nil then + HUDWidget.selectorContainer = CoD.SplitscreenScaler.new(nil, 1.3) + HUDWidget.selectorContainer:setLeftRight(false, false, 0, 0) + HUDWidget.selectorContainer:setTopBottom(false, false, 0, 0) + HUDWidget.safeArea:addElement(HUDWidget.selectorContainer) + end + HUDWidget.locationSelectorMap = CoD.Compass.new({ + leftAnchor = false, + rightAnchor = false, + left = -275, + right = 275, + topAnchor = false, + bottomAnchor = false, + top = -275, + bottom = 275 + }, CoD.COMPASS_TYPE_FULL) + HUDWidget.selectorContainer:addElement(HUDWidget.locationSelectorMap) + Engine.BlurWorld(ClientInstance.controller, 2) + end + elseif HUDWidget.locationSelectorMap ~= nil then + HUDWidget.selectorContainer:close() + HUDWidget.selectorContainer = nil + HUDWidget.locationSelectorMap:close() + HUDWidget.locationSelectorMap = nil + Engine.BlurWorld(ClientInstance.controller, 0) + end + HUDWidget:dispatchEventToChildren(ClientInstance) +end + +HUD_UpdateKillstreakHud = function (HUDWidget, ClientInstance) + if ClientInstance.chopperGunner == true then + if HUDWidget.chopperGunnerHUD == nil then + local predatorHUD = CoD.ChopperGunnerHUD.new(ClientInstance.controller) + HUDWidget:addElement(predatorHUD) + HUDWidget.chopperGunnerHUD = predatorHUD + + end + else + HUDWidget.chopperGunnerHUD = nil + end + if ClientInstance.reaper == true then + if HUDWidget.reaperHUD == nil then + local predatorHUD = CoD.ReaperHUD.new(ClientInstance.controller) + HUDWidget:addElement(predatorHUD) + HUDWidget.reaperHUD = predatorHUD + + end + else + HUDWidget.reaperHUD = nil + end + if ClientInstance.predator == true then + if HUDWidget.predatorHUD == nil then + local predatorHUD = CoD.PredatorHUD.new(ClientInstance.controller) + HUDWidget:addElement(predatorHUD) + HUDWidget.predatorHUD = predatorHUD + + end + else + HUDWidget.predatorHUD = nil + end + HUDWidget:dispatchEventToChildren(ClientInstance) +end + +HUD_ForceKillKillstreakHud = function (HUDWidget, ClientInstance) + Engine.DisableSceneFilter(HUDWidget:getOwner(), 4) +end + +HUD_UpdateVehicleHud = function (HUDWidget, ClientInstance) + if HUDWidget.vehicleHUD then + if HUDWidget.vehicleHUD.vehicleType == ClientInstance.vehicleType then + return + end + HUDWidget.vehicleHUD:close() + HUDWidget.vehicleHUD = nil + Engine.DisableSceneFilter(HUDWidget:getOwner(), 4) + end + if not ClientInstance.vehicleType then + return + end + local f39_local0 = LUI.createMenu[ClientInstance.vehicleType] + if f39_local0 then + HUDWidget.vehicleHUD = f39_local0(HUDWidget:getOwner()) + HUDWidget.vehicleHUD:setPriority(-10) + HUDWidget.vehicleHUD.vehicleType = ClientInstance.vehicleType + HUDWidget:addElement(HUDWidget.vehicleHUD) + end +end + +HUD_FactionPopup = function (HUDWidget, ClientInstance) + local f40_local0 = UIExpression.Team(ClientInstance.controller, "name") + local f40_local1, f40_local2, f40_local3, f40_local4, f40_local5 = nil + if f40_local0 == "TEAM_ALLIES" then + f40_local1 = RegisterMaterial(UIExpression.DvarString(nil, "g_TeamIcon_Allies")) + f40_local2 = CoD.ScoreFeed.Color1 + f40_local3 = CoD.ScoreFeed.Color2 + f40_local4 = CoD.ScoreFeed.Color3 + f40_local5 = UIExpression.ToUpper(nil, Engine.Localize(Engine.GetIString(ClientInstance.data[1], "CS_LOCALIZED_STRINGS"), Dvar.g_TeamName_Allies:get())) + elseif f40_local0 == "TEAM_AXIS" then + f40_local1 = RegisterMaterial(UIExpression.DvarString(nil, "g_TeamIcon_Axis")) + f40_local2 = CoD.ScoreFeed.ScoreStreakColor1 + f40_local3 = CoD.ScoreFeed.ScoreStreakColor2 + f40_local4 = CoD.ScoreFeed.ScoreStreakColor3 + f40_local5 = UIExpression.ToUpper(nil, Engine.Localize(Engine.GetIString(ClientInstance.data[1], "CS_LOCALIZED_STRINGS"), Dvar.g_TeamName_Axis:get())) + else + return + end + local f40_local6 = 128 + local f40_local7 = 0 + local Widget = LUI.UIElement.new({ + leftAnchor = true, + rightAnchor = true, + left = 0, + right = 0, + topAnchor = true, + bottomAnchor = true, + top = 0, + bottom = 0 + }) + HUDWidget.safeArea:addElement(Widget) + + local darkSplash = LUI.UIImage.new() + darkSplash:setLeftRight(false, false, -f40_local6 / 2, f40_local6 / 2) + darkSplash:setTopBottom(true, false, f40_local7, f40_local7 + f40_local6) + darkSplash:setImage(RegisterMaterial("ks_menu_background")) + darkSplash:setAlpha(0.5) + Widget:addElement(darkSplash) + Widget.darkSplash = darkSplash + + local f40_local10 = CoD.textSize.Condensed + Widget.text = CoD.AdditiveTextOverlay.newWithText(f40_local5, "Condensed", f40_local2, f40_local3, f40_local4, { + leftAnchor = true, + rightAnchor = true, + left = 0, + right = 0, + topAnchor = true, + bottomAnchor = false, + top = f40_local6, + bottom = f40_local6 + f40_local10 + }) + Widget.text.label:setRGB(CoD.offWhite.r, CoD.offWhite.g, CoD.offWhite.b) + Widget.image = LUI.UIImage.new({ + leftAnchor = false, + rightAnchor = false, + left = -f40_local6 / 2, + right = f40_local6 / 2, + topAnchor = true, + bottomAnchor = false, + top = f40_local7, + bottom = f40_local7 + f40_local6, + material = f40_local1 + }) + Widget:addElement(Widget.image) + local f40_local11 = f40_local6 + f40_local10 + local f40_local12 = f40_local6 + Widget.imageGlow = CoD.AdditiveTextOverlay.new(f40_local6, f40_local6, f40_local2, f40_local3, f40_local4, { + leftAnchor = false, + rightAnchor = false, + left = -f40_local6 / 2, + right = f40_local6 / 2, + topAnchor = true, + bottomAnchor = false, + top = 0, + bottom = f40_local6 + }) + Widget:addElement(Widget.imageGlow) + Widget:registerEventHandler("add_text", FactionPopupAddTextEvent) + Widget:registerEventHandler("out", f0_local11) + Widget:registerEventHandler("out2", f0_local12) + Widget:addElement(LUI.UITimer.new(500, "add_text", true)) + Widget:addElement(LUI.UITimer.new(2000, "out", true)) +end + +FactionPopupAddTextEvent = function (HUDWidget, ClientInstance) + HUDWidget:addElement(HUDWidget.text) +end + +f0_local11 = function (HUDWidget, ClientInstance) + HUDWidget.text:out() + HUDWidget:addElement(LUI.UITimer.new(CoD.AdditiveTextOverlay.PulseOutTime, "out2", true)) + HUDWidget:addElement(LUI.UITimer.new(CoD.AdditiveTextOverlay.PulseOutTime * 2, "close", true)) +end + +f0_local12 = function (HUDWidget, ClientInstance) + HUDWidget.imageGlow:out() + HUDWidget.image:close() + HUDWidget.darkSplash:close() +end + +function HUD_IsFFA() + local IsFFa = false + if CoD.isZombie == true then + local GamemodeGroup = UIExpression.DvarString(nil, "ui_zm_gamemodegroup") + if GamemodeGroup ~= CoD.Zombie.GAMETYPEGROUP_ZCLASSIC and GamemodeGroup ~= CoD.Zombie.GAMETYPEGROUP_ZSURVIVAL then + IsFFa = true + end + elseif UIExpression.DvarString(nil, "ui_gametype") == "dm" or UIExpression.DvarString(nil, "ui_gametype") == "hcdm" or UIExpression.DvarString(nil, "ui_gametype") == "hack" then + IsFFa = true + end + return IsFFa +end + +function HUD_Handle_ChooseClass_HotKey(HUDWidget, ClientInstance) + if UIExpression.Team(ClientInstance.controller, "name") ~= "TEAM_SPECTATOR" and CoD.IsWagerMode() == false and not (Engine.GetGametypeSetting("disableClassSelection") == 1) then + HUD_OpenIngameMenu(HUDWidget, { + menuName = "changeclass", + controller = ClientInstance.controller + }) + end +end + +DisableGlobals() +Engine.StopEditingPresetClass() \ No newline at end of file