< Summary

Class:DCL.EmotesWheel.EmotesWheelController
Assembly:EmotesWheelHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/EmotesWheelHUD/EmotesWheelController.cs
Covered lines:123
Uncovered lines:115
Coverable lines:238
Total lines:421
Line coverage:51.6% (123 of 238)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
EmotesWheelController(...)0%110100%
SetVisibility(...)0%2100%
OnEmoteVisibleChanged(...)0%110100%
IsStartMenuOpenChanged(...)0%6200%
OnEquippedEmotesSet(...)0%110100%
UpdateEmoteSlots()0%127.311207.14%
OnAnimationAdded(...)0%2100%
RefreshSlotLoadingState(...)0%12300%
SetVisibility_Internal(...)0%8.817066.67%
Dispose()0%220100%
OnEmoteClicked(...)0%2100%
PlayEmote(...)0%2.062075%
ConfigureShortcuts()0%110100%
OnNumericShortcutInputActionTriggered(...)0%52567200%
OnViewClosed()0%2100%
OnAvatarEmoteSet(...)0%110100%
OnCloseWindowPressed(...)0%110100%
OnOpenEmotesCustomizationInputActionTriggered(...)0%2.52050%
OpenEmotesCustomizationSection()0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/EmotesWheelHUD/EmotesWheelController.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using System.Linq;
 3using UnityEngine;
 4
 5namespace DCL.EmotesWheel
 6{
 7    public class EmotesWheelController : IHUD
 8    {
 9        internal EmotesWheelView view;
 1610        private BaseVariable<bool> emotesVisible => DataStore.i.HUDs.emotesVisible;
 511        private BaseVariable<bool> emoteJustTriggeredFromShortcut => DataStore.i.HUDs.emoteJustTriggeredFromShortcut;
 012        private BaseVariable<bool> isAvatarEditorVisible => DataStore.i.HUDs.avatarEditorVisible;
 813        private BaseVariable<bool> isStartMenuOpen => DataStore.i.exploreV2.isOpen;
 514        private BaseVariable<bool> canStartMenuBeOpened => DataStore.i.exploreV2.isSomeModalOpen;
 015        private bool shortcutsCanBeUsed => !isStartMenuOpen.Get();
 1216        private DataStore_EmotesCustomization emotesCustomizationDataStore => DataStore.i.emotesCustomization;
 617        private BaseDictionary<(string bodyshapeId, string emoteId), AnimationClip> emoteAnimations => DataStore.i.emote
 18
 619        private UserProfile ownUserProfile => UserProfile.GetOwnUserProfile();
 20        private InputAction_Trigger closeWindow;
 21        private InputAction_Hold openEmotesCustomizationInputAction;
 22        private InputAction_Trigger shortcut0InputAction;
 23        private InputAction_Trigger shortcut1InputAction;
 24        private InputAction_Trigger shortcut2InputAction;
 25        private InputAction_Trigger shortcut3InputAction;
 26        private InputAction_Trigger shortcut4InputAction;
 27        private InputAction_Trigger shortcut5InputAction;
 28        private InputAction_Trigger shortcut6InputAction;
 29        private InputAction_Trigger shortcut7InputAction;
 30        private InputAction_Trigger shortcut8InputAction;
 31        private InputAction_Trigger shortcut9InputAction;
 32        private InputAction_Trigger auxShortcut0InputAction;
 33        private InputAction_Trigger auxShortcut1InputAction;
 34        private InputAction_Trigger auxShortcut2InputAction;
 35        private InputAction_Trigger auxShortcut3InputAction;
 36        private InputAction_Trigger auxShortcut4InputAction;
 37        private InputAction_Trigger auxShortcut5InputAction;
 38        private InputAction_Trigger auxShortcut6InputAction;
 39        private InputAction_Trigger auxShortcut7InputAction;
 40        private InputAction_Trigger auxShortcut8InputAction;
 41        private InputAction_Trigger auxShortcut9InputAction;
 42        private UserProfile userProfile;
 43        private BaseDictionary<string, WearableItem> catalog;
 44        private bool ownedWearablesAlreadyRequested = false;
 345        private BaseDictionary<string, EmoteWheelSlot> slotsInLoadingState = new BaseDictionary<string, EmoteWheelSlot>(
 46
 347        public EmotesWheelController(UserProfile userProfile, BaseDictionary<string, WearableItem> catalog)
 48        {
 349            closeWindow = Resources.Load<InputAction_Trigger>("CloseWindow");
 350            closeWindow.OnTriggered += OnCloseWindowPressed;
 51
 352            view = EmotesWheelView.Create();
 353            view.OnClose += OnViewClosed;
 354            view.onEmoteClicked += OnEmoteClicked;
 355            view.OnCustomizeClicked += OpenEmotesCustomizationSection;
 56
 357            ownUserProfile.OnAvatarEmoteSet += OnAvatarEmoteSet;
 358            emotesVisible.OnChange += OnEmoteVisibleChanged;
 359            OnEmoteVisibleChanged(emotesVisible.Get(), false);
 60
 361            isStartMenuOpen.OnChange += IsStartMenuOpenChanged;
 62
 363            this.userProfile = userProfile;
 364            this.catalog = catalog;
 365            emotesCustomizationDataStore.equippedEmotes.OnSet += OnEquippedEmotesSet;
 366            OnEquippedEmotesSet(emotesCustomizationDataStore.equippedEmotes.Get());
 367            emoteAnimations.OnAdded += OnAnimationAdded;
 68
 369            ConfigureShortcuts();
 70
 371            emotesCustomizationDataStore.isWheelInitialized.Set(true);
 372        }
 73
 74        public void SetVisibility(bool visible)
 75        {
 76            //TODO once kernel sends visible properly
 77            //expressionsVisible.Set(visible);
 078        }
 79
 1080        private void OnEmoteVisibleChanged(bool current, bool previous) { SetVisibility_Internal(current); }
 81
 82        private void IsStartMenuOpenChanged(bool current, bool previous)
 83        {
 084            if (!current)
 085                return;
 86
 087            emotesVisible.Set(false);
 088        }
 89
 690        private void OnEquippedEmotesSet(IEnumerable<EquippedEmoteData> equippedEmotes) { UpdateEmoteSlots(); }
 91
 92        private void UpdateEmoteSlots()
 93        {
 394            if (catalog == null)
 395                return;
 96
 097            List<EmotesWheelView.EmoteSlotData> emotesToSet = new List<EmotesWheelView.EmoteSlotData>();
 098            foreach (EquippedEmoteData equippedEmoteData in emotesCustomizationDataStore.equippedEmotes.Get())
 99            {
 0100                if (equippedEmoteData != null)
 101                {
 0102                    catalog.TryGetValue(equippedEmoteData.id, out WearableItem emoteItem);
 103
 0104                    if (emoteItem != null)
 105                    {
 0106                        if (!emoteItem.data.tags.Contains(WearableLiterals.Tags.BASE_WEARABLE) && userProfile.GetItemAmo
 107                        {
 0108                            emotesToSet.Add(null);
 0109                        }
 110                        else
 111                        {
 0112                            emotesToSet.Add(new EmotesWheelView.EmoteSlotData
 113                            {
 114                                emoteItem = emoteItem,
 115                                thumbnailSprite = emoteItem.thumbnailSprite != null ? emoteItem.thumbnailSprite : equipp
 116                            });
 117                        }
 0118                    }
 119                    else
 120                    {
 0121                        emotesToSet.Add(null);
 122                    }
 0123                }
 124                else
 125                {
 0126                    emotesToSet.Add(null);
 127                }
 128            }
 129
 0130            List<EmoteWheelSlot> updatedWheelSlots = view.SetEmotes(emotesToSet);
 0131            foreach (EmoteWheelSlot slot in updatedWheelSlots)
 132            {
 0133                slot.SetAsLoading(false);
 0134                slotsInLoadingState.Remove(slot.emoteId);
 135
 0136                if (string.IsNullOrEmpty(slot.emoteId))
 137                    continue;
 138
 0139                slot.SetAsLoading(true);
 0140                slotsInLoadingState.Add(slot.emoteId, slot);
 141
 0142                RefreshSlotLoadingState(slot.emoteId);
 143            }
 0144        }
 145
 0146        private void OnAnimationAdded((string bodyshapeId, string emoteId) values, AnimationClip animationClip) { Refres
 147
 148        private void RefreshSlotLoadingState(string emoteId)
 149        {
 0150            if (emoteAnimations.ContainsKey((userProfile.avatar.bodyShape, emoteId)))
 151            {
 0152                slotsInLoadingState.TryGetValue(emoteId, out EmoteWheelSlot slot);
 0153                if (slot != null)
 154                {
 0155                    slot.SetAsLoading(false);
 0156                    slotsInLoadingState.Remove(emoteId);
 157                }
 158            }
 0159        }
 160
 161        public void SetVisibility_Internal(bool visible)
 162        {
 5163            if (isStartMenuOpen.Get())
 0164                return;
 165
 5166            if (emoteJustTriggeredFromShortcut.Get())
 167            {
 0168                emotesVisible.Set(false);
 0169                return;
 170            }
 171
 5172            view.SetVisiblity(visible);
 173
 5174            if (visible)
 175            {
 1176                DCL.Helpers.Utils.UnlockCursor();
 177
 1178                if (userProfile != null &&
 179                    !string.IsNullOrEmpty(userProfile.userId) &&
 180                    !ownedWearablesAlreadyRequested)
 181                {
 0182                    CatalogController.RequestOwnedWearables(userProfile.userId)
 183                        .Then((ownedWearables) =>
 184                        {
 0185                            ownedWearablesAlreadyRequested = true;
 0186                            userProfile.SetInventory(ownedWearables.Select(x => x.id).ToArray());
 0187                            UpdateEmoteSlots();
 0188                        });
 189                }
 190            }
 191
 5192            canStartMenuBeOpened.Set(visible);
 5193        }
 194
 195        public void Dispose()
 196        {
 3197            view.OnClose -= OnViewClosed;
 3198            view.onEmoteClicked -= OnEmoteClicked;
 3199            view.OnCustomizeClicked -= OpenEmotesCustomizationSection;
 3200            closeWindow.OnTriggered -= OnCloseWindowPressed;
 3201            ownUserProfile.OnAvatarEmoteSet -= OnAvatarEmoteSet;
 3202            emotesVisible.OnChange -= OnEmoteVisibleChanged;
 3203            emotesCustomizationDataStore.equippedEmotes.OnSet -= OnEquippedEmotesSet;
 3204            emoteAnimations.OnAdded -= OnAnimationAdded;
 3205            shortcut0InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3206            shortcut1InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3207            shortcut2InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3208            shortcut3InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3209            shortcut4InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3210            shortcut5InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3211            shortcut6InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3212            shortcut7InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3213            shortcut8InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3214            shortcut9InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3215            auxShortcut0InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3216            auxShortcut1InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3217            auxShortcut2InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3218            auxShortcut3InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3219            auxShortcut4InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3220            auxShortcut5InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3221            auxShortcut6InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3222            auxShortcut7InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3223            auxShortcut8InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3224            auxShortcut9InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 225
 3226            if (view != null)
 227            {
 3228                view.CleanUp();
 3229                UnityEngine.Object.Destroy(view.gameObject);
 230            }
 3231        }
 232
 0233        public void OnEmoteClicked(string id) { PlayEmote(id, UserProfile.EmoteSource.EmotesWheel); }
 234
 235        public void PlayEmote(string id, UserProfile.EmoteSource source)
 236        {
 1237            if (string.IsNullOrEmpty(id))
 0238                return;
 239
 1240            UserProfile.GetOwnUserProfile().SetAvatarExpression(id, source);
 1241        }
 242
 243        private void ConfigureShortcuts()
 244        {
 3245            closeWindow = Resources.Load<InputAction_Trigger>("CloseWindow");
 3246            closeWindow.OnTriggered += OnCloseWindowPressed;
 247
 3248            openEmotesCustomizationInputAction = Resources.Load<InputAction_Hold>("DefaultConfirmAction");
 3249            openEmotesCustomizationInputAction.OnFinished += OnOpenEmotesCustomizationInputActionTriggered;
 250
 3251            shortcut0InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut0");
 3252            shortcut0InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 253
 3254            shortcut1InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut1");
 3255            shortcut1InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 256
 3257            shortcut2InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut2");
 3258            shortcut2InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 259
 3260            shortcut3InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut3");
 3261            shortcut3InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 262
 3263            shortcut4InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut4");
 3264            shortcut4InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 265
 3266            shortcut5InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut5");
 3267            shortcut5InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 268
 3269            shortcut6InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut6");
 3270            shortcut6InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 271
 3272            shortcut7InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut7");
 3273            shortcut7InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 274
 3275            shortcut8InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut8");
 3276            shortcut8InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 277
 3278            shortcut9InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut9");
 3279            shortcut9InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 280
 3281            auxShortcut0InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut0");
 3282            auxShortcut0InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 283
 3284            auxShortcut1InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut1");
 3285            auxShortcut1InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 286
 3287            auxShortcut2InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut2");
 3288            auxShortcut2InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 289
 3290            auxShortcut3InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut3");
 3291            auxShortcut3InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 292
 3293            auxShortcut4InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut4");
 3294            auxShortcut4InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 295
 3296            auxShortcut5InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut5");
 3297            auxShortcut5InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 298
 3299            auxShortcut6InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut6");
 3300            auxShortcut6InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 301
 3302            auxShortcut7InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut7");
 3303            auxShortcut7InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 304
 3305            auxShortcut8InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut8");
 3306            auxShortcut8InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 307
 3308            auxShortcut9InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut9");
 3309            auxShortcut9InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 3310        }
 311
 312        private void OnNumericShortcutInputActionTriggered(DCLAction_Trigger action)
 313        {
 0314            if (!shortcutsCanBeUsed)
 0315                return;
 316
 317            switch (action)
 318            {
 319                case DCLAction_Trigger.ToggleEmoteShortcut0:
 0320                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[0]?.id, UserProfile.EmoteSource.Shortcut);
 0321                    emoteJustTriggeredFromShortcut.Set(true);
 0322                    break;
 323                case DCLAction_Trigger.ToggleEmoteShortcut1:
 0324                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[1]?.id, UserProfile.EmoteSource.Shortcut);
 0325                    emoteJustTriggeredFromShortcut.Set(true);
 0326                    break;
 327                case DCLAction_Trigger.ToggleEmoteShortcut2:
 0328                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[2]?.id, UserProfile.EmoteSource.Shortcut);
 0329                    emoteJustTriggeredFromShortcut.Set(true);
 0330                    break;
 331                case DCLAction_Trigger.ToggleEmoteShortcut3:
 0332                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[3]?.id, UserProfile.EmoteSource.Shortcut);
 0333                    emoteJustTriggeredFromShortcut.Set(true);
 0334                    break;
 335                case DCLAction_Trigger.ToggleEmoteShortcut4:
 0336                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[4]?.id, UserProfile.EmoteSource.Shortcut);
 0337                    emoteJustTriggeredFromShortcut.Set(true);
 0338                    break;
 339                case DCLAction_Trigger.ToggleEmoteShortcut5:
 0340                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[5]?.id, UserProfile.EmoteSource.Shortcut);
 0341                    emoteJustTriggeredFromShortcut.Set(true);
 0342                    break;
 343                case DCLAction_Trigger.ToggleEmoteShortcut6:
 0344                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[6]?.id, UserProfile.EmoteSource.Shortcut);
 0345                    emoteJustTriggeredFromShortcut.Set(true);
 0346                    break;
 347                case DCLAction_Trigger.ToggleEmoteShortcut7:
 0348                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[7]?.id, UserProfile.EmoteSource.Shortcut);
 0349                    emoteJustTriggeredFromShortcut.Set(true);
 0350                    break;
 351                case DCLAction_Trigger.ToggleEmoteShortcut8:
 0352                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[8]?.id, UserProfile.EmoteSource.Shortcut);
 0353                    emoteJustTriggeredFromShortcut.Set(true);
 0354                    break;
 355                case DCLAction_Trigger.ToggleEmoteShortcut9:
 0356                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[9]?.id, UserProfile.EmoteSource.Shortcut);
 0357                    emoteJustTriggeredFromShortcut.Set(true);
 0358                    break;
 359                case DCLAction_Trigger.ToggleShortcut0:
 0360                    if (emotesVisible.Get())
 0361                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[0]?.id, UserProfile.EmoteSource.Shortcut);
 0362                    break;
 363                case DCLAction_Trigger.ToggleShortcut1:
 0364                    if (emotesVisible.Get())
 0365                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[1]?.id, UserProfile.EmoteSource.Shortcut);
 0366                    break;
 367                case DCLAction_Trigger.ToggleShortcut2:
 0368                    if (emotesVisible.Get())
 0369                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[2]?.id, UserProfile.EmoteSource.Shortcut);
 0370                    break;
 371                case DCLAction_Trigger.ToggleShortcut3:
 0372                    if (emotesVisible.Get())
 0373                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[3]?.id, UserProfile.EmoteSource.Shortcut);
 0374                    break;
 375                case DCLAction_Trigger.ToggleShortcut4:
 0376                    if (emotesVisible.Get())
 0377                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[4]?.id, UserProfile.EmoteSource.Shortcut);
 0378                    break;
 379                case DCLAction_Trigger.ToggleShortcut5:
 0380                    if (emotesVisible.Get())
 0381                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[5]?.id, UserProfile.EmoteSource.Shortcut);
 0382                    break;
 383                case DCLAction_Trigger.ToggleShortcut6:
 0384                    if (emotesVisible.Get())
 0385                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[6]?.id, UserProfile.EmoteSource.Shortcut);
 0386                    break;
 387                case DCLAction_Trigger.ToggleShortcut7:
 0388                    if (emotesVisible.Get())
 0389                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[7]?.id, UserProfile.EmoteSource.Shortcut);
 0390                    break;
 391                case DCLAction_Trigger.ToggleShortcut8:
 0392                    if (emotesVisible.Get())
 0393                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[8]?.id, UserProfile.EmoteSource.Shortcut);
 0394                    break;
 395                case DCLAction_Trigger.ToggleShortcut9:
 0396                    if (emotesVisible.Get())
 0397                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[9]?.id, UserProfile.EmoteSource.Shortcut);
 398                    break;
 399            }
 0400        }
 401
 0402        private void OnViewClosed() { emotesVisible.Set(false); }
 2403        private void OnAvatarEmoteSet(string id, long timestamp, UserProfile.EmoteSource source) { emotesVisible.Set(fal
 6404        private void OnCloseWindowPressed(DCLAction_Trigger action) { emotesVisible.Set(false); }
 405
 406        private void OnOpenEmotesCustomizationInputActionTriggered(DCLAction_Hold action)
 407        {
 3408            if (!emotesVisible.Get())
 3409                return;
 410
 0411            OpenEmotesCustomizationSection();
 0412        }
 413
 414        private void OpenEmotesCustomizationSection()
 415        {
 0416            emotesVisible.Set(false);
 0417            isAvatarEditorVisible.Set(true);
 0418            emotesCustomizationDataStore.isEmotesCustomizationSelected.Set(true);
 0419        }
 420    }
 421}