< Summary

Class:InputController
Assembly:InputController
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/InputController/InputController.cs
Covered lines:158
Uncovered lines:91
Coverable lines:249
Total lines:808
Line coverage:63.4% (158 of 249)
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%9.756052.94%
Update_Trigger(...)0%394.3483064.38%
Update_Hold(...)0%96.9526052.83%
Update_Measurable(...)0%10.0210094.44%
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    ToggleShortcut0 = 132,
 32    ToggleShortcut1 = 133,
 33    ToggleShortcut2 = 134,
 34    ToggleShortcut3 = 135,
 35    ToggleShortcut4 = 136,
 36    ToggleShortcut5 = 137,
 37    ToggleShortcut6 = 138,
 38    ToggleShortcut7 = 139,
 39    ToggleShortcut8 = 140,
 40    ToggleShortcut9 = 141,
 41    ToggleEmoteShortcut0 = 142,
 42    ToggleEmoteShortcut1 = 143,
 43    ToggleEmoteShortcut2 = 144,
 44    ToggleEmoteShortcut3 = 145,
 45    ToggleEmoteShortcut4 = 146,
 46    ToggleEmoteShortcut5 = 147,
 47    ToggleEmoteShortcut6 = 148,
 48    ToggleEmoteShortcut7 = 149,
 49    ToggleEmoteShortcut8 = 150,
 50    ToggleEmoteShortcut9 = 151,
 51    ChatPreviousInHistory = 152,
 52    ChatNextInHistory = 153,
 53
 54    Expression_Wave = 201,
 55    Expression_FistPump = 202,
 56    Expression_Robot = 203,
 57    Expression_RaiseHand = 204,
 58    Expression_Clap = 205,
 59    Expression_ThrowMoney = 206,
 60    Expression_SendKiss = 207,
 61    Expression_Dance = 208,
 62    Expression_Hohoho = 209,
 63    Expression_Snowfall = 210,
 64
 65    //Builder In World 4xx
 66    BuildEditModeChange = 408,
 67    BuildEditModeToggleUI = 409,
 68    BuildEditModeToggleEntityList = 410,
 69    BuildEditModeToggleCatalog = 411,
 70    BuildEditModeToggleSceneInfo = 412,
 71    BuildEditModeToggleChangeCamera = 413,
 72    BuildEditModeToggleControls = 414,
 73    BuildEditModeToggleSnapMode = 415,
 74    BuildEditModeUndoAction = 417,
 75    BuildEditModeRedoAction = 418,
 76    BuildEditModeQuickBar1 = 419,
 77    BuildEditModeQuickBar2 = 420,
 78    BuildEditModeQuickBar3 = 421,
 79    BuildEditModeQuickBar4 = 422,
 80    BuildEditModeQuickBar5 = 423,
 81    BuildEditModeQuickBar6 = 424,
 82    BuildEditModeQuickBar7 = 425,
 83    BuildEditModeQuickBar8 = 426,
 84    BuildEditModeQuickBar9 = 427,
 85    BuildEditModeDuplicate = 428,
 86    BuildEditModeTranslate = 429,
 87    BuildEditModeRotate = 430,
 88    BuildEditModeScale = 431,
 89    BuildEditModeDelete = 434,
 90    BuildEditModeFocusSelectedEntities = 435,
 91    BuildEditModeReset = 443,
 92    BuildEditHideSelectedEntities = 444,
 93    BuildEditShowAllEntities = 445,
 94    BuildEditModeResetCamera = 446,
 95    BuildEditModeZoomIn = 447,
 96    BuildEditModeZoomOut = 448
 97}
 98
 99/// <summary>
 100/// Mapping for hold actions
 101/// </summary>
 102public enum DCLAction_Hold
 103{
 104    //Remember to explicitly assign the value to each entry so we minimize issues with serialization + conflicts
 105    Sprint = 1,
 106    Jump = 2,
 107    ZoomIn = 3,
 108    ZoomOut = 4,
 109    FreeCameraMode = 101,
 110    VoiceChatRecording = 102,
 111    DefaultConfirmAction = 300,
 112    DefaultCancelAction = 301,
 113    BuildEditModeMultiSelection = 432,
 114    BuildEditModeSquareMultiSelection = 433,
 115    BuildEditModeFirstPersonRotation = 436,
 116    BuildEditModeCameraAdvanceFoward = 437,
 117    BuildEditModeCameraAdvanceBack = 438,
 118    BuildEditModeCameraAdvanceLeft = 439,
 119    BuildEditModeCameraAdvanceRight = 440,
 120    BuildEditModeCameraAdvanceUp = 441,
 121    BuildEditModeCameraAdvanceDown = 442,
 122    BuildEditModeCameraPan = 446,
 123    OpenExpressions = 447
 124}
 125
 126/// <summary>
 127/// Mapping for measurable actions
 128/// </summary>
 129public enum DCLAction_Measurable
 130{
 131    //Remember to explicitly assign the value to each entry so we minimize issues with serialization + conflicts
 132    CharacterXAxis = 1,
 133    CharacterYAxis = 2,
 134    CameraXAxis = 3,
 135    CameraYAxis = 4,
 136    MouseWheel = 5
 137}
 138
 139/// <summary>
 140/// Group of actions currently actived
 141/// </summary>
 142public enum InputTypeMode
 143{
 144    OFF,
 145    GENERAL,
 146    BUILD_MODE_LOADING,
 147    BUILD_MODE
 148}
 149
 150/// <summary>
 151/// Input Controller will map inputs(keys/mouse/axis) to DCL actions, check if they can be triggered (modifiers) and rai
 152/// </summary>
 153public class InputController : MonoBehaviour
 154{
 1155    public static bool ENABLE_THIRD_PERSON_CAMERA = true;
 156
 157    [Header("General Input")]
 158    public InputAction_Trigger[] triggerTimeActions;
 159
 160    public InputAction_Hold[] holdActions;
 161    public InputAction_Measurable[] measurableActions;
 162
 163    [Header("BuildMode Input")]
 164    public InputAction_Trigger[] builderTriggerTimeActions;
 165
 166    public InputAction_Hold[] builderHoldActions;
 167    public InputAction_Trigger[] loadingBuilderTriggerTimeActions;
 168
 5341169    bool renderingEnabled => CommonScriptableObjects.rendererState.Get();
 16017170    bool allUIHidden => CommonScriptableObjects.allUIHidden.Get();
 610171    public InputTypeMode inputTypeMode { get; set; } = InputTypeMode.GENERAL;
 172
 173    private void Update()
 174    {
 5341175        if (!renderingEnabled)
 176        {
 0177            Stop_Measurable(measurableActions);
 0178            return;
 179        }
 180
 5341181        switch (inputTypeMode)
 182        {
 183            case InputTypeMode.OFF:
 0184                Stop_Measurable(measurableActions);
 0185                return;
 186            case InputTypeMode.GENERAL:
 5339187                Update_Trigger(triggerTimeActions);
 5339188                Update_Hold(holdActions);
 5339189                Update_Measurable(measurableActions);
 5339190                break;
 191            case InputTypeMode.BUILD_MODE_LOADING:
 2192                Update_Trigger(loadingBuilderTriggerTimeActions);
 2193                Stop_Measurable(measurableActions);
 2194                break;
 195            case InputTypeMode.BUILD_MODE:
 0196                Update_Trigger(builderTriggerTimeActions);
 0197                Update_Hold(builderHoldActions);
 0198                Update_Measurable(measurableActions);
 199                break;
 200        }
 0201    }
 202
 203    /// <summary>
 204    /// Map the trigger actions to inputs + modifiers and check if their events must be triggered
 205    /// </summary>
 206    public void Update_Trigger(InputAction_Trigger[] triggerTimeActions)
 207    {
 491196208        for (var i = 0; i < triggerTimeActions.Length; i++)
 209        {
 240257210            var action = triggerTimeActions[i];
 211
 240257212            if (action.isTriggerBlocked != null && action.isTriggerBlocked.Get())
 213                continue;
 214
 240257215            switch (action.GetDCLAction())
 216            {
 217                case DCLAction_Trigger.CameraChange:
 5339218                    if (CommonScriptableObjects.cameraModeInputLocked.Get())
 219                        break;
 220
 221                    //Disable until the fine-tuning is ready
 5339222                    if (ENABLE_THIRD_PERSON_CAMERA)
 5339223                        InputProcessor.FromKey(action, KeyCode.V,
 224                            modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339225                    break;
 226                case DCLAction_Trigger.CursorUnlock:
 5339227                    InputProcessor.FromMouseButtonUp(action, 1, InputProcessor.Modifier.NeedsPointerLocked);
 228#if !WEB_PLATFORM
 5339229                    InputProcessor.FromKey(action, KeyCode.Escape, modifiers: InputProcessor.Modifier.NeedsPointerLocked
 230#endif
 5339231                    break;
 232                case DCLAction_Trigger.ToggleNavMap:
 5339233                    InputProcessor.FromKey(action, KeyCode.M, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339234                    break;
 235                case DCLAction_Trigger.ToggleFriends:
 5339236                    if (allUIHidden)
 237                        break;
 5339238                    InputProcessor.FromKey(action, KeyCode.L, modifiers: InputProcessor.Modifier.None);
 5339239                    break;
 240                case DCLAction_Trigger.ToggleWorldChat:
 5339241                    if (allUIHidden)
 242                        break;
 5339243                    InputProcessor.FromKey(action, KeyCode.Return, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339244                    break;
 245                case DCLAction_Trigger.ToggleUIVisibility:
 5339246                    InputProcessor.FromKey(action, KeyCode.U, modifiers: InputProcessor.Modifier.None);
 5339247                    break;
 248                case DCLAction_Trigger.CloseWindow:
 5339249                    if (allUIHidden || DataStore.i.common.isSignUpFlow.Get())
 250                        break;
 5339251                    InputProcessor.FromKey(action, KeyCode.Escape, modifiers: InputProcessor.Modifier.None);
 5339252                    break;
 253                case DCLAction_Trigger.ToggleControlsHud:
 5339254                    InputProcessor.FromKey(action, KeyCode.C, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339255                    break;
 256                case DCLAction_Trigger.ToggleSettings:
 5339257                    InputProcessor.FromKey(action, KeyCode.P, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339258                    break;
 259                case DCLAction_Trigger.ToggleStartMenu:
 5339260                    InputProcessor.FromKey(action, KeyCode.Tab, modifiers: InputProcessor.Modifier.None);
 5339261                    break;
 262                case DCLAction_Trigger.TogglePlacesAndEventsHud:
 5339263                    InputProcessor.FromKey(action, KeyCode.X, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339264                    break;
 265                case DCLAction_Trigger.ToggleShortcut0:
 5339266                    InputProcessor.FromKey(action, KeyCode.Alpha0, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339267                    break;
 268                case DCLAction_Trigger.ToggleShortcut1:
 5339269                    InputProcessor.FromKey(action, KeyCode.Alpha1, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339270                    break;
 271                case DCLAction_Trigger.ToggleShortcut2:
 5339272                    InputProcessor.FromKey(action, KeyCode.Alpha2, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339273                    break;
 274                case DCLAction_Trigger.ToggleShortcut3:
 5339275                    InputProcessor.FromKey(action, KeyCode.Alpha3, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339276                    break;
 277                case DCLAction_Trigger.ToggleShortcut4:
 5339278                    InputProcessor.FromKey(action, KeyCode.Alpha4, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339279                    break;
 280                case DCLAction_Trigger.ToggleShortcut5:
 5339281                    InputProcessor.FromKey(action, KeyCode.Alpha5, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339282                    break;
 283                case DCLAction_Trigger.ToggleShortcut6:
 5339284                    InputProcessor.FromKey(action, KeyCode.Alpha6, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339285                    break;
 286                case DCLAction_Trigger.ToggleShortcut7:
 5339287                    InputProcessor.FromKey(action, KeyCode.Alpha7, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339288                    break;
 289                case DCLAction_Trigger.ToggleShortcut8:
 5339290                    InputProcessor.FromKey(action, KeyCode.Alpha8, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339291                    break;
 292                case DCLAction_Trigger.ToggleShortcut9:
 5339293                    InputProcessor.FromKey(action, KeyCode.Alpha9, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339294                    break;
 295                case DCLAction_Trigger.ToggleEmoteShortcut0:
 5339296                    InputProcessor.FromKey(action, KeyCode.Alpha0, modifiers: InputProcessor.Modifier.FocusNotInInput, m
 5339297                    break;
 298                case DCLAction_Trigger.ToggleEmoteShortcut1:
 5339299                    InputProcessor.FromKey(action, KeyCode.Alpha1, modifiers: InputProcessor.Modifier.FocusNotInInput, m
 5339300                    break;
 301                case DCLAction_Trigger.ToggleEmoteShortcut2:
 5339302                    InputProcessor.FromKey(action, KeyCode.Alpha2, modifiers: InputProcessor.Modifier.FocusNotInInput, m
 5339303                    break;
 304                case DCLAction_Trigger.ToggleEmoteShortcut3:
 5339305                    InputProcessor.FromKey(action, KeyCode.Alpha3, modifiers: InputProcessor.Modifier.FocusNotInInput, m
 5339306                    break;
 307                case DCLAction_Trigger.ToggleEmoteShortcut4:
 5339308                    InputProcessor.FromKey(action, KeyCode.Alpha4, modifiers: InputProcessor.Modifier.FocusNotInInput, m
 5339309                    break;
 310                case DCLAction_Trigger.ToggleEmoteShortcut5:
 5339311                    InputProcessor.FromKey(action, KeyCode.Alpha5, modifiers: InputProcessor.Modifier.FocusNotInInput, m
 5339312                    break;
 313                case DCLAction_Trigger.ToggleEmoteShortcut6:
 5339314                    InputProcessor.FromKey(action, KeyCode.Alpha6, modifiers: InputProcessor.Modifier.FocusNotInInput, m
 5339315                    break;
 316                case DCLAction_Trigger.ToggleEmoteShortcut7:
 5339317                    InputProcessor.FromKey(action, KeyCode.Alpha7, modifiers: InputProcessor.Modifier.FocusNotInInput, m
 5339318                    break;
 319                case DCLAction_Trigger.ToggleEmoteShortcut8:
 5339320                    InputProcessor.FromKey(action, KeyCode.Alpha8, modifiers: InputProcessor.Modifier.FocusNotInInput, m
 5339321                    break;
 322                case DCLAction_Trigger.ToggleEmoteShortcut9:
 5339323                    InputProcessor.FromKey(action, KeyCode.Alpha9, modifiers: InputProcessor.Modifier.FocusNotInInput, m
 5339324                    break;
 325                case DCLAction_Trigger.ChatNextInHistory:
 5339326                    InputProcessor.FromKey(action, KeyCode.UpArrow, modifiers: InputProcessor.Modifier.OnlyWithInputFocu
 5339327                    break;
 328                case DCLAction_Trigger.ChatPreviousInHistory:
 5339329                    InputProcessor.FromKey(action, KeyCode.DownArrow, modifiers: InputProcessor.Modifier.OnlyWithInputFo
 5339330                    break;
 331                case DCLAction_Trigger.Expression_Wave:
 5339332                    InputProcessor.FromKey(action, KeyCode.Alpha1,
 333                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 5339334                    break;
 335                case DCLAction_Trigger.Expression_FistPump:
 5339336                    InputProcessor.FromKey(action, KeyCode.Alpha2,
 337                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 5339338                    break;
 339                case DCLAction_Trigger.Expression_Robot:
 5339340                    InputProcessor.FromKey(action, KeyCode.Alpha3,
 341                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 5339342                    break;
 343                case DCLAction_Trigger.Expression_RaiseHand:
 5339344                    InputProcessor.FromKey(action, KeyCode.Alpha4,
 345                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 5339346                    break;
 347                case DCLAction_Trigger.Expression_Clap:
 5339348                    InputProcessor.FromKey(action, KeyCode.Alpha5,
 349                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 5339350                    break;
 351                case DCLAction_Trigger.Expression_ThrowMoney:
 5339352                    InputProcessor.FromKey(action, KeyCode.Alpha6,
 353                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 5339354                    break;
 355                case DCLAction_Trigger.Expression_SendKiss:
 5339356                    InputProcessor.FromKey(action, KeyCode.Alpha7,
 357                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 5339358                    break;
 359                case DCLAction_Trigger.BuildEditModeChange:
 5341360                    InputProcessor.FromKey(action, KeyCode.K, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5341361                    break;
 362                case DCLAction_Trigger.ToggleVoiceChatRecording:
 5339363                    InputProcessor.FromKey(action, KeyCode.T, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 5339364                    break;
 365                case DCLAction_Trigger.ToggleAvatarEditorHud:
 5339366                    InputProcessor.FromKey(action, KeyCode.I, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339367                    break;
 368                case DCLAction_Trigger.BuildEditModeToggleUI:
 0369                    InputProcessor.FromKey(action, KeyCode.U, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0370                    break;
 371                case DCLAction_Trigger.BuildEditModeToggleChangeCamera:
 0372                    InputProcessor.FromKey(action, KeyCode.V, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0373                    break;
 374                case DCLAction_Trigger.BuildEditModeToggleControls:
 0375                    InputProcessor.FromKey(action, KeyCode.C, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0376                    break;
 377                case DCLAction_Trigger.BuildEditModeToggleSnapMode:
 0378                    InputProcessor.FromKey(action, KeyCode.O, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0379                    break;
 380                case DCLAction_Trigger.BuildEditModeRedoAction:
 0381                    InputProcessor.FromKey(action, KeyCode.Y, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 0382                    break;
 383                case DCLAction_Trigger.BuildEditModeUndoAction:
 0384                    InputProcessor.FromKey(action, KeyCode.Z, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 0385                    break;
 386                case DCLAction_Trigger.BuildEditModeQuickBar1:
 0387                    InputProcessor.FromKey(action, KeyCode.Alpha1, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0388                    break;
 389                case DCLAction_Trigger.BuildEditModeQuickBar2:
 0390                    InputProcessor.FromKey(action, KeyCode.Alpha2, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0391                    break;
 392                case DCLAction_Trigger.BuildEditModeQuickBar3:
 0393                    InputProcessor.FromKey(action, KeyCode.Alpha3, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0394                    break;
 395                case DCLAction_Trigger.BuildEditModeQuickBar4:
 0396                    InputProcessor.FromKey(action, KeyCode.Alpha4, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0397                    break;
 398                case DCLAction_Trigger.BuildEditModeQuickBar5:
 0399                    InputProcessor.FromKey(action, KeyCode.Alpha5, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0400                    break;
 401                case DCLAction_Trigger.BuildEditModeQuickBar6:
 0402                    InputProcessor.FromKey(action, KeyCode.Alpha6, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0403                    break;
 404                case DCLAction_Trigger.BuildEditModeQuickBar7:
 0405                    InputProcessor.FromKey(action, KeyCode.Alpha7, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0406                    break;
 407                case DCLAction_Trigger.BuildEditModeQuickBar8:
 0408                    InputProcessor.FromKey(action, KeyCode.Alpha8, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0409                    break;
 410                case DCLAction_Trigger.BuildEditModeQuickBar9:
 0411                    InputProcessor.FromKey(action, KeyCode.Alpha9, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0412                    break;
 413                case DCLAction_Trigger.BuildEditModeDelete:
 0414                    InputProcessor.FromKey(action, KeyCode.Delete, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0415                    InputProcessor.FromKey(action, KeyCode.Backspace, modifiers: InputProcessor.Modifier.FocusNotInInput
 0416                    break;
 417                case DCLAction_Trigger.BuildEditModeDuplicate:
 0418                    InputProcessor.FromKey(action, KeyCode.D, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 0419                    break;
 420                case DCLAction_Trigger.BuildEditModeTranslate:
 0421                    InputProcessor.FromKey(action, KeyCode.G, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0422                    InputProcessor.FromKey(action, KeyCode.M, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0423                    break;
 424                case DCLAction_Trigger.BuildEditModeRotate:
 0425                    InputProcessor.FromKey(action, KeyCode.R, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0426                    break;
 427                case DCLAction_Trigger.BuildEditModeScale:
 0428                    InputProcessor.FromKey(action, KeyCode.S, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0429                    break;
 430                case DCLAction_Trigger.BuildEditModeFocusSelectedEntities:
 0431                    InputProcessor.FromKey(action, KeyCode.F, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0432                    break;
 433                case DCLAction_Trigger.BuildEditModeReset:
 0434                    InputProcessor.FromKey(action, KeyCode.R, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 0435                    break;
 436                case DCLAction_Trigger.BuildEditHideSelectedEntities:
 0437                    InputProcessor.FromKey(action, KeyCode.H, modifiers: InputProcessor.Modifier.FocusNotInInput);
 0438                    break;
 439                case DCLAction_Trigger.BuildEditShowAllEntities:
 0440                    InputProcessor.FromKey(action, KeyCode.H, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 0441                    break;
 442                case DCLAction_Trigger.BuildEditModeResetCamera:
 0443                    InputProcessor.FromKey(action, KeyCode.C, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 0444                    break;
 445                case DCLAction_Trigger.BuildEditModeZoomIn:
 0446                    InputProcessor.FromKey(action, KeyCode.KeypadPlus, modifiers: InputProcessor.Modifier.FocusNotInInpu
 0447                    break;
 448                case DCLAction_Trigger.BuildEditModeZoomOut:
 0449                    InputProcessor.FromKey(action, KeyCode.KeypadMinus, modifiers: InputProcessor.Modifier.FocusNotInInp
 0450                    break;
 451                case DCLAction_Trigger.ToggleQuestsPanelHud:
 5339452                    InputProcessor.FromKey(action, KeyCode.J, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339453                    break;
 454                case DCLAction_Trigger.ToggleAvatarNamesHud:
 5339455                    InputProcessor.FromKey(action, KeyCode.N, modifiers: InputProcessor.Modifier.FocusNotInInput);
 5339456                    break;
 457                default:
 0458                    throw new ArgumentOutOfRangeException();
 459            }
 460        }
 5341461    }
 462
 463    /// <summary>
 464    /// Map the hold actions to inputs + modifiers and check if their events must be triggered
 465    /// </summary>
 466    private void Update_Hold(InputAction_Hold[] holdActions)
 467    {
 117458468        for (var i = 0; i < holdActions.Length; i++)
 469        {
 53390470            var action = holdActions[i];
 471
 53390472            if (action.isHoldBlocked != null && action.isHoldBlocked.Get())
 473                continue;
 474
 53390475            switch (action.GetDCLAction())
 476            {
 477                case DCLAction_Hold.Sprint:
 5339478                    InputProcessor.FromKey(action, InputSettings.WalkButtonKeyCode,
 479                        InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 5339480                    break;
 481                case DCLAction_Hold.Jump:
 5339482                    InputProcessor.FromKey(action, InputSettings.JumpButtonKeyCode,
 483                        InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 5339484                    break;
 485                case DCLAction_Hold.ZoomIn:
 5339486                    InputProcessor.FromKey(action, KeyCode.KeypadPlus, InputProcessor.Modifier.None);
 5339487                    InputProcessor.FromKey(action, KeyCode.Plus, InputProcessor.Modifier.None);
 5339488                    break;
 489                case DCLAction_Hold.ZoomOut:
 5339490                    InputProcessor.FromKey(action, KeyCode.KeypadMinus, InputProcessor.Modifier.None);
 5339491                    InputProcessor.FromKey(action, KeyCode.Minus, InputProcessor.Modifier.None);
 5339492                    break;
 493                case DCLAction_Hold.FreeCameraMode:
 494                    //Disable until the fine-tuning is ready
 5339495                    if (ENABLE_THIRD_PERSON_CAMERA)
 5339496                        InputProcessor.FromKey(action, KeyCode.Y, InputProcessor.Modifier.NeedsPointerLocked);
 5339497                    break;
 498                case DCLAction_Hold.VoiceChatRecording:
 499                    // Push to talk functionality only triggers if no modifier key is pressed
 10678500                    InputProcessor.FromKey(action, KeyCode.T, InputProcessor.Modifier.FocusNotInInput, null);
 10678501                    break;
 502                case DCLAction_Hold.DefaultConfirmAction:
 5339503                    InputProcessor.FromKey(action, KeyCode.E, InputProcessor.Modifier.None);
 5339504                    break;
 505                case DCLAction_Hold.DefaultCancelAction:
 5339506                    InputProcessor.FromKey(action, KeyCode.F, InputProcessor.Modifier.None);
 5339507                    break;
 508                case DCLAction_Hold.BuildEditModeMultiSelection:
 0509                    InputProcessor.FromKey(action, KeyCode.LeftShift, InputProcessor.Modifier.FocusNotInInput);
 0510                    break;
 511                case DCLAction_Hold.BuildEditModeSquareMultiSelection:
 0512                    InputProcessor.FromKey(action, KeyCode.LeftShift, InputProcessor.Modifier.FocusNotInInput);
 0513                    break;
 514                case DCLAction_Hold.BuildEditModeFirstPersonRotation:
 0515                    InputProcessor.FromKey(action, KeyCode.R, InputProcessor.Modifier.FocusNotInInput);
 0516                    break;
 517                case DCLAction_Hold.BuildEditModeCameraAdvanceFoward:
 0518                    InputProcessor.FromKey(action, KeyCode.UpArrow, InputProcessor.Modifier.FocusNotInInput);
 0519                    InputProcessor.FromKey(action, KeyCode.W, InputProcessor.Modifier.FocusNotInInput);
 0520                    break;
 521                case DCLAction_Hold.BuildEditModeCameraAdvanceBack:
 0522                    InputProcessor.FromKey(action, KeyCode.DownArrow, InputProcessor.Modifier.FocusNotInInput);
 0523                    InputProcessor.FromKey(action, KeyCode.S, InputProcessor.Modifier.FocusNotInInput);
 0524                    break;
 525                case DCLAction_Hold.BuildEditModeCameraAdvanceLeft:
 0526                    InputProcessor.FromKey(action, KeyCode.LeftArrow, InputProcessor.Modifier.FocusNotInInput);
 0527                    InputProcessor.FromKey(action, KeyCode.A, InputProcessor.Modifier.FocusNotInInput);
 0528                    break;
 529                case DCLAction_Hold.BuildEditModeCameraAdvanceRight:
 0530                    InputProcessor.FromKey(action, KeyCode.RightArrow, InputProcessor.Modifier.FocusNotInInput);
 0531                    InputProcessor.FromKey(action, KeyCode.D, InputProcessor.Modifier.FocusNotInInput);
 0532                    break;
 533                case DCLAction_Hold.BuildEditModeCameraAdvanceUp:
 0534                    InputProcessor.FromKey(action, KeyCode.E, InputProcessor.Modifier.FocusNotInInput);
 0535                    break;
 536                case DCLAction_Hold.BuildEditModeCameraAdvanceDown:
 0537                    InputProcessor.FromKey(action, KeyCode.Q, InputProcessor.Modifier.FocusNotInInput);
 0538                    break;
 539                case DCLAction_Hold.BuildEditModeCameraPan:
 0540                    InputProcessor.FromKey(action, KeyCode.LeftShift, InputProcessor.Modifier.FocusNotInInput);
 0541                    break;
 542                case DCLAction_Hold.OpenExpressions:
 5339543                    InputProcessor.FromKey(action, KeyCode.B, InputProcessor.Modifier.FocusNotInInput);
 5339544                    break;
 545                default:
 0546                    throw new ArgumentOutOfRangeException();
 547            }
 548        }
 5339549    }
 550
 551    /// <summary>
 552    /// Map the measurable actions to inputs + modifiers and check if their events must be triggered
 553    /// </summary>
 554    private void Update_Measurable(InputAction_Measurable[] measurableActions)
 555    {
 64068556        for (var i = 0; i < measurableActions.Length; i++)
 557        {
 26695558            var action = measurableActions[i];
 559
 26695560            if (action.isMeasurableBlocked != null && action.isMeasurableBlocked.Get())
 561                continue;
 562
 26695563            switch (action.GetDCLAction())
 564            {
 565                case DCLAction_Measurable.CharacterXAxis:
 5339566                    InputProcessor.FromAxis(action, "Horizontal",
 567                        InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 5339568                    break;
 569                case DCLAction_Measurable.CharacterYAxis:
 5339570                    InputProcessor.FromAxis(action, "Vertical",
 571                        InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 5339572                    break;
 573                case DCLAction_Measurable.CameraXAxis:
 5339574                    InputProcessor.FromAxis(action, "Mouse X", InputProcessor.Modifier.NeedsPointerLocked);
 5339575                    break;
 576                case DCLAction_Measurable.CameraYAxis:
 5339577                    InputProcessor.FromAxis(action, "Mouse Y", InputProcessor.Modifier.NeedsPointerLocked);
 5339578                    break;
 579                case DCLAction_Measurable.MouseWheel:
 5339580                    InputProcessor.FromAxis(action, "Mouse ScrollWheel", modifiers: InputProcessor.Modifier.FocusNotInIn
 5339581                    break;
 582                default:
 0583                    throw new ArgumentOutOfRangeException();
 584            }
 585        }
 5339586    }
 587
 588    private void Stop_Measurable(InputAction_Measurable[] measurableActions)
 589    {
 24590        for (var i = 0; i < measurableActions.Length; i++)
 591        {
 10592            measurableActions[i].RaiseOnValueChanged(0);
 593        }
 2594    }
 595}
 596
 597/// <summary>
 598/// Helper class that wraps the processing of inputs and modifiers to trigger actions events
 599/// </summary>
 600public static class InputProcessor
 601{
 602    private static readonly KeyCode[] MODIFIER_KEYS = new[] { KeyCode.LeftControl, KeyCode.LeftAlt, KeyCode.LeftShift, K
 603
 604    [Flags]
 605    public enum Modifier
 606    {
 607        //Set the values as bit masks
 608        None = 0b0000000, // No modifier needed
 609        NeedsPointerLocked = 0b0000001, // The pointer must be locked to the game
 610        FocusNotInInput = 0b0000010, // The game focus cannot be in an input field
 611        NotInStartMenu = 0b0000100, // The game focus cannot be in full-screen start menu
 612        OnlyWithInputFocused = 0b0001000 // The game focus must be in an input field
 613    }
 614
 615    /// <summary>
 616    /// Check if the modifier keys are pressed
 617    /// </summary>
 618    /// <param name="modifierKeys"> Keycodes modifiers</param>
 619    /// <returns></returns>
 620    public static Boolean PassModifierKeys(KeyCode[] modifierKeys)
 621    {
 622        for (var i = 0; i < MODIFIER_KEYS.Length; i++)
 623        {
 624            var keyCode = MODIFIER_KEYS[i];
 625            var pressed = Input.GetKey(keyCode);
 626            if (modifierKeys == null)
 627            {
 628                if (pressed)
 629                    return false;
 630            }
 631            else
 632            {
 633                if (modifierKeys.Contains(keyCode) != pressed)
 634                    return false;
 635            }
 636        }
 637
 638        return true;
 639    }
 640
 641    /// <summary>
 642    /// Check if a miscellaneous modifiers are present. These modifiers are related to the meta-state of the application
 643    /// they can be anything such as mouse pointer state, where the focus is, camera mode...
 644    /// </summary>
 645    /// <param name="modifiers"></param>
 646    /// <returns></returns>
 647    public static bool PassModifiers(Modifier modifiers)
 648    {
 649        if (IsModifierSet(modifiers, Modifier.NeedsPointerLocked) && !DCL.Helpers.Utils.IsCursorLocked)
 650            return false;
 651
 652        var isInputFieldFocused = FocusIsInInputField();
 653
 654        if (IsModifierSet(modifiers, Modifier.FocusNotInInput) && isInputFieldFocused)
 655            return false;
 656
 657        if (IsModifierSet(modifiers, Modifier.OnlyWithInputFocused) && !isInputFieldFocused)
 658            return false;
 659
 660        if (IsModifierSet(modifiers, Modifier.NotInStartMenu) && IsStartMenuVisible())
 661            return false;
 662
 663        return true;
 664    }
 665
 666    private static bool IsStartMenuVisible() => DataStore.i.exploreV2.isOpen.Get();
 667
 668    /// <summary>
 669    /// Process an input action mapped to a keyboard key.
 670    /// </summary>
 671    /// <param name="action">Trigger Action to perform</param>
 672    /// <param name="key">KeyCode mapped to this action</param>
 673    /// <param name="modifierKeys">KeyCodes required to perform the action</param>
 674    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 675    public static void FromKey(InputAction_Trigger action, KeyCode key, KeyCode[] modifierKeys = null,
 676        Modifier modifiers = Modifier.None)
 677    {
 678        if (!PassModifiers(modifiers))
 679            return;
 680
 681        if (!PassModifierKeys(modifierKeys))
 682            return;
 683
 684        if (Input.GetKeyDown(key))
 685            action.RaiseOnTriggered();
 686    }
 687
 688    /// <summary>
 689    /// Process an input action mapped to a button.
 690    /// </summary>
 691    /// <param name="action">Trigger Action to perform</param>
 692    /// <param name="mouseButtonIdx">Index of the mouse button mapped to this action</param>
 693    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 694    public static void FromMouseButton(InputAction_Trigger action, int mouseButtonIdx,
 695        Modifier modifiers = Modifier.None)
 696    {
 697        if (!PassModifiers(modifiers))
 698            return;
 699
 700        if (Input.GetMouseButton(mouseButtonIdx))
 701            action.RaiseOnTriggered();
 702    }
 703
 704    public static void FromMouseButtonUp(InputAction_Trigger action, int mouseButtonIdx,
 705        Modifier modifiers = Modifier.None)
 706    {
 707        if (!PassModifiers(modifiers))
 708            return;
 709
 710        if (Input.GetMouseButtonUp(mouseButtonIdx))
 711            action.RaiseOnTriggered();
 712    }
 713
 714    /// <summary>
 715    /// Process an input action mapped to a keyboard key
 716    /// </summary>
 717    /// <param name="action">Hold Action to perform</param>
 718    /// <param name="key">KeyCode mapped to this action</param>
 719    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 720    public static void FromKey(InputAction_Hold action, KeyCode key, Modifier modifiers = Modifier.None)
 721    {
 722        if (!PassModifiers(modifiers))
 723            return;
 724
 725        if (Input.GetKeyDown(key))
 726            action.RaiseOnStarted();
 727        if (Input.GetKeyUp(key))
 728            action.RaiseOnFinished();
 729    }
 730
 731    /// <summary>
 732    /// Process an input action mapped to a keyboard key
 733    /// </summary>
 734    /// <param name="action">Hold Action to perform</param>
 735    /// <param name="key">KeyCode mapped to this action</param>
 736    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 737    /// <param name="modifierKeys">KeyCodes required to perform the action</param>
 738    public static void FromKey(InputAction_Hold action, KeyCode key, Modifier modifiers, KeyCode[] modifierKeys)
 739    {
 740        if (!PassModifierKeys(modifierKeys))
 741            return;
 742
 743        FromKey(action, key, modifiers);
 744    }
 745
 746    /// <summary>
 747    /// Process an input action mapped to a mouse button
 748    /// </summary>
 749    /// <param name="action">Hold Action to perform</param>
 750    /// <param name="mouseButtonIdx">Index of the mouse button</param>
 751    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 752    public static void FromMouse(InputAction_Hold action, int mouseButtonIdx, Modifier modifiers = Modifier.None)
 753    {
 754        if (!PassModifiers(modifiers))
 755            return;
 756
 757        if (Input.GetMouseButtonDown(mouseButtonIdx))
 758            action.RaiseOnStarted();
 759        if (Input.GetMouseButtonUp(mouseButtonIdx))
 760            action.RaiseOnFinished();
 761    }
 762
 763    /// <summary>
 764    /// Process an input action mapped to an axis
 765    /// </summary>
 766    /// <param name="action">Measurable Action to perform</param>
 767    /// <param name="axisName">Axis name</param>
 768    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 769    public static void FromAxis(InputAction_Measurable action, string axisName, Modifier modifiers = Modifier.None)
 770    {
 771        if (!PassModifiers(modifiers))
 772        {
 773            action.RaiseOnValueChanged(0);
 774            return;
 775        }
 776
 777        action.RaiseOnValueChanged(Input.GetAxis(axisName));
 778    }
 779
 780    /// <summary>
 781    /// Bitwise check for the modifiers flags
 782    /// </summary>
 783    /// <param name="modifiers">Modifier to check</param>
 784    /// <param name="value">Modifier mapped to a bit to check</param>
 785    /// <returns></returns>
 786    public static bool IsModifierSet(Modifier modifiers, Modifier value)
 787    {
 788        int flagsValue = (int)modifiers;
 789        int flagValue = (int)value;
 790
 791        return (flagsValue & flagValue) != 0;
 792    }
 793
 794    public static bool FocusIsInInputField()
 795    {
 796        if (EventSystem.current == null)
 797            return false;
 798
 799        if (EventSystem.current.currentSelectedGameObject != null &&
 800            (EventSystem.current.currentSelectedGameObject.GetComponent<TMP_InputField>() != null ||
 801             EventSystem.current.currentSelectedGameObject.GetComponent<UnityEngine.UI.InputField>() != null))
 802        {
 803            return true;
 804        }
 805
 806        return false;
 807    }
 808}