< Summary

Class:InputController
Assembly:InputController
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/InputController/InputController.cs
Covered lines:109
Uncovered lines:89
Coverable lines:198
Total lines:698
Line coverage:55% (109 of 198)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
InputController()0%110100%
InputController()0%110100%
Update()0%7.586064.71%
Update_Trigger(...)0%506.7465052.89%
Update_Hold(...)0%101.921043.18%
Update_Measurable(...)0%7.017093.33%
Stop_Measurable(...)0%220100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/InputController/InputController.cs

#LineLine coverage
 1using DCL;
 2using System;
 3using System.Linq;
 4using TMPro;
 5using UnityEngine;
 6using UnityEngine.EventSystems;
 7using DCL.Configuration;
 8
 9/// <summary>
 10/// Mapping for Trigger actions
 11/// </summary>
 12public enum DCLAction_Trigger
 13{
 14    //Remember to explicitly assign the value to each entry so we minimize issues with serialization + conflicts
 15    CameraChange = 100,
 16    CursorUnlock = 101,
 17
 18    ToggleNavMap = 110,
 19    ToggleFriends = 120,
 20    CloseWindow = 121,
 21    ToggleWorldChat = 122,
 22    ToggleUIVisibility = 123,
 23    ToggleControlsHud = 124,
 24    ToggleSettings = 125,
 25    ToggleStartMenu = 126,
 26    ToggleVoiceChatRecording = 127,
 27    ToggleAvatarEditorHud = 128,
 28    ToggleQuestsPanelHud = 129,
 29    ToggleAvatarNamesHud = 130,
 30    TogglePlacesAndEventsHud = 131,
 31
 32    OpenExpressions = 200,
 33    Expression_Wave = 201,
 34    Expression_FistPump = 202,
 35    Expression_Robot = 203,
 36    Expression_RaiseHand = 204,
 37    Expression_Clap = 205,
 38    Expression_ThrowMoney = 206,
 39    Expression_SendKiss = 207,
 40    Expression_Dance = 208,
 41    Expression_Hohoho = 209,
 42    Expression_Snowfall = 210,
 43
 44    //Builder In World 4xx
 45    BuildEditModeChange = 408,
 46    BuildEditModeToggleUI = 409,
 47    BuildEditModeToggleEntityList = 410,
 48    BuildEditModeToggleCatalog = 411,
 49    BuildEditModeToggleSceneInfo = 412,
 50    BuildEditModeToggleChangeCamera = 413,
 51    BuildEditModeToggleControls = 414,
 52    BuildEditModeToggleSnapMode = 415,
 53    BuildEditModeUndoAction = 417,
 54    BuildEditModeRedoAction = 418,
 55    BuildEditModeQuickBar1 = 419,
 56    BuildEditModeQuickBar2 = 420,
 57    BuildEditModeQuickBar3 = 421,
 58    BuildEditModeQuickBar4 = 422,
 59    BuildEditModeQuickBar5 = 423,
 60    BuildEditModeQuickBar6 = 424,
 61    BuildEditModeQuickBar7 = 425,
 62    BuildEditModeQuickBar8 = 426,
 63    BuildEditModeQuickBar9 = 427,
 64    BuildEditModeDuplicate = 428,
 65    BuildEditModeTranslate = 429,
 66    BuildEditModeRotate = 430,
 67    BuildEditModeScale = 431,
 68    BuildEditModeDelete = 434,
 69    BuildEditModeFocusSelectedEntities = 435,
 70    BuildEditModeReset = 443,
 71    BuildEditHideSelectedEntities = 444,
 72    BuildEditShowAllEntities = 445,
 73    BuildEditModeResetCamera = 446,
 74    BuildEditModeZoomIn = 447,
 75    BuildEditModeZoomOut = 448
 76}
 77
 78/// <summary>
 79/// Mapping for hold actions
 80/// </summary>
 81public enum DCLAction_Hold
 82{
 83    //Remember to explicitly assign the value to each entry so we minimize issues with serialization + conflicts
 84    Sprint = 1,
 85    Jump = 2,
 86    FreeCameraMode = 101,
 87    VoiceChatRecording = 102,
 88    DefaultConfirmAction = 300,
 89    DefaultCancelAction = 301,
 90    BuildEditModeMultiSelection = 432,
 91    BuildEditModeSquareMultiSelection = 433,
 92    BuildEditModeFirstPersonRotation = 436,
 93    BuildEditModeCameraAdvanceFoward = 437,
 94    BuildEditModeCameraAdvanceBack = 438,
 95    BuildEditModeCameraAdvanceLeft = 439,
 96    BuildEditModeCameraAdvanceRight = 440,
 97    BuildEditModeCameraAdvanceUp = 441,
 98    BuildEditModeCameraAdvanceDown = 442,
 99    BuildEditModeCameraPan = 446
 100}
 101
 102/// <summary>
 103/// Mapping for measurable actions
 104/// </summary>
 105public enum DCLAction_Measurable
 106{
 107    //Remember to explicitly assign the value to each entry so we minimize issues with serialization + conflicts
 108    CharacterXAxis = 1,
 109    CharacterYAxis = 2,
 110    CameraXAxis = 3,
 111    CameraYAxis = 4,
 112}
 113
 114/// <summary>
 115/// Group of actions currently actived
 116/// </summary>
 117public enum InputTypeMode
 118{
 119    OFF,
 120    GENERAL,
 121    BUILD_MODE_LOADING,
 122    BUILD_MODE
 123}
 124
 125/// <summary>
 126/// Input Controller will map inputs(keys/mouse/axis) to DCL actions, check if they can be triggered (modifiers) and rai
 127/// </summary>
 128public class InputController : MonoBehaviour
 129{
 1130    public static bool ENABLE_THIRD_PERSON_CAMERA = true;
 131
 132    [Header("General Input")]
 133    public InputAction_Trigger[] triggerTimeActions;
 134
 135    public InputAction_Hold[] holdActions;
 136    public InputAction_Measurable[] measurableActions;
 137
 138    [Header("BuildMode Input")]
 139    public InputAction_Trigger[] builderTriggerTimeActions;
 140
 141    public InputAction_Hold[] builderHoldActions;
 142    public InputAction_Trigger[] loadingBuilderTriggerTimeActions;
 143
 9012144    bool renderingEnabled => CommonScriptableObjects.rendererState.Get();
 54054145    bool allUIHidden => CommonScriptableObjects.allUIHidden.Get();
 612146    public InputTypeMode inputTypeMode { get; set; } = InputTypeMode.GENERAL;
 147
 148    private void Update()
 149    {
 9012150        if (!renderingEnabled)
 151        {
 1152            Stop_Measurable(measurableActions);
 1153            return;
 154        }
 155
 9011156        switch (inputTypeMode)
 157        {
 158            case InputTypeMode.OFF:
 0159                Stop_Measurable(measurableActions);
 0160                return;
 161            case InputTypeMode.GENERAL:
 9009162                Update_Trigger(triggerTimeActions);
 9009163                Update_Hold(holdActions);
 9009164                Update_Measurable(measurableActions);
 9009165                break;
 166            case InputTypeMode.BUILD_MODE_LOADING:
 2167                Update_Trigger(loadingBuilderTriggerTimeActions);
 2168                Stop_Measurable(measurableActions);
 2169                break;
 170            case InputTypeMode.BUILD_MODE:
 0171                Update_Trigger(builderTriggerTimeActions);
 0172                Update_Hold(builderHoldActions);
 0173                Update_Measurable(measurableActions);
 174                break;
 175        }
 0176    }
 177
 178    /// <summary>
 179    /// Map the trigger actions to inputs + modifiers and check if their events must be triggered
 180    /// </summary>
 181    public void Update_Trigger(InputAction_Trigger[] triggerTimeActions)
 182    {
 450458183        for (var i = 0; i < triggerTimeActions.Length; i++)
 184        {
 216218185            var action = triggerTimeActions[i];
 186
 216218187            if (action.isTriggerBlocked != null && action.isTriggerBlocked.Get())
 188                continue;
 189
 216218190            switch (action.GetDCLAction())
 191            {
 192                case DCLAction_Trigger.CameraChange:
 9009193                    if (CommonScriptableObjects.cameraModeInputLocked.Get())
 194                        break;
 195
 196                    //Disable until the fine-tuning is ready
 9009197                    if (ENABLE_THIRD_PERSON_CAMERA)
 9009198                        InputProcessor.FromKey(action, KeyCode.V,
 199                            modifiers: InputProcessor.Modifier.FocusNotInInput);
 9009200                    break;
 201                case DCLAction_Trigger.CursorUnlock:
 9009202                    InputProcessor.FromMouseButtonUp(action, 1, InputProcessor.Modifier.NeedsPointerLocked);
 203#if !WEB_PLATFORM
 9009204                    InputProcessor.FromKey(action, KeyCode.Escape, modifiers: InputProcessor.Modifier.NeedsPointerLocked
 205#endif
 9009206                    break;
 207                case DCLAction_Trigger.ToggleNavMap:
 9009208                    if (allUIHidden)
 209                        break;
 8921210                    InputProcessor.FromKey(action, KeyCode.M, modifiers: InputProcessor.Modifier.FocusNotInInput);
 8921211                    break;
 212                case DCLAction_Trigger.ToggleFriends:
 9009213                    if (allUIHidden)
 214                        break;
 8921215                    InputProcessor.FromKey(action, KeyCode.L, modifiers: InputProcessor.Modifier.None);
 8921216                    break;
 217                case DCLAction_Trigger.ToggleWorldChat:
 9009218                    if (allUIHidden)
 219                        break;
 8921220                    InputProcessor.FromKey(action, KeyCode.Return, modifiers: InputProcessor.Modifier.None);
 8921221                    break;
 222                case DCLAction_Trigger.ToggleUIVisibility:
 9009223                    InputProcessor.FromKey(action, KeyCode.U, modifiers: InputProcessor.Modifier.None);
 9009224                    break;
 225                case DCLAction_Trigger.CloseWindow:
 9009226                    if (allUIHidden || DataStore.i.common.isSignUpFlow.Get())
 227                        break;
 8921228                    InputProcessor.FromKey(action, KeyCode.Escape, modifiers: InputProcessor.Modifier.None);
 8921229                    break;
 230                case DCLAction_Trigger.OpenExpressions:
 9009231                    if (allUIHidden)
 232                        break;
 8921233                    InputProcessor.FromKey(action, KeyCode.B, modifiers: InputProcessor.Modifier.FocusNotInInput);
 8921234                    break;
 235                case DCLAction_Trigger.ToggleControlsHud:
 9009236                    InputProcessor.FromKey(action, KeyCode.C, modifiers: InputProcessor.Modifier.FocusNotInInput);
 9009237                    break;
 238                case DCLAction_Trigger.ToggleSettings:
 9009239                    InputProcessor.FromKey(action, KeyCode.P, modifiers: InputProcessor.Modifier.FocusNotInInput);
 9009240                    break;
 241                case DCLAction_Trigger.ToggleStartMenu:
 9009242                    if (allUIHidden)
 243                        break;
 8921244                    InputProcessor.FromKey(action, KeyCode.Tab, modifiers: InputProcessor.Modifier.None);
 8921245                    break;
 246                case DCLAction_Trigger.TogglePlacesAndEventsHud:
 9009247                    InputProcessor.FromKey(action, KeyCode.X, modifiers: InputProcessor.Modifier.FocusNotInInput);
 9009248                    break;
 249                case DCLAction_Trigger.Expression_Wave:
 9009250                    InputProcessor.FromKey(action, KeyCode.Alpha1,
 251                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 9009252                    break;
 253                case DCLAction_Trigger.Expression_FistPump:
 9009254                    InputProcessor.FromKey(action, KeyCode.Alpha2,
 255                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 9009256                    break;
 257                case DCLAction_Trigger.Expression_Robot:
 9009258                    InputProcessor.FromKey(action, KeyCode.Alpha3,
 259                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 9009260                    break;
 261                case DCLAction_Trigger.Expression_RaiseHand:
 9009262                    InputProcessor.FromKey(action, KeyCode.Alpha4,
 263                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 9009264                    break;
 265                case DCLAction_Trigger.Expression_Clap:
 9009266                    InputProcessor.FromKey(action, KeyCode.Alpha5,
 267                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 9009268                    break;
 269                case DCLAction_Trigger.Expression_ThrowMoney:
 9009270                    InputProcessor.FromKey(action, KeyCode.Alpha6,
 271                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 9009272                    break;
 273                case DCLAction_Trigger.Expression_SendKiss:
 9009274                    InputProcessor.FromKey(action, KeyCode.Alpha7,
 275                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 9009276                    break;
 277                case DCLAction_Trigger.BuildEditModeChange:
 9011278                    InputProcessor.FromKey(action, KeyCode.K, modifiers: InputProcessor.Modifier.FocusNotInInput);
 9011279                    break;
 280                case DCLAction_Trigger.ToggleVoiceChatRecording:
 9009281                    InputProcessor.FromKey(action, KeyCode.T, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 9009282                    break;
 283                case DCLAction_Trigger.ToggleAvatarEditorHud:
 9009284                    InputProcessor.FromKey(action, KeyCode.I, modifiers: InputProcessor.Modifier.FocusNotInInput);
 9009285                    break;
 286                case DCLAction_Trigger.BuildEditModeToggleUI:
 0287                    InputProcessor.FromKey(action, KeyCode.U, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0288                    break;
 289                case DCLAction_Trigger.BuildEditModeToggleChangeCamera:
 0290                    InputProcessor.FromKey(action, KeyCode.V, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0291                    break;
 292                case DCLAction_Trigger.BuildEditModeToggleControls:
 0293                    InputProcessor.FromKey(action, KeyCode.C, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0294                    break;
 295                case DCLAction_Trigger.BuildEditModeToggleSnapMode:
 0296                    InputProcessor.FromKey(action, KeyCode.O, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0297                    break;
 298                case DCLAction_Trigger.BuildEditModeRedoAction:
 0299                    InputProcessor.FromKey(action, KeyCode.Y, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 0300                    break;
 301                case DCLAction_Trigger.BuildEditModeUndoAction:
 0302                    InputProcessor.FromKey(action, KeyCode.Z, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 0303                    break;
 304                case DCLAction_Trigger.BuildEditModeQuickBar1:
 0305                    InputProcessor.FromKey(action, KeyCode.Alpha1, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0306                    break;
 307                case DCLAction_Trigger.BuildEditModeQuickBar2:
 0308                    InputProcessor.FromKey(action, KeyCode.Alpha2, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0309                    break;
 310                case DCLAction_Trigger.BuildEditModeQuickBar3:
 0311                    InputProcessor.FromKey(action, KeyCode.Alpha3, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0312                    break;
 313                case DCLAction_Trigger.BuildEditModeQuickBar4:
 0314                    InputProcessor.FromKey(action, KeyCode.Alpha4, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0315                    break;
 316                case DCLAction_Trigger.BuildEditModeQuickBar5:
 0317                    InputProcessor.FromKey(action, KeyCode.Alpha5, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0318                    break;
 319                case DCLAction_Trigger.BuildEditModeQuickBar6:
 0320                    InputProcessor.FromKey(action, KeyCode.Alpha6, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0321                    break;
 322                case DCLAction_Trigger.BuildEditModeQuickBar7:
 0323                    InputProcessor.FromKey(action, KeyCode.Alpha7, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0324                    break;
 325                case DCLAction_Trigger.BuildEditModeQuickBar8:
 0326                    InputProcessor.FromKey(action, KeyCode.Alpha8, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0327                    break;
 328                case DCLAction_Trigger.BuildEditModeQuickBar9:
 0329                    InputProcessor.FromKey(action, KeyCode.Alpha9, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0330                    break;
 331                case DCLAction_Trigger.BuildEditModeDelete:
 0332                    InputProcessor.FromKey(action, KeyCode.Delete, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0333                    InputProcessor.FromKey(action, KeyCode.Backspace, modifiers: InputProcessor.Modifier.FocusNotInInput
 0334                    break;
 335                case DCLAction_Trigger.BuildEditModeDuplicate:
 0336                    InputProcessor.FromKey(action, KeyCode.D, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 0337                    break;
 338                case DCLAction_Trigger.BuildEditModeTranslate:
 0339                    InputProcessor.FromKey(action, KeyCode.G, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0340                    InputProcessor.FromKey(action, KeyCode.M, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0341                    break;
 342                case DCLAction_Trigger.BuildEditModeRotate:
 0343                    InputProcessor.FromKey(action, KeyCode.R, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0344                    break;
 345                case DCLAction_Trigger.BuildEditModeScale:
 0346                    InputProcessor.FromKey(action, KeyCode.S, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0347                    break;
 348                case DCLAction_Trigger.BuildEditModeFocusSelectedEntities:
 0349                    InputProcessor.FromKey(action, KeyCode.F, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0350                    break;
 351                case DCLAction_Trigger.BuildEditModeReset:
 0352                    InputProcessor.FromKey(action, KeyCode.R, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 0353                    break;
 354                case DCLAction_Trigger.BuildEditHideSelectedEntities:
 0355                    InputProcessor.FromKey(action, KeyCode.H, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0356                    break;
 357                case DCLAction_Trigger.BuildEditShowAllEntities:
 0358                    InputProcessor.FromKey(action, KeyCode.H, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 0359                    break;
 360                case DCLAction_Trigger.BuildEditModeResetCamera:
 0361                    InputProcessor.FromKey(action, KeyCode.C, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 0362                    break;
 363                case DCLAction_Trigger.BuildEditModeZoomIn:
 0364                    InputProcessor.FromKey(action, KeyCode.KeypadPlus, modifiers: InputProcessor.Modifier.FocusNotInInpu
 0365                    break;
 366                case DCLAction_Trigger.BuildEditModeZoomOut:
 0367                    InputProcessor.FromKey(action, KeyCode.KeypadMinus, modifiers: InputProcessor.Modifier.FocusNotInInp
 0368                    break;
 369                case DCLAction_Trigger.ToggleQuestsPanelHud:
 9009370                    InputProcessor.FromKey(action, KeyCode.J, modifiers: InputProcessor.Modifier.FocusNotInInput);
 9009371                    break;
 372                case DCLAction_Trigger.ToggleAvatarNamesHud:
 9009373                    InputProcessor.FromKey(action, KeyCode.N, modifiers: InputProcessor.Modifier.FocusNotInInput);
 9009374                    break;
 375                default:
 0376                    throw new ArgumentOutOfRangeException();
 377            }
 378        }
 9011379    }
 380
 381    /// <summary>
 382    /// Map the hold actions to inputs + modifiers and check if their events must be triggered
 383    /// </summary>
 384    private void Update_Hold(InputAction_Hold[] holdActions)
 385    {
 144144386        for (var i = 0; i < holdActions.Length; i++)
 387        {
 63063388            var action = holdActions[i];
 63063389            switch (action.GetDCLAction())
 390            {
 391                case DCLAction_Hold.Sprint:
 9009392                    InputProcessor.FromKey(action, InputSettings.WalkButtonKeyCode,
 393                        InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 9009394                    break;
 395                case DCLAction_Hold.Jump:
 9009396                    InputProcessor.FromKey(action, InputSettings.JumpButtonKeyCode,
 397                        InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 9009398                    break;
 399                case DCLAction_Hold.FreeCameraMode:
 400                    //Disable until the fine-tuning is ready
 9009401                    if (ENABLE_THIRD_PERSON_CAMERA)
 9009402                        InputProcessor.FromKey(action, KeyCode.Y, InputProcessor.Modifier.NeedsPointerLocked);
 9009403                    break;
 404                case DCLAction_Hold.VoiceChatRecording:
 405                    // Push to talk functionality only triggers if no modifier key is pressed
 18018406                    InputProcessor.FromKey(action, KeyCode.T, InputProcessor.Modifier.FocusNotInInput, null);
 18018407                    break;
 408                case DCLAction_Hold.DefaultConfirmAction:
 9009409                    InputProcessor.FromKey(action, KeyCode.E, InputProcessor.Modifier.None);
 9009410                    break;
 411                case DCLAction_Hold.DefaultCancelAction:
 9009412                    InputProcessor.FromKey(action, KeyCode.F, InputProcessor.Modifier.None);
 9009413                    break;
 414                case DCLAction_Hold.BuildEditModeMultiSelection:
 0415                    InputProcessor.FromKey(action, KeyCode.LeftShift, InputProcessor.Modifier.FocusNotInInput);
 0416                    break;
 417                case DCLAction_Hold.BuildEditModeSquareMultiSelection:
 0418                    InputProcessor.FromKey(action, KeyCode.LeftShift, InputProcessor.Modifier.FocusNotInInput);
 0419                    break;
 420                case DCLAction_Hold.BuildEditModeFirstPersonRotation:
 0421                    InputProcessor.FromKey(action, KeyCode.R, InputProcessor.Modifier.FocusNotInInput);
 0422                    break;
 423                case DCLAction_Hold.BuildEditModeCameraAdvanceFoward:
 0424                    InputProcessor.FromKey(action, KeyCode.UpArrow, InputProcessor.Modifier.FocusNotInInput);
 0425                    InputProcessor.FromKey(action, KeyCode.W, InputProcessor.Modifier.FocusNotInInput);
 0426                    break;
 427                case DCLAction_Hold.BuildEditModeCameraAdvanceBack:
 0428                    InputProcessor.FromKey(action, KeyCode.DownArrow, InputProcessor.Modifier.FocusNotInInput);
 0429                    InputProcessor.FromKey(action, KeyCode.S, InputProcessor.Modifier.FocusNotInInput);
 0430                    break;
 431                case DCLAction_Hold.BuildEditModeCameraAdvanceLeft:
 0432                    InputProcessor.FromKey(action, KeyCode.LeftArrow, InputProcessor.Modifier.FocusNotInInput);
 0433                    InputProcessor.FromKey(action, KeyCode.A, InputProcessor.Modifier.FocusNotInInput);
 0434                    break;
 435                case DCLAction_Hold.BuildEditModeCameraAdvanceRight:
 0436                    InputProcessor.FromKey(action, KeyCode.RightArrow, InputProcessor.Modifier.FocusNotInInput);
 0437                    InputProcessor.FromKey(action, KeyCode.D, InputProcessor.Modifier.FocusNotInInput);
 0438                    break;
 439                case DCLAction_Hold.BuildEditModeCameraAdvanceUp:
 0440                    InputProcessor.FromKey(action, KeyCode.E, InputProcessor.Modifier.FocusNotInInput);
 0441                    break;
 442                case DCLAction_Hold.BuildEditModeCameraAdvanceDown:
 0443                    InputProcessor.FromKey(action, KeyCode.Q, InputProcessor.Modifier.FocusNotInInput);
 0444                    break;
 445                case DCLAction_Hold.BuildEditModeCameraPan:
 0446                    InputProcessor.FromKey(action, KeyCode.LeftShift, InputProcessor.Modifier.FocusNotInInput);
 0447                    break;
 448                default:
 0449                    throw new ArgumentOutOfRangeException();
 450            }
 451        }
 9009452    }
 453
 454    /// <summary>
 455    /// Map the measurable actions to inputs + modifiers and check if their events must be triggered
 456    /// </summary>
 457    private void Update_Measurable(InputAction_Measurable[] measurableActions)
 458    {
 90090459        for (var i = 0; i < measurableActions.Length; i++)
 460        {
 36036461            var action = measurableActions[i];
 36036462            switch (action.GetDCLAction())
 463            {
 464                case DCLAction_Measurable.CharacterXAxis:
 9009465                    InputProcessor.FromAxis(action, "Horizontal",
 466                        InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 9009467                    break;
 468                case DCLAction_Measurable.CharacterYAxis:
 9009469                    InputProcessor.FromAxis(action, "Vertical",
 470                        InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 9009471                    break;
 472                case DCLAction_Measurable.CameraXAxis:
 9009473                    InputProcessor.FromAxis(action, "Mouse X", InputProcessor.Modifier.NeedsPointerLocked);
 9009474                    break;
 475                case DCLAction_Measurable.CameraYAxis:
 9009476                    InputProcessor.FromAxis(action, "Mouse Y", InputProcessor.Modifier.NeedsPointerLocked);
 9009477                    break;
 478                default:
 0479                    throw new ArgumentOutOfRangeException();
 480            }
 481        }
 9009482    }
 483
 484    private void Stop_Measurable(InputAction_Measurable[] measurableActions)
 485    {
 30486        for (var i = 0; i < measurableActions.Length; i++)
 487        {
 12488            measurableActions[i].RaiseOnValueChanged(0);
 489        }
 3490    }
 491}
 492
 493/// <summary>
 494/// Helper class that wraps the processing of inputs and modifiers to trigger actions events
 495/// </summary>
 496public static class InputProcessor
 497{
 498    private static readonly KeyCode[] MODIFIER_KEYS = new[] { KeyCode.LeftControl, KeyCode.LeftAlt, KeyCode.LeftShift, K
 499
 500    [Flags]
 501    public enum Modifier
 502    {
 503        //Set the values as bit masks
 504        None = 0b0000000, // No modifier needed
 505        NeedsPointerLocked = 0b0000001, // The pointer must be locked to the game
 506        FocusNotInInput = 0b0000010, // The game focus cannot be in an input field
 507        NotInStartMenu = 0b0000100 // The game focus cannot be in full-screen start menu
 508    }
 509
 510    /// <summary>
 511    /// Check if the modifier keys are pressed
 512    /// </summary>
 513    /// <param name="modifierKeys"> Keycodes modifiers</param>
 514    /// <returns></returns>
 515    public static Boolean PassModifierKeys(KeyCode[] modifierKeys)
 516    {
 517        for (var i = 0; i < MODIFIER_KEYS.Length; i++)
 518        {
 519            var keyCode = MODIFIER_KEYS[i];
 520            var pressed = Input.GetKey(keyCode);
 521            if (modifierKeys == null)
 522            {
 523                if (pressed)
 524                    return false;
 525            }
 526            else
 527            {
 528                if (modifierKeys.Contains(keyCode) != pressed)
 529                    return false;
 530            }
 531        }
 532
 533        return true;
 534    }
 535
 536    /// <summary>
 537    /// Check if a miscellaneous modifiers are present. These modifiers are related to the meta-state of the application
 538    /// they can be anything such as mouse pointer state, where the focus is, camera mode...
 539    /// </summary>
 540    /// <param name="modifiers"></param>
 541    /// <returns></returns>
 542    public static bool PassModifiers(Modifier modifiers)
 543    {
 544        if (IsModifierSet(modifiers, Modifier.NeedsPointerLocked) && !DCL.Helpers.Utils.IsCursorLocked)
 545            return false;
 546
 547        if (IsModifierSet(modifiers, Modifier.FocusNotInInput) && FocusIsInInputField())
 548            return false;
 549
 550        if (IsModifierSet(modifiers, Modifier.NotInStartMenu) && IsStartMenuVisible())
 551            return false;
 552
 553        return true;
 554    }
 555
 556    private static bool IsStartMenuVisible() => DataStore.i.exploreV2.isOpen.Get();
 557
 558    /// <summary>
 559    /// Process an input action mapped to a keyboard key.
 560    /// </summary>
 561    /// <param name="action">Trigger Action to perform</param>
 562    /// <param name="key">KeyCode mapped to this action</param>
 563    /// <param name="modifierKeys">KeyCodes required to perform the action</param>
 564    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 565    public static void FromKey(InputAction_Trigger action, KeyCode key, KeyCode[] modifierKeys = null,
 566        Modifier modifiers = Modifier.None)
 567    {
 568        if (!PassModifiers(modifiers))
 569            return;
 570
 571        if (!PassModifierKeys(modifierKeys))
 572            return;
 573
 574        if (Input.GetKeyDown(key))
 575            action.RaiseOnTriggered();
 576    }
 577
 578    /// <summary>
 579    /// Process an input action mapped to a button.
 580    /// </summary>
 581    /// <param name="action">Trigger Action to perform</param>
 582    /// <param name="mouseButtonIdx">Index of the mouse button mapped to this action</param>
 583    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 584    public static void FromMouseButton(InputAction_Trigger action, int mouseButtonIdx,
 585        Modifier modifiers = Modifier.None)
 586    {
 587        if (!PassModifiers(modifiers))
 588            return;
 589
 590        if (Input.GetMouseButton(mouseButtonIdx))
 591            action.RaiseOnTriggered();
 592    }
 593
 594    public static void FromMouseButtonUp(InputAction_Trigger action, int mouseButtonIdx,
 595        Modifier modifiers = Modifier.None)
 596    {
 597        if (!PassModifiers(modifiers))
 598            return;
 599
 600        if (Input.GetMouseButtonUp(mouseButtonIdx))
 601            action.RaiseOnTriggered();
 602    }
 603
 604    /// <summary>
 605    /// Process an input action mapped to a keyboard key
 606    /// </summary>
 607    /// <param name="action">Hold Action to perform</param>
 608    /// <param name="key">KeyCode mapped to this action</param>
 609    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 610    public static void FromKey(InputAction_Hold action, KeyCode key, Modifier modifiers = Modifier.None)
 611    {
 612        if (!PassModifiers(modifiers))
 613            return;
 614
 615        if (Input.GetKeyDown(key))
 616            action.RaiseOnStarted();
 617        if (Input.GetKeyUp(key))
 618            action.RaiseOnFinished();
 619    }
 620
 621    /// <summary>
 622    /// Process an input action mapped to a keyboard key
 623    /// </summary>
 624    /// <param name="action">Hold Action to perform</param>
 625    /// <param name="key">KeyCode mapped to this action</param>
 626    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 627    /// <param name="modifierKeys">KeyCodes required to perform the action</param>
 628    public static void FromKey(InputAction_Hold action, KeyCode key, Modifier modifiers, KeyCode[] modifierKeys)
 629    {
 630        if (!PassModifierKeys(modifierKeys))
 631            return;
 632
 633        FromKey(action, key, modifiers);
 634    }
 635
 636    /// <summary>
 637    /// Process an input action mapped to a mouse button
 638    /// </summary>
 639    /// <param name="action">Hold Action to perform</param>
 640    /// <param name="mouseButtonIdx">Index of the mouse button</param>
 641    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 642    public static void FromMouse(InputAction_Hold action, int mouseButtonIdx, Modifier modifiers = Modifier.None)
 643    {
 644        if (!PassModifiers(modifiers))
 645            return;
 646
 647        if (Input.GetMouseButtonDown(mouseButtonIdx))
 648            action.RaiseOnStarted();
 649        if (Input.GetMouseButtonUp(mouseButtonIdx))
 650            action.RaiseOnFinished();
 651    }
 652
 653    /// <summary>
 654    /// Process an input action mapped to an axis
 655    /// </summary>
 656    /// <param name="action">Measurable Action to perform</param>
 657    /// <param name="axisName">Axis name</param>
 658    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 659    public static void FromAxis(InputAction_Measurable action, string axisName, Modifier modifiers = Modifier.None)
 660    {
 661        if (!PassModifiers(modifiers))
 662        {
 663            action.RaiseOnValueChanged(0);
 664            return;
 665        }
 666
 667        action.RaiseOnValueChanged(Input.GetAxis(axisName));
 668    }
 669
 670    /// <summary>
 671    /// Bitwise check for the modifiers flags
 672    /// </summary>
 673    /// <param name="modifiers">Modifier to check</param>
 674    /// <param name="value">Modifier mapped to a bit to check</param>
 675    /// <returns></returns>
 676    public static bool IsModifierSet(Modifier modifiers, Modifier value)
 677    {
 678        int flagsValue = (int)modifiers;
 679        int flagValue = (int)value;
 680
 681        return (flagsValue & flagValue) != 0;
 682    }
 683
 684    public static bool FocusIsInInputField()
 685    {
 686        if (EventSystem.current == null)
 687            return false;
 688
 689        if (EventSystem.current.currentSelectedGameObject != null &&
 690            (EventSystem.current.currentSelectedGameObject.GetComponent<TMP_InputField>() != null ||
 691             EventSystem.current.currentSelectedGameObject.GetComponent<UnityEngine.UI.InputField>() != null))
 692        {
 693            return true;
 694        }
 695
 696        return false;
 697    }
 698}