From e9ef9356e0594f93e18e91eca08cdbd2eb4c72a1 Mon Sep 17 00:00:00 2001 From: Jbleezy Date: Sat, 6 Apr 2024 02:05:20 -0700 Subject: [PATCH] Controls menu: rename action slots --- README.md | 2 +- english/localizedstrings/reimagined.str | 12 +- ui/t6/menus/optionscontrols.lua | 549 ++++++++++++++++++++++++ 3 files changed, 559 insertions(+), 4 deletions(-) create mode 100644 ui/t6/menus/optionscontrols.lua diff --git a/README.md b/README.md index a7b32701..92b77243 100644 --- a/README.md +++ b/README.md @@ -271,7 +271,7 @@ * No longer receives additional damage from Boomhilda or Ray Gun Mark 2 ## Weapons -* Switch to melee weapon by pressing the Previous Scorestreak button (same button as the Time Bomb and Maxis Drone) +* Switch to melee weapon by pressing the Melee Weapon button (same button as Time Bomb and Maxis Drone) * Fixed world model position of certain melee weapons * Grenades: improved projectile upward speed * Grenades: can no longer be thrown faster than intended by throwing a grenade right after throwing one diff --git a/english/localizedstrings/reimagined.str b/english/localizedstrings/reimagined.str index e5379265..f8d604ce 100644 --- a/english/localizedstrings/reimagined.str +++ b/english/localizedstrings/reimagined.str @@ -32,7 +32,7 @@ REFERENCE ZMUI_ZMEAT_PRO LANG_ENGLISH "Meat Pro" REFERENCE ZMUI_PRO_DESC -LANG_ENGLISH "No Mystery Box, No Pack-a-Punch, and limited sprint." +LANG_ENGLISH "No Mystery Box, no Pack-a-Punch, and limited sprint." REFERENCE ZMUI_ZCLASSIC LANG_ENGLISH "Tranzit" @@ -76,6 +76,12 @@ LANG_ENGLISH "Griefs" REFERENCE MPUI_KILLS_DENIED LANG_ENGLISH "Stuns" +REFERENCE MENU_MELEE_WEAPON_CAPS +LANG_ENGLISH "MELEE WEAPON" + +REFERENCE MENU_PLACEABLE_MINE_CAPS +LANG_ENGLISH "PLACEABLE MINE" + REFERENCE CGAME_QUAKE_SUICIDE LANG_ENGLISH "" @@ -124,10 +130,10 @@ REFERENCE ZOMBIE_POWERUP_CLIP_EMPTY LANG_ENGLISH "Clip Empty!" REFERENCE ZOMBIE_ONLY_CHANGE_TEAMS_UNBALANCED -LANG_ENGLISH "Can only change teams if unbalanced." +LANG_ENGLISH "Can only change teams if unbalanced" REFERENCE ZOMBIE_WAITING_FOR_TEAM_CHANGE -LANG_ENGLISH "Waiting for other player to change teams." +LANG_ENGLISH "Waiting for other player to change teams" REFERENCE ZOMBIE_WAITING_FOR_MORE_PLAYER_CAPS LANG_ENGLISH "WAITING FOR &&1 MORE PLAYER [&&2/&&3]" diff --git a/ui/t6/menus/optionscontrols.lua b/ui/t6/menus/optionscontrols.lua new file mode 100644 index 00000000..951ac250 --- /dev/null +++ b/ui/t6/menus/optionscontrols.lua @@ -0,0 +1,549 @@ +require("T6.KeyBindSelector") +require("T6.ButtonLayoutOptions") +require("T6.StickLayoutOptions") + +CoD.OptionsControls = {} +CoD.OptionsControls.CurrentTabIndex = nil + +CoD.OptionsControls.Button_AddChoices_LookSensitivity = function(sensitivities) + sensitivities.strings = { + Engine.Localize("MENU_SENSITIVITY_VERY_LOW_CAPS"), + Engine.Localize("MENU_SENSITIVITY_LOW_CAPS"), + "3", + Engine.Localize("MENU_SENSITIVITY_MEDIUM_CAPS"), + "5", + "6", + "7", + Engine.Localize("MENU_SENSITIVITY_HIGH_CAPS"), + "9", + "10", + Engine.Localize("MENU_SENSITIVITY_VERY_HIGH_CAPS"), + "12", + "13", + Engine.Localize("MENU_SENSITIVITY_INSANE_CAPS"), + } + sensitivities.values = { + CoD.SENSITIVITY_1, + CoD.SENSITIVITY_2, + CoD.SENSITIVITY_3, + CoD.SENSITIVITY_4, + CoD.SENSITIVITY_5, + CoD.SENSITIVITY_6, + CoD.SENSITIVITY_7, + CoD.SENSITIVITY_8, + CoD.SENSITIVITY_9, + CoD.SENSITIVITY_10, + CoD.SENSITIVITY_11, + CoD.SENSITIVITY_12, + CoD.SENSITIVITY_13, + CoD.SENSITIVITY_14, + } + CoD.Options.Button_AddChoices(sensitivities) +end + +CoD.OptionsControls.Button_AddChoices_InvertMouse = function(lookTabButtonList, LocalClientIndex) + lookTabButtonList:addChoice(LocalClientIndex, Engine.Localize("MENU_NO_CAPS"), 0.02) + lookTabButtonList:addChoice(LocalClientIndex, Engine.Localize("MENU_YES_CAPS"), -0.02) +end + +CoD.OptionsControls.Callback_GamepadSelector = function(gamepadEnabled, client) + if client then + Engine.SetHardwareProfileValue(gamepadEnabled.parentSelectorButton.m_profileVarName, gamepadEnabled.value) + if gamepadEnabled.value == 1 then + Dvar.gpad_enabled:set(true) + Engine.Exec(0, "execcontrollerbindings") + else + Dvar.gpad_enabled:set(false) + end + end +end + +CoD.OptionsControls.Button_AddChoices_Gamepad = function(gamepadButtonList) + gamepadButtonList:addChoice(Engine.Localize("MENU_DISABLED_CAPS"), 0, nil, CoD.OptionsControls.Callback_GamepadSelector) + gamepadButtonList:addChoice(Engine.Localize("MENU_ENABLED_CAPS"), 1, nil, CoD.OptionsControls.Callback_GamepadSelector) +end + +CoD.OptionsControls.AddKeyBindingElements = function(localClientIndex, buttonList, keyCommandsAndLabels) + for Key, keyCommandAndLabel in ipairs(keyCommandsAndLabels) do + if keyCommandAndLabel.command == "break" then + buttonList:addSpacer(CoD.CoD9Button.Height / 2) + else + if keyCommandAndLabel.hint ~= nil then + buttonList:addKeyBindSelector(localClientIndex, Engine.Localize(keyCommandAndLabel.label), keyCommandAndLabel.command, CoD.BIND_PLAYER, keyCommandAndLabel.hint) + else + buttonList:addKeyBindSelector(localClientIndex, Engine.Localize(keyCommandAndLabel.label), keyCommandAndLabel.command, CoD.BIND_PLAYER) + end + end + end +end + +CoD.OptionsControls.Button_AddChoices_YesOrNo = function(lookTabButtonList, LocalClientIndex) + lookTabButtonList.strings = { + Engine.Localize("MENU_NO_CAPS"), + Engine.Localize("MENU_YES_CAPS"), + } + lookTabButtonList.values = { + 0, + 1, + } + CoD.OptionsControls.Button_AddChoices(lookTabButtonList, LocalClientIndex) +end + +CoD.OptionsControls.Button_AddChoices = function(lookTabButtonList, LocalClientIndex) + if lookTabButtonList.strings == nil or #lookTabButtonList.strings == 0 then + return + end + for StringIndex = 1, #lookTabButtonList.strings, 1 do + lookTabButtonList:addChoice(LocalClientIndex, lookTabButtonList.strings[StringIndex], lookTabButtonList.values[StringIndex]) + end +end + +CoD.OptionsControls.CreateLookTab = function(lookTab, localClientIndex) + local lookTabContainer = LUI.UIContainer.new() + local lookTabButtonList = CoD.Options.CreateButtonList() + lookTab.buttonList = lookTabButtonList + lookTabContainer:addElement(lookTabButtonList) + CoD.OptionsControls.AddKeyBindingElements(localClientIndex, lookTabButtonList, { + { + command = "+leanleft", + label = "MENU_LEAN_LEFT_CAPS", + }, + { + command = "+leanright", + label = "MENU_LEAN_RIGHT_CAPS", + }, + { + command = "+lookup", + label = "MENU_LOOK_UP_CAPS", + }, + { + command = "+lookdown", + label = "MENU_LOOK_DOWN_CAPS", + }, + { + command = "+left", + label = "MENU_TURN_LEFT_CAPS", + }, + { + command = "+right", + label = "MENU_TURN_RIGHT_CAPS", + }, + { + command = "+mlook", + label = "MENU_MOUSE_LOOK_CAPS", + }, + { + command = "centerview", + label = "MENU_CENTER_VIEW_CAPS", + }, + }) + lookTabButtonList:addSpacer(CoD.CoD9Button.Height / 2) + CoD.OptionsControls.Button_AddChoices_InvertMouse(lookTabButtonList:addDvarLeftRightSelector(localClientIndex, Engine.Localize("MENU_INVERT_MOUSE_CAPS"), "m_pitch"), localClientIndex) + CoD.OptionsControls.Button_AddChoices_YesOrNo(lookTabButtonList:addDvarLeftRightSelector(localClientIndex, Engine.Localize("MENU_FREE_LOOK_CAPS"), "cl_freelook"), localClientIndex) + local MouseSensitivityOptions = lookTabButtonList:addProfileLeftRightSlider(localClientIndex, Engine.Localize("MENU_MOUSE_SENSITIVITY_CAPS"), "mouseSensitivity", 0.01, 30, "Use the left and right arrow keys for more precise adjustments.", nil, nil, CoD.Options.AdjustSFX) + MouseSensitivityOptions:setNumericDisplayFormatString("%.2f") + MouseSensitivityOptions:setRoundToFraction(0.5) + MouseSensitivityOptions:setBarSpeed(0.01) + return lookTabContainer +end + +CoD.OptionsControls.CreateMoveTab = function(moveTab, localClientIndex) + local moveTabContainer = LUI.UIContainer.new() + local moveTabButtonList = CoD.Options.CreateButtonList() + moveTab.buttonList = moveTabButtonList + moveTabContainer:addElement(moveTabButtonList) + CoD.OptionsControls.AddKeyBindingElements(localClientIndex, moveTabButtonList, { + { + command = "+forward", + label = "MENU_FORWARD_CAPS", + }, + { + command = "+back", + label = "MENU_BACKPEDAL_CAPS", + }, + { + command = "+moveleft", + label = "MENU_MOVE_LEFT_CAPS", + }, + { + command = "+moveright", + label = "MENU_MOVE_RIGHT_CAPS", + }, + { + command = "break", + }, + { + command = "+gostand", + label = "MENU_STANDJUMP_CAPS", + }, + { + command = "gocrouch", + label = "MENU_GO_TO_CROUCH_CAPS", + }, + { + command = "goprone", + label = "MENU_GO_TO_PRONE_CAPS", + }, + { + command = "togglecrouch", + label = "MENU_TOGGLE_CROUCH_CAPS", + }, + { + command = "toggleprone", + label = "MENU_TOGGLE_PRONE_CAPS", + }, + { + command = "+movedown", + label = "MENU_CROUCH_CAPS", + }, + { + command = "+prone", + label = "MENU_PRONE_CAPS", + }, + { + command = "break", + }, + { + command = "+stance", + label = "PLATFORM_CHANGE_STANCE_CAPS", + }, + { + command = "+strafe", + label = "MENU_STRAFE_CAPS", + }, + }) + return moveTabContainer +end + +CoD.OptionsControls.CreateCombatTab = function(combatTab, localClientIndex) + local combatTabContainer = LUI.UIContainer.new() + local combatTabButtonList = CoD.Options.CreateButtonList() + combatTab.buttonList = combatTabButtonList + combatTabContainer:addElement(combatTabButtonList) + CoD.OptionsControls.AddKeyBindingElements(localClientIndex, combatTabButtonList, { + { + command = "+attack", + label = "MENU_ATTACK_CAPS", + }, + { + command = "+speed_throw", + label = "MENU_AIM_DOWN_THE_SIGHT_CAPS", + }, + { + command = "+toggleads_throw", + label = "MENU_TOGGLE_AIM_DOWN_THE_SIGHT_CAPS", + }, + { + command = "+melee", + label = "MENU_MELEE_ATTACK_CAPS", + }, + { + command = "+weapnext_inventory", + label = "PLATFORM_SWITCH_WEAPON_CAPS", + }, + { + command = "weapprev", + label = "PLATFORM_NEXT_WEAPON_CAPS", + }, + { + command = "+reload", + label = "MENU_RELOAD_WEAPON_CAPS", + }, + { + command = "+sprint", + label = "MENU_SPRINT_CAPS", + }, + { + command = "+breath_sprint", + label = "MENU_SPRINT_HOLD_BREATH_CAPS", + }, + { + command = "+holdbreath", + label = "MENU_STEADY_SNIPER_RIFLE_CAPS", + }, + { + command = "+frag", + label = "PLATFORM_THROW_PRIMARY_CAPS", + }, + { + command = "+smoke", + label = "PLATFORM_THROW_SECONDARY_CAPS", + }, + }) + return combatTabContainer +end + +CoD.OptionsControls.CreateInteractTab = function(interactTab, localClientIndex) + local interactTabContainer = LUI.UIContainer.new() + local interactTabButtonList = CoD.Options.CreateButtonList() + interactTab.buttonList = interactTabButtonList + interactTabContainer:addElement(interactTabButtonList) + local interactTabContents = {} + if CoD.isZombie then + interactTabContents = { + { + command = "+activate", + label = "MENU_USE_CAPS", + }, + { + command = "break", + }, + { + command = "+actionslot 3", + label = "PLATFORM_ACTIONSLOT_3", + }, + { + command = "+actionslot 1", + label = "MENU_EQUIPMENT_CAPS", + }, + { + command = "+actionslot 2", + label = "MENU_MELEE_WEAPON_CAPS", + }, + { + command = "+actionslot 4", + label = "MENU_PLACEABLE_MINE_CAPS", + }, + { + command = "break", + }, + { + command = "screenshotjpeg", + label = "MENU_SCREENSHOT_CAPS", + }, + } + elseif CoD.isMultiplayer then + interactTabContents = { + { + command = "+activate", + label = "MENU_USE_CAPS", + }, + { + command = "break", + }, + { + command = "+actionslot 3", + label = "PLATFORM_ACTIONSLOT_3", + }, + { + command = "+actionslot 1", + label = "PLATFORM_NEXT_SCORE_STREAK_CAPS", + }, + { + command = "+actionslot 2", + label = "PLATFORM_PREVIOUS_SCORE_STREAK_CAPS", + }, + { + command = "+actionslot 4", + label = "PLATFORM_ACTIVATE_SCORE_STREAK_CAPS", + }, + { + command = "break", + }, + { + command = "screenshotjpeg", + label = "MENU_SCREENSHOT_CAPS", + }, + } + end + table.insert(interactTabContents, { + command = "chooseclass_hotkey", + label = "MPUI_CHOOSE_CLASS_CAPS", + }) + table.insert(interactTabContents, { + command = "+scores", + label = "PLATFORM_SCOREBOARD_CAPS", + }) + table.insert(interactTabContents, { + command = "togglescores", + label = "PLATFORM_SCOREBOARD_TOGGLE_CAPS", + }) + table.insert(interactTabContents, { + command = "break", + }) + table.insert(interactTabContents, { + command = "+talk", + label = "MENU_VOICE_CHAT_BUTTON_CAPS", + }) + table.insert(interactTabContents, { + command = "chatmodepublic", + label = "MENU_CHAT_CAPS", + }) + table.insert(interactTabContents, { + command = "chatmodeteam", + label = "MENU_TEAM_CHAT_CAPS", + }) + CoD.OptionsControls.AddKeyBindingElements(localClientIndex, interactTabButtonList, interactTabContents) + return interactTabContainer +end + +CoD.OptionsControls.CreateGamepadTab = function(gamepadTab, localClientIndex) + local gamepadButtonListContainer = LUI.UIContainer.new() + local gamepadButtonList = CoD.Options.CreateButtonList() + gamepadTab.buttonList = gamepadButtonList + gamepadButtonListContainer:addElement(gamepadButtonList) + CoD.OptionsControls.Button_AddChoices_Gamepad(gamepadButtonList:addHardwareProfileLeftRightSelector(Engine.Localize("PLATFORM_ENABLE_GAMEPAD_CAPS"), "gpad_enabled")) + if UIExpression.IsInGame() == 1 and UIExpression.DvarBool(nil, "sv_allowAimAssist") == 0 then + local targetAssistSelector = gamepadButtonList:addProfileLeftRightSelector(localClientIndex, Engine.Localize("MENU_TARGET_ASSIST_CAPS"), "somethingalwaysfalse", "Target Assist is disabled on this server.") + targetAssistSelector:lock() + CoD.Options.Button_AddChoices_EnabledOrDisabled(targetAssistSelector) + else + local targetAssistSelector = gamepadButtonList:addProfileLeftRightSelector(localClientIndex, Engine.Localize("MENU_TARGET_ASSIST_CAPS"), "input_targetAssist", Engine.Localize("MENU_TARGET_ASSIST_DESC")) + CoD.Options.Button_AddChoices_EnabledOrDisabled(targetAssistSelector) + end + CoD.Options.Button_AddChoices_EnabledOrDisabled(gamepadButtonList:addProfileLeftRightSelector(localClientIndex, Engine.Localize("MENU_LOOK_INVERSION_CAPS"), "input_invertpitch", Engine.Localize("MENU_LOOK_INVERSION_DESC"))) + CoD.Options.Button_AddChoices_EnabledOrDisabled(gamepadButtonList:addProfileLeftRightSelector(localClientIndex, Engine.Localize("PLATFORM_CONTROLLER_VIBRATION_CAPS"), "gpad_rumble", Engine.Localize("PLATFORM_CONTROLLER_VIBRATION_DESC"))) + if UIExpression.IsDemoPlaying(localClientIndex) ~= 0 then + local theaterButtonLayout = gamepadButtonList:addProfileLeftRightSelector(localClientIndex, Engine.Localize("MENU_THEATER_BUTTON_LAYOUT_CAPS"), "demo_controllerconfig", Engine.Localize("MENU_THEATER_BUTTON_LAYOUT_DESC")) + CoD.ButtonLayout.AddChoices(theaterButtonLayout, localClientIndex) + theaterButtonLayout:disableCycling() + theaterButtonLayout:registerEventHandler("button_action", CoD.OptionsControls.Button_ButtonLayout) + else + local gamepadThumbSticksOptions = gamepadButtonList:addProfileLeftRightSelector(localClientIndex, Engine.Localize("MENU_THUMBSTICK_LAYOUT_CAPS"), "gpad_sticksConfig", Engine.Localize("MENU_THUMBSTICK_LAYOUT_DESC")) + CoD.StickLayout.AddChoices(gamepadThumbSticksOptions) + gamepadThumbSticksOptions:disableCycling() + gamepadThumbSticksOptions:registerEventHandler("button_action", CoD.OptionsControls.Button_StickLayout) + local gamepadButtonsOptions = gamepadButtonList:addProfileLeftRightSelector(localClientIndex, Engine.Localize("MENU_BUTTON_LAYOUT_CAPS"), "gpad_buttonsConfig", Engine.Localize("MENU_BUTTON_LAYOUT_DESC")) + CoD.ButtonLayout.AddChoices(gamepadButtonsOptions, localClientIndex) + gamepadButtonsOptions:disableCycling() + gamepadButtonsOptions:registerEventHandler("button_action", CoD.OptionsControls.Button_ButtonLayout) + end + CoD.OptionsControls.Button_AddChoices_LookSensitivity(gamepadButtonList:addProfileLeftRightSelector(localClientIndex, Engine.Localize("MENU_LOOK_SENSITIVITY_CAPS"), "input_viewSensitivity", Engine.Localize("PLATFORM_LOOK_SENSITIVITY_DESC"))) + local GamepadDeadzoneMin = gamepadButtonList:addDvarLeftRightSlider(localClientIndex, "DEADZONE MAX", "gpad_stick_deadzone_max", 0.01, 1, "Stick maximum input threshold.") + GamepadDeadzoneMin:setNumericDisplayFormatString("%.2f") + GamepadDeadzoneMin:setRoundToFraction(0.01) + GamepadDeadzoneMin:setBarSpeed(0.20) + local FOVScaleSlider = gamepadButtonList:addDvarLeftRightSlider(localClientIndex, "DEADZONE MIN", "gpad_stick_deadzone_min", 0.2, 1, "Stick minimum input threshold. Lower values make the sticks more responsive to tiny movements.") + FOVScaleSlider:setNumericDisplayFormatString("%.2f") + FOVScaleSlider:setRoundToFraction(0.01) + FOVScaleSlider:setBarSpeed(0.20) + return gamepadButtonListContainer +end + +CoD.OptionsControls.TabChanged = function(controlsWidget, controlsTab) + controlsWidget.buttonList = controlsWidget.tabManager.buttonList + local child = controlsWidget.buttonList:getFirstChild() + while not child.m_focusable do + child = child:getNextSibling() + end + if child ~= nil then + child:processEvent({ + name = "gain_focus", + }) + end + CoD.OptionsControls.CurrentTabIndex = controlsTab.tabIndex +end + +CoD.OptionsControls.DefaultPopup_RestoreDefaultControls = function(defaultsPopup, client) + Engine.SetProfileVar(client.controller, "input_invertpitch", 0) + Engine.SetProfileVar(client.controller, "gpad_rumble", 1) + Engine.SetProfileVar(client.controller, "gpad_sticksConfig", CoD.THUMBSTICK_DEFAULT) + Engine.SetProfileVar(client.controller, "gpad_buttonsConfig", CoD.BUTTONS_DEFAULT) + Engine.SetProfileVar(client.controller, "input_viewSensitivity", CoD.SENSITIVITY_4) + Engine.SetProfileVar(client.controller, "mouseSensitivity", 5) + local defaultControlsConfig = "default_controls" + if CoD.isMultiplayer then + defaultControlsConfig = "default_mp_controls" + end + local language = Engine.GetLanguage() + if language then + defaultControlsConfig = defaultControlsConfig .. "_" .. language + end + Engine.ExecNow(client.controller, "exec " .. defaultControlsConfig) + Engine.Exec(client.controller, "execcontrollerbindings") + Dvar.gpad_stick_deadzone_max:set(0.01) + Dvar.gpad_stick_deadzone_min:set(0.2) + Engine.SyncHardwareProfileWithDvars() + defaultsPopup:goBack(client.controller) +end + +CoD.OptionsControls.OnFinishControls = function(menu, client) + Engine.Exec(client.controller, "updateMustHaveBindings") + if UIExpression.IsInGame() == 1 then + Engine.Exec(client.controller, "updateVehicleBindings") + end + if CoD.useController and Engine.LastInput_Gamepad() then + menu:dispatchEventToRoot({ + name = "input_source_changed", + controller = client.controller, + source = 0, + }) + else + menu:dispatchEventToRoot({ + name = "input_source_changed", + controller = client.controller, + source = 1, + }) + end +end + +CoD.OptionsControls.CloseMenu = function(menu, client) + CoD.OptionsControls.OnFinishControls(menu, client) + CoD.Options.CloseMenu(menu, client) +end + +CoD.OptionsControls.OpenDefaultPopup = function(popup, client) + local menu = popup:openMenu("SetDefaultControlsPopup", client.controller) + menu:registerEventHandler("confirm_action", CoD.OptionsControls.DefaultPopup_RestoreDefaultControls) + popup:close() +end + +CoD.OptionsControls.OpenButtonLayout = function(buttonLayout, client) + buttonLayout:saveState() + buttonLayout:openMenu("ButtonLayout", client.controller) + buttonLayout:close() +end + +CoD.OptionsControls.OpenStickLayout = function(stickLayout, client) + stickLayout:saveState() + stickLayout:openMenu("StickLayout", client.controller) + stickLayout:close() +end + +CoD.OptionsControls.Button_StickLayout = function(gamepadThumbSticksOptions, client) + gamepadThumbSticksOptions:dispatchEventToParent({ + name = "open_stick_layout", + controller = client.controller, + }) +end + +CoD.OptionsControls.Button_ButtonLayout = function(gamepadButtonsOptions, client) + gamepadButtonsOptions:dispatchEventToParent({ + name = "open_button_layout", + controller = client.controller, + }) +end + +LUI.createMenu.OptionsControlsMenu = function(localClientIndex) + local controlsWidget = nil + if UIExpression.IsInGame() == 1 then + controlsWidget = CoD.InGameMenu.New("OptionsControlsMenu", localClientIndex, Engine.Localize("MENU_CONTROLS_CAPS")) + else + controlsWidget = CoD.Menu.New("OptionsControlsMenu") + controlsWidget:addTitle(Engine.Localize("MENU_CONTROLS_CAPS"), LUI.Alignment.Center) + controlsWidget:addLargePopupBackground() + end + controlsWidget:setPreviousMenu("OptionsMenu") + controlsWidget:setOwner(localClientIndex) + controlsWidget:registerEventHandler("button_prompt_back", CoD.OptionsControls.Back) + controlsWidget:registerEventHandler("restore_default_controls", CoD.OptionsControls.RestoreDefaultControls) + controlsWidget:registerEventHandler("tab_changed", CoD.OptionsControls.TabChanged) + controlsWidget:registerEventHandler("open_button_layout", CoD.OptionsControls.OpenButtonLayout) + controlsWidget:registerEventHandler("open_stick_layout", CoD.OptionsControls.OpenStickLayout) + controlsWidget:registerEventHandler("open_default_popup", CoD.OptionsControls.OpenDefaultPopup) + controlsWidget:addSelectButton() + controlsWidget:addBackButton() + CoD.Options.AddResetPrompt(controlsWidget) + local controlsTabs = CoD.Options.SetupTabManager(controlsWidget, 800) + controlsTabs:addTab(localClientIndex, "MENU_LOOK_CAPS", CoD.OptionsControls.CreateLookTab) + controlsTabs:addTab(localClientIndex, "MENU_MOVE_CAPS", CoD.OptionsControls.CreateMoveTab) + controlsTabs:addTab(localClientIndex, "MENU_COMBAT_CAPS", CoD.OptionsControls.CreateCombatTab) + controlsTabs:addTab(localClientIndex, "MENU_INTERACT_CAPS", CoD.OptionsControls.CreateInteractTab) + controlsTabs:addTab(localClientIndex, "PLATFORM_GAMEPAD_CAPS", CoD.OptionsControls.CreateGamepadTab) + if CoD.OptionsControls.CurrentTabIndex then + controlsTabs:loadTab(localClientIndex, CoD.OptionsControls.CurrentTabIndex) + else + controlsTabs:refreshTab(localClientIndex) + end + return controlsWidget +end