diff --git a/data/cdata/ui_scripts/MainMenu/MPMainMenu.lua b/data/cdata/ui_scripts/MainMenu/MPMainMenu.lua new file mode 100644 index 00000000..ea82dd6b --- /dev/null +++ b/data/cdata/ui_scripts/MainMenu/MPMainMenu.lua @@ -0,0 +1,450 @@ +LUI.FlowManager.RegisterFenceGroup("MPMainMenu", { + "mp", + "mpInstall", + "onlineServices", + "onlineData", + "patch", + "exchange", + "playlists", + "dailyReward" +}) + +LUI.FlowManager.RequestSetStack("MPMainMenu", { + { name = "MainLockoutMenu" }, + { name = "MainMenu" } +}) + +local HandleSplitscreenRefresh = function () + if Engine.SplitscreenPlayerCount() > 0 then + local activeController = Engine.GetFirstActiveController() + if activeController and Engine.IsUserSignedIn(activeController) then + Engine.PLMRefreshData() + end + end +end + +local HandleBackButton = function(f2_arg0, f2_arg1) + local f2_local0 = Engine.HasActiveLocalClient( f2_arg1.controller ) + if f2_local0 then + f2_local0 = not Engine.IsActiveLocalClientPrimary( f2_arg1.controller ) + end + if f2_local0 then + local f2_local1 = LUI.FlowManager.GetScopedData( f2_arg0 ) + if f2_local1 and f2_local1.focusedPage and f2_local1.focusedPage > 2 then + f2_arg0:dispatchEventToRoot( { + name = "lobby_slide_left", + immediate = true + } ) + end + elseif Lobby.IsNotAloneInPrivateParty() then + if Engine.IsXB3() then + LUI.FlowManager.RequestPopupMenu( f2_arg0, "RateLimitedLeaveCommonMPMainMenuPopup", true, f2_arg1.controller, false, { + menu = f2_arg0, + rateLimitIntervalMS = 5000, + rateLimitAttempts = 3 + } ) + else + LUI.FlowManager.RequestPopupMenu( f2_arg0, "LeaveCommonMPMainMenuPopup", true, f2_arg1.controller, false, { + menu = f2_arg0 + } ) + end + else + Lobby.LeaveCommonMPMainMenu( f2_arg0, f2_arg1.controller ) + end + return true +end + +local InitializeMainMenu = function(arg0, arg1) + local activeController = Engine.GetFirstActiveController() + if Engine.GetDvarBool("xblive_competitionmatch") then + Engine.SetDvarBool("xblive_competitionmatch", false) + Engine.Exec("set remove_mlg_rules 1") + end + Engine.ExecNow(MPConfig.default_xboxlive, activeController) +end + +local UpdatePlayerData = function(arg0) + local postShipFlag = Engine.GetPlayerDataEx(arg0, CoD.StatsGroup.Ranked, "postShipFlags", 3) + if postShipFlag == nil or postShipFlag == false then + local archetypePreferences = { + { "head", 1, "head_160", "head_287" }, + { "head", 3, "head_167", "head_294" }, + { "body", 1, "body_90", "body_217" }, + { "body", 3, "body_97", "body_224" } + } + + for _, pref in ipairs(archetypePreferences) do + local currentValue = Engine.GetPlayerDataEx(arg0, CoD.StatsGroup.RankedLoadouts, "squadMembers", "archetypePreferences", pref[2], pref[1]) + if currentValue ~= nil and currentValue == pref[3] then + Engine.SetPlayerDataEx(arg0, CoD.StatsGroup.RankedLoadouts, "squadMembers", "archetypePreferences", pref[2], pref[1], pref[4]) + end + end + + local headData = Engine.GetPlayerDataEx(arg0, CoD.StatsGroup.RankedLoadouts, "squadMembers", "head") + local bodyData = Engine.GetPlayerDataEx(arg0, CoD.StatsGroup.RankedLoadouts, "squadMembers", "body") + + if headData ~= nil and (headData == 160 or headData == 167) then + Engine.SetPlayerDataEx(arg0, CoD.StatsGroup.RankedLoadouts, "squadMembers", "head", headData == 160 and 287 or 294) + end + if bodyData ~= nil and (bodyData == 90 or bodyData == 97) then + Engine.SetPlayerDataEx(arg0, CoD.StatsGroup.RankedLoadouts, "squadMembers", "body", bodyData == 90 and 217 or 224) + end + + -- Same operation for private loadouts + for _, pref in ipairs(archetypePreferences) do + local currentValue = Engine.GetPlayerDataEx(arg0, CoD.StatsGroup.PrivateLoadouts, "squadMembers", "archetypePreferences", pref[2], pref[1]) + if currentValue ~= nil and currentValue == pref[3] then + Engine.SetPlayerDataEx(arg0, CoD.StatsGroup.PrivateLoadouts, "squadMembers", "archetypePreferences", pref[2], pref[1], pref[4]) + end + end + + local privateHeadData = Engine.GetPlayerDataEx(arg0, CoD.StatsGroup.PrivateLoadouts, "squadMembers", "head") + local privateBodyData = Engine.GetPlayerDataEx(arg0, CoD.StatsGroup.PrivateLoadouts, "squadMembers", "body") + + if privateHeadData ~= nil and (privateHeadData == 160 or privateHeadData == 167) then + Engine.SetPlayerDataEx(arg0, CoD.StatsGroup.PrivateLoadouts, "squadMembers", "head", privateHeadData == 160 and 287 or 294) + end + if privateBodyData ~= nil and (privateBodyData == 90 or privateBodyData == 97) then + Engine.SetPlayerDataEx(arg0, CoD.StatsGroup.PrivateLoadouts, "squadMembers", "body", privateBodyData == 90 and 217 or 224) + end + + local characterHead = Engine.GetPlayerDataEx(arg0, CoD.StatsGroup.RankedLoadouts, "squadMembers", "head") + local characterBody = Engine.GetPlayerDataEx(arg0, CoD.StatsGroup.RankedLoadouts, "squadMembers", "body") + local characterSuper = Engine.GetPlayerDataEx(arg0, CoD.StatsGroup.RankedLoadouts, "squadMembers", "archetypeSuper") + local characterArchetype = Engine.GetPlayerDataEx(arg0, CoD.StatsGroup.RankedLoadouts, "squadMembers", "archetype") + + if characterHead ~= nil and characterBody ~= nil then + FrontEndScene.SetCharacterModelsByIndex(FrontEndScene.ClientCharacters.Self, characterBody, characterHead) + end + + if characterSuper ~= nil and characterArchetype ~= nil then + FrontEndScene.SetWeaponForSuper(FrontEndScene.ClientCharacters.Self, characterSuper, characterArchetype) + FrontEndScene.PlayIdleForSuper(FrontEndScene.ClientCharacters.Self, characterSuper, characterArchetype) + end + + Engine.SetPlayerDataEx(arg0, CoD.StatsGroup.Ranked, "postShipFlags", 3, true) + Engine.ExecNow("uploadstats", arg0) + end +end + +local LoadMainMenu = function(controller) + UpdatePlayerData(controller) +end + +-- Function to set up the main menu for multiplayer +local SetupMainMenu = function(menu, controller) + -- Disable UI version display and online requirement + Engine.SetDvarString("ui_version_show", "0") + Engine.SetDvarBool("ui_onlineRequired", false) + + -- Set up front end scene + FrontEndScene.CurrentMissionTeam = MissionDirector.InvalidTeamID + FrontEndScene.SetScene("mp_main") + + -- Get controller index + local controllerIndex = controller and controller.controller or Engine.GetFirstActiveController() + + -- Check title update requirement + CheckTURequirement(menu, controllerIndex) + + -- Set up player character based on loadout data + local loadoutData = DataSources.alwaysLoaded.playerData.MP.rankedloadouts.squadMembers + local rigAnim = Cac.GetRigFrontEndProfileAnim(loadoutData.archetype:GetValue(controllerIndex)) + FrontEndScene.SetCharacterModelsByIndex( + FrontEndScene.ClientCharacters.Profile, + loadoutData.body:GetValue(controllerIndex), + loadoutData.head:GetValue(controllerIndex) + ) + ClientCharacter.SetCharacterWeapons(FrontEndScene.ClientCharacters.Profile, nil) + ClientCharacter.PlayCharacterAnim(FrontEndScene.ClientCharacters.Profile, rigAnim) + ClientCharacter.SetCharacterVisible(FrontEndScene.ClientCharacters.Profile, true) + + -- Set up weapon visibility + ClientWeapon.SetWeaponIsViewModel(0, true) + ClientWeapon.SetWeaponVisible(0, false) + + -- Initialize main menu + InitializeMainMenu(menu, controller) + + -- Sync unlocks if enabled + if Engine.GetDvarBool("enable_unlock_sync") then + local unlockTypes = {} + for _, unlockType in pairs(AAR.UnlockTypes) do + table.insert(unlockTypes, unlockType) + end + Rewards.SyncUnlocks(controllerIndex, unlockTypes, #unlockTypes) + end + + -- Start private party if not already in one + if not Lobby.IsInPrivateParty() then + Engine.ExecNow("xstartprivateparty", controllerIndex) + end + + -- Handle events related to party and CRM (Customer Relationship Management) + menu:registerEventHandler("not_below_blocking_fence", function() + Engine.SetDvarBool("cg_mlg_gamebattles_match", false) + if not MLG.IsGameBattleMatch() then + Lobby.WakePrivateParty(controllerIndex) + end + end) + + -- Set up party UI and CRM + Lobby.SetPartyUIRoot(PartyUIRoot.MAIN_MENU) + menu.nextLocation = CRM.locations.MP_MOTD + CRM.OpenNextCRMWindow(menu) + menu:addEventHandler("gain_focus", CRM.OpenNextCRMWindow) + menu:addEventHandler("restore_focus", CRM.OpenNextCRMWindow) +end + +-- Post-load function to handle game battles and other settings +local PostLoadFunc = function(menu, controllerIndex, controller) + if GAMEBATTLES.ScheduleRefreshRequest then + GAMEBATTLES.ScheduleRefreshRequest = false + OpenGameBattlesLobby(controllerIndex) + else + local currentMatch = GAMEBATTLES.GetCurrentMatch(controllerIndex) + if currentMatch then + if GAMEBATTLES.MatchForfeitWinningTeamIndex ~= 0 then + GAMEBATTLES.ShowMatchForfeitPopup(controllerIndex, currentMatch, GAMEBATTLES.MatchForfeitWinningTeamIndex) + GAMEBATTLES.MatchForfeitWinningTeamIndex = 0 + else + local victoryInfo, progressInfo = GAMEBATTLES.GetMatchProgressInfo(currentMatch) + if progressInfo then + local alliesWins, axisWins, matchVictory = GAMEBATTLES.GetMatchVictoryInfo(currentMatch) + if not matchVictory then + LUI.FlowManager.RequestPopupMenu(menu, "MLGGamebattlesMatchResultsPopup", false, controllerIndex, false, { + controllerIndex = controllerIndex, + gbMatch = currentMatch, + alliesWins = alliesWins, + axisWins = axisWins + }) + end + else + local dsAcquisitionState = MLG.GetGameBattleDSAcquisitionState(controllerIndex) + if dsAcquisitionState == GAMEBATTLES.MLG_DS_ACQUISITION_STATE.COULD_NOT_ACQUIRE or dsAcquisitionState == GAMEBATTLES.MLG_DS_ACQUISITION_STATE.ACQUISITION_ERROR then + MLG.ResetGameBattleDSAcquisitionState() + LUI.FlowManager.RequestPopupMenu(menu, "MLGGamebattlesMatchCancelledPopup", false, controllerIndex, false, { + matchID = currentMatch.matchId + }) + end + end + end + MLG.ResetGameBattleMatchId(controllerIndex) + end + end + + -- Additional setup and event handling + assert(menu.bindButton) + menu.isSignInMenu = true + menu.bindButton:addEventHandler("button_secondary", HandleBackButton) + menu:addEventHandler("menu_create", SetupMainMenu) + + -- Adjust UI elements based on various conditions + local adjustButtonDescription = function() + local _, top, _, bottom = menu.ButtonDescription:getLocalRect() + local buttonSpacing = menu.MPMainMenuButtons.buttonSpacing + menu.ButtonDescription:SetTop(top - buttonSpacing) + menu.ButtonDescription:SetBottom(bottom - buttonSpacing) + end + + if not CONDITIONS.IsGameBattlesAllowed() then + adjustButtonDescription() + end + + if not CODTV.IsCODTVEnabled() then + adjustButtonDescription() + end + + if not CONDITIONS.IsStoreAllowed(menu) then + adjustButtonDescription() + end + + if Engine.GetDvarFloat("r_filmGrainAtten") == 1 then + Engine.SetDvarFloat("r_filmGrainAtten", 0.25) + Engine.ExecNow("profile_setFilmGrain " .. tostring(0.25), controllerIndex) + end + + -- Handle NAT type warning + local natType = Lobby.GetNATType() + if natType then + if natType == "NETWORK_STRICT" and not Engine.GetDvarBool("strict_nat_warning_viewed") then + LUI.FlowManager.RequestPopupMenu(menu, "strict_nat_warning", true, controllerIndex, false, data) + Engine.SetDvarBool("strict_nat_warning_viewed", true) + end + menu:processEvent({ + name = "add_button_helper_text", + button_ref = "nat", + helper_text = Engine.Localize("NETWORK_YOURNATTYPE", natType), + side = "right", + clickable = false + }) + end + + Engine.SetDvarInt("lui_mc_numGamesFinishedInLobby", 0) + MissionDirector.PlayTeamMusic() + Engine.StopMenuVideo() + + -- Handle trial license popup + local scopedData = LUI.FlowManager.GetScopedData(menu) + if CONDITIONS.IsTrialLicense() and not scopedData.trialPopupShown then + scopedData.trialPopupShown = true + LUI.FlowManager.RequestPopupMenu(menu, "TrialFullWindow", true, controllerIndex, false) + end + + menu:addElement(Lobby.GetMPMapMaterialStreamer()) + LoadMainMenu(controllerIndex) +end + +function MPMainMenu(menu, controller) + local self = LUI.UIHorizontalNavigator.new() + self.id = "MPMainMenu" + + -- Determine controller index + local controllerIndex = controller and controller.controllerIndex + if not controllerIndex and not Engine.InFrontend() then + controllerIndex = self:getRootController() + end + assert(controllerIndex) + + -- Initialize the main menu + InitializeMainMenu(self, controllerIndex, controller) + self:playSound("menu_open") + + -- Helper bar + local HelperBar = MenuBuilder.BuildRegisteredType("ButtonHelperBar", { + controllerIndex = controllerIndex + }) + HelperBar.id = "HelperBar" + HelperBar:SetAnchorsAndPosition(0, 0, 1, 0, 0, 0, _1080p * -85, 0) + self:addElement(HelperBar) + self.HelperBar = HelperBar + + -- Button description + local ButtonDescription = MenuBuilder.BuildRegisteredType("ButtonDescriptionText", { + controllerIndex = controllerIndex + }) + ButtonDescription.id = "ButtonDescription" + ButtonDescription.Description:SetRight(_1080p * 415, 0) + ButtonDescription:SetAnchorsAndPosition(0, 1, 0, 1, _1080p * 130, _1080p * 645, _1080p * 594, _1080p * 694) + self:addElement(ButtonDescription) + self.ButtonDescription = ButtonDescription + + -- Social feed + local SocialFeed = MenuBuilder.BuildRegisteredType("SocialFeed", { + controllerIndex = controllerIndex + }) + SocialFeed.id = "SocialFeed" + SocialFeed:SetAnchorsAndPosition(0, 1, 0, 1, 0, _1080p * 1920, _1080p * 965, _1080p * 995) + self:addElement(SocialFeed) + self.SocialFeed = SocialFeed + + -- Main menu buttons + local MPMainMenuButtons = MenuBuilder.BuildRegisteredType("MPMainMenuButtons", { + controllerIndex = controllerIndex + }) + MPMainMenuButtons.id = "MPMainMenuButtons" + MPMainMenuButtons:SetAnchorsAndPosition(0, 1, 0, 1, _1080p * 130, _1080p * 630, _1080p * 360, _1080p * 564) + self:addElement(MPMainMenuButtons) + self.MPMainMenuButtons = MPMainMenuButtons + + -- Friends widget + local FriendsElement = MenuBuilder.BuildRegisteredType("online_friends_widget", { + controllerIndex = controllerIndex + }) + FriendsElement.id = "FriendsElement" + FriendsElement:SetFont(FONTS.GetFont(FONTS.Dev.File)) + FriendsElement:SetAlignment(LUI.Alignment.Left) + FriendsElement:SetAnchorsAndPosition(0, 1, 0, 1, _1080p * 1420, _1080p * 1920, _1080p * 1026, _1080p * 1071) + self:addElement(FriendsElement) + self.FriendsElement = FriendsElement + + -- Lobby members list + local LobbyMembers = MenuBuilder.BuildRegisteredType("LobbyMembers", { + controllerIndex = controllerIndex + }) + LobbyMembers.id = "LobbyMembers" + LobbyMembers:SetAnchorsAndPosition(1, 0, 0, 1, _1080p * -700, 0, _1080p * 273, _1080p * 917) + self:addElement(LobbyMembers) + self.LobbyMembers = LobbyMembers + + -- COD logo + local CODLogo = LUI.UIImage.new() + CODLogo.id = "CODLogo" + CODLogo:setImage(RegisterMaterial("cod_logo"), 0) + CODLogo:SetAnchorsAndPosition(0, 0, 0, 0, _1080p * 108, _1080p * -1272, _1080p * 120, _1080p * -825) + self:addElement(CODLogo) + self.CODLogo = CODLogo + + -- Menu title + local MenuTitle = LUI.UIStyledText.new() + MenuTitle.id = "MenuTitle" + MenuTitle:setText(ToUpperCase(Engine.Localize("MENU_MULTIPLAYER")), 0) + MenuTitle:SetFontSize(50 * _1080p) + MenuTitle:SetFont(FONTS.GetFont(FONTS.MainMedium.File)) + MenuTitle:SetAlignment(LUI.Alignment.Left) + MenuTitle:SetStartupDelay(1250) + MenuTitle:SetLineHoldTime(400) + MenuTitle:SetAnimMoveTime(300) + MenuTitle:SetEndDelay(1000) + MenuTitle:SetCrossfadeTime(500) + MenuTitle:SetAutoScrollStyle(LUI.UIStyledText.AutoScrollStyle.ScrollH) + MenuTitle:SetMaxVisibleLines(1) + MenuTitle:SetDecodeLetterLength(25) + MenuTitle:SetDecodeMaxRandChars(3) + MenuTitle:SetDecodeUpdatesPerLetter(4) + MenuTitle:SetAnchorsAndPosition(0, 1, 0, 1, _1080p * 130, _1080p * 660, _1080p * 296.5, _1080p * 346.5) + self:addElement(MenuTitle) + self.MenuTitle = MenuTitle + + -- Double XP notifications + local DoubleXPNotifications = MenuBuilder.BuildRegisteredType("DoubleXPNotifications", { + controllerIndex = controllerIndex + }) + DoubleXPNotifications.id = "DoubleXPNotifications" + DoubleXPNotifications:SetScale(-0.5, 0) + DoubleXPNotifications:SetAnchorsAndPosition(0.5, 0.5, 0, 1, _1080p * -370, _1080p * -114, _1080p * 104, _1080p * 232) + self:addElement(DoubleXPNotifications) + self.DoubleXPNotifications = DoubleXPNotifications + + -- Button helper function + self.addButtonHelperFunction = function(arg0, arg1) + arg0:AddButtonHelperText({ + helper_text = Engine.Localize("LUA_MENU_SELECT"), + button_ref = "button_primary", + side = "left", + clickable = true + }) + arg0:AddButtonHelperText({ + helper_text = Engine.Localize("MENU_BACK"), + button_ref = "button_secondary", + side = "left", + priority = 1, + clickable = true + }) + arg0:AddButtonHelperText({ + helper_text = Engine.Localize("LUA_MENU_OPTIONS_CAPS"), + button_ref = "button_start", + side = "left", + priority = 4, + clickable = true + }) + end + + self:addEventHandler("menu_create", self.addButtonHelperFunction) + + -- Bind button handler + local bindButton = LUI.UIBindButton.new() + bindButton.id = "selfBindButton" + self:addElement(bindButton) + self.bindButton = bindButton + + self.bindButton:addEventHandler("button_start", function(arg0, arg1) + ACTIONS.OpenMenu("OptionsMenu", true, arg1.controller or controllerIndex) + end) + + PostLoadFunc(self, controllerIndex, controller) + return self +end + +MenuBuilder.m_types["MPMainMenu"] = MPMainMenu +LUI.FlowManager.RegisterStackPushBehaviour( "MPMainMenu", PushFunc ) \ No newline at end of file diff --git a/data/cdata/ui_scripts/MainMenu/__init__.lua b/data/cdata/ui_scripts/MainMenu/__init__.lua index 01a7841a..a3e8ffb6 100644 --- a/data/cdata/ui_scripts/MainMenu/__init__.lua +++ b/data/cdata/ui_scripts/MainMenu/__init__.lua @@ -3,7 +3,8 @@ if not Engine.InFrontend() then end require("CampaignMenuButtons") -require("CPMainMenu") require("CPMainMenuButtons") +require("CPMainMenu") require("MissionsVerticalLayout") require("MPMainMenuButtons") +require("MPMainMenu") diff --git a/data/cdata/ui_scripts/Mods/ModSelectButton.lua b/data/cdata/ui_scripts/Mods/ModSelectButton.lua index 71150b2d..f2238b7b 100644 --- a/data/cdata/ui_scripts/Mods/ModSelectButton.lua +++ b/data/cdata/ui_scripts/Mods/ModSelectButton.lua @@ -31,163 +31,163 @@ local function PostLoadFunc(buttonElement, controllerIndex, controller) end function ModSelectButton(menu, controller) - local modSelectButton = LUI.UIButton.new() - modSelectButton:SetAnchorsAndPosition(0, 1, 0, 1, 0, 500 * _1080p, 0, 30 * _1080p) - modSelectButton.id = "ModSelectButton" - modSelectButton._animationSets = {} - modSelectButton._sequences = {} + local ModSelectButton = LUI.UIButton.new() + ModSelectButton:SetAnchorsAndPosition(0, 1, 0, 1, 0, 500 * _1080p, 0, 30 * _1080p) + ModSelectButton.id = "ModSelectButton" + ModSelectButton._animationSets = {} + ModSelectButton._sequences = {} local controllerIndex = controller and controller.controllerIndex if not controllerIndex and not Engine.InFrontend() then - controllerIndex = modSelectButton:getRootController() + controllerIndex = ModSelectButton:getRootController() end assert(controllerIndex) - local buttonContainer = modSelectButton - local genericButton = nil + local buttonContainer = ModSelectButton + local GenericButton = nil - genericButton = MenuBuilder.BuildRegisteredType("GenericButton", { + GenericButton = MenuBuilder.BuildRegisteredType("GenericButton", { controllerIndex = controllerIndex }) - genericButton.id = "GenericButton" - genericButton:SetAlpha(0, 0) - genericButton:SetAnchorsAndPosition(0, 1, 0, 0, 0, _1080p * 500, 0, 0) + GenericButton.id = "GenericButton" + GenericButton:SetAlpha(0, 0) + GenericButton:SetAnchorsAndPosition(0, 1, 0, 0, 0, _1080p * 500, 0, 0) - genericButton:SubscribeToModelThroughElement(modSelectButton, "buttonLabel", function() - local dataSource = modSelectButton:GetDataSource() + GenericButton:SubscribeToModelThroughElement(ModSelectButton, "buttonLabel", function() + local dataSource = ModSelectButton:GetDataSource() local buttonLabel = dataSource.buttonLabel:GetValue(controllerIndex) if buttonLabel ~= nil then - genericButton.Text:setText(LocalizeString(ToUpperCase(buttonLabel)), 0) + GenericButton.Text:setText(LocalizeString(ToUpperCase(buttonLabel)), 0) end end) - modSelectButton:addElement(genericButton) - modSelectButton.GenericButton = genericButton + ModSelectButton:addElement(GenericButton) + ModSelectButton.GenericButton = GenericButton - local listButtonBackground = nil + local GenericListArrowButtonBackground = nil - listButtonBackground = MenuBuilder.BuildRegisteredType("GenericListArrowButtonBackground", { + GenericListArrowButtonBackground = MenuBuilder.BuildRegisteredType("GenericListArrowButtonBackground", { controllerIndex = controllerIndex }) - listButtonBackground.id = "GenericListButtonBackground" - listButtonBackground:SetAnchorsAndPosition(0, 0, 0, 0, 0, 0, 0, 0) + GenericListArrowButtonBackground.id = "GenericListButtonBackground" + GenericListArrowButtonBackground:SetAnchorsAndPosition(0, 0, 0, 0, 0, 0, 0, 0) - modSelectButton:addElement(listButtonBackground) - modSelectButton.GenericListButtonBackground = listButtonBackground + ModSelectButton:addElement(GenericListArrowButtonBackground) + ModSelectButton.GenericListButtonBackground = GenericListArrowButtonBackground - local buttonText = nil + local Text = nil - buttonText = LUI.UIStyledText.new() - buttonText.id = "Text" - buttonText:SetRGBFromInt(14277081, 0) - buttonText:SetFontSize(22 * _1080p) - buttonText:SetFont(FONTS.GetFont(FONTS.MainMedium.File)) - buttonText:SetAlignment(LUI.Alignment.Left) - buttonText:SetStartupDelay(2000) - buttonText:SetLineHoldTime(400) - buttonText:SetAnimMoveTime(300) - buttonText:SetEndDelay(1500) - buttonText:SetCrossfadeTime(750) - buttonText:SetAutoScrollStyle(LUI.UIStyledText.AutoScrollStyle.ScrollH) - buttonText:SetMaxVisibleLines(1) - buttonText:SetOutlineRGBFromInt(0, 0) - buttonText:SetAnchorsAndPosition(0, 0, 0.5, 0.5, _1080p * 44, _1080p * -41, _1080p * -11, _1080p * 11) + Text = LUI.UIStyledText.new() + Text.id = "Text" + Text:SetRGBFromInt(14277081, 0) + Text:SetFontSize(22 * _1080p) + Text:SetFont(FONTS.GetFont(FONTS.MainMedium.File)) + Text:SetAlignment(LUI.Alignment.Left) + Text:SetStartupDelay(2000) + Text:SetLineHoldTime(400) + Text:SetAnimMoveTime(300) + Text:SetEndDelay(1500) + Text:SetCrossfadeTime(750) + Text:SetAutoScrollStyle(LUI.UIStyledText.AutoScrollStyle.ScrollH) + Text:SetMaxVisibleLines(1) + Text:SetOutlineRGBFromInt(0, 0) + Text:SetAnchorsAndPosition(0, 0, 0.5, 0.5, _1080p * 44, _1080p * -41, _1080p * -11, _1080p * 11) - buttonText:SubscribeToModelThroughElement(modSelectButton, "buttonLabel", function() - local dataSource = modSelectButton:GetDataSource() + Text:SubscribeToModelThroughElement(ModSelectButton, "buttonLabel", function() + local dataSource = ModSelectButton:GetDataSource() local buttonLabel = dataSource.buttonLabel:GetValue(controllerIndex) if buttonLabel ~= nil then - buttonText:setText(LocalizeString(ToUpperCase(buttonLabel)), 0) + Text:setText(LocalizeString(ToUpperCase(buttonLabel)), 0) end end) - modSelectButton:addElement(buttonText) - modSelectButton.Text = buttonText + ModSelectButton:addElement(Text) + ModSelectButton.Text = Text - local lockIcon = nil + local Lock = nil - lockIcon = LUI.UIImage.new() - lockIcon.id = "Lock" - lockIcon:SetRGBFromTable(SWATCHES.genericButton.textDisabled, 0) - lockIcon:SetAlpha(0, 0) - lockIcon:setImage(RegisterMaterial("icon_slot_locked"), 0) - lockIcon:SetAnchorsAndPosition(1, 0, 0.5, 0.5, _1080p * -32, _1080p * -6, _1080p * -12, _1080p * 14) + Lock = LUI.UIImage.new() + Lock.id = "Lock" + Lock:SetRGBFromTable(SWATCHES.genericButton.textDisabled, 0) + Lock:SetAlpha(0, 0) + Lock:setImage(RegisterMaterial("icon_slot_locked"), 0) + Lock:SetAnchorsAndPosition(1, 0, 0.5, 0.5, _1080p * -32, _1080p * -6, _1080p * -12, _1080p * 14) - modSelectButton:addElement(lockIcon) - modSelectButton.Lock = lockIcon + ModSelectButton:addElement(Lock) + ModSelectButton.Lock = Lock - modSelectButton._animationSets.DefaultAnimationSet = function() - modSelectButton._sequences.DefaultSequence = function() + ModSelectButton._animationSets.DefaultAnimationSet = function() + ModSelectButton._sequences.DefaultSequence = function() end - buttonText:RegisterAnimationSequence("ButtonOver", {{function() - return modSelectButton.Text:SetRGBFromInt(0, 0) + Text:RegisterAnimationSequence("ButtonOver", {{function() + return ModSelectButton.Text:SetRGBFromInt(0, 0) end}, {function() - return modSelectButton.Text:SetAlpha(1, 0) + return ModSelectButton.Text:SetAlpha(1, 0) end}}) - lockIcon:RegisterAnimationSequence("ButtonOver", {{function() - return modSelectButton.Lock:SetAlpha(0, 0) + Lock:RegisterAnimationSequence("ButtonOver", {{function() + return ModSelectButton.Lock:SetAlpha(0, 0) end}, {function() - return modSelectButton.Lock:SetRGBFromTable(SWATCHES.genericButton.textDisabled, 0) + return ModSelectButton.Lock:SetRGBFromTable(SWATCHES.genericButton.textDisabled, 0) end}}) - modSelectButton._sequences.ButtonOver = function() - buttonText:AnimateSequence("ButtonOver") - lockIcon:AnimateSequence("ButtonOver") + ModSelectButton._sequences.ButtonOver = function() + Text:AnimateSequence("ButtonOver") + Lock:AnimateSequence("ButtonOver") end - buttonText:RegisterAnimationSequence("ButtonUp", {{function() - return modSelectButton.Text:SetRGBFromInt(14277081, 0) + Text:RegisterAnimationSequence("ButtonUp", {{function() + return ModSelectButton.Text:SetRGBFromInt(14277081, 0) end}}) - lockIcon:RegisterAnimationSequence("ButtonUp", {{function() - return modSelectButton.Lock:SetAlpha(0, 0) + Lock:RegisterAnimationSequence("ButtonUp", {{function() + return ModSelectButton.Lock:SetAlpha(0, 0) end}}) - modSelectButton._sequences.ButtonUp = function() - buttonText:AnimateSequence("ButtonUp") - lockIcon:AnimateSequence("ButtonUp") + ModSelectButton._sequences.ButtonUp = function() + Text:AnimateSequence("ButtonUp") + Lock:AnimateSequence("ButtonUp") end - buttonText:RegisterAnimationSequence("ButtonOverDisabled", {{function() - return modSelectButton.Text:SetRGBFromInt(0, 0) + Text:RegisterAnimationSequence("ButtonOverDisabled", {{function() + return ModSelectButton.Text:SetRGBFromInt(0, 0) end}, {function() - return modSelectButton.Text:SetAlpha(1, 0) + return ModSelectButton.Text:SetAlpha(1, 0) end}}) - lockIcon:RegisterAnimationSequence("ButtonOverDisabled", {{function() - return modSelectButton.Lock:SetAlpha(1, 0) + Lock:RegisterAnimationSequence("ButtonOverDisabled", {{function() + return ModSelectButton.Lock:SetAlpha(1, 0) end}, {function() - return modSelectButton.Lock:SetRGBFromInt(0, 0) + return ModSelectButton.Lock:SetRGBFromInt(0, 0) end}}) - modSelectButton._sequences.ButtonOverDisabled = function() - buttonText:AnimateSequence("ButtonOverDisabled") - lockIcon:AnimateSequence("ButtonOverDisabled") + ModSelectButton._sequences.ButtonOverDisabled = function() + Text:AnimateSequence("ButtonOverDisabled") + Lock:AnimateSequence("ButtonOverDisabled") end - buttonText:RegisterAnimationSequence("ButtonUpDisabled", {{function() - return modSelectButton.Text:SetRGBFromInt(14277081, 0) + Text:RegisterAnimationSequence("ButtonUpDisabled", {{function() + return ModSelectButton.Text:SetRGBFromInt(14277081, 0) end}}) - lockIcon:RegisterAnimationSequence("ButtonUpDisabled", {{function() - return modSelectButton.Lock:SetAlpha(1, 0) + Lock:RegisterAnimationSequence("ButtonUpDisabled", {{function() + return ModSelectButton.Lock:SetAlpha(1, 0) end}, {function() - return modSelectButton.Lock:SetRGBFromInt(12566463, 0) + return ModSelectButton.Lock:SetRGBFromInt(12566463, 0) end}}) - modSelectButton._sequences.ButtonUpDisabled = function() - buttonText:AnimateSequence("ButtonUpDisabled") - lockIcon:AnimateSequence("ButtonUpDisabled") + ModSelectButton._sequences.ButtonUpDisabled = function() + Text:AnimateSequence("ButtonUpDisabled") + Lock:AnimateSequence("ButtonUpDisabled") end end - modSelectButton._animationSets.DefaultAnimationSet() - PostLoadFunc(modSelectButton, controllerIndex, controller) - return modSelectButton + ModSelectButton._animationSets.DefaultAnimationSet() + PostLoadFunc(ModSelectButton, controllerIndex, controller) + return ModSelectButton end MenuBuilder.registerType("ModSelectButton", ModSelectButton) \ No newline at end of file