< Summary

Class:DCL.AvatarShape
Assembly:AvatarShape
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Avatar/AvatarShape.cs
Covered lines:51
Uncovered lines:64
Coverable lines:115
Total lines:248
Line coverage:44.3% (51 of 115)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
AvatarShape()0%110100%
Awake()0%110100%
Start()0%220100%
PlayerClicked()0%6200%
OnDestroy()0%330100%
ApplyChanges()0%17.587040%
PlayerPointerExit()0%6200%
PlayerPointerEnter()0%6200%
UpdatePlayerStatus(...)0%90900%
Update()0%2.52050%
DisablePassport()0%2.062075%
EnablePassport()0%6200%
OnEntityTransformChanged(...)0%2100%
OnPoolGet()0%110100%
OnImpostorAlphaValueUpdate(...)0%12300%
Cleanup()0%5.065086.67%
GetClassId()0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Avatar/AvatarShape.cs

#LineLine coverage
 1using System;
 2using DCL.Components;
 3using DCL.Interface;
 4using System.Collections;
 5using DCL.Models;
 6using UnityEngine;
 7
 8namespace DCL
 9{
 10    public class AvatarShape : BaseComponent
 11    {
 12        private const string CURRENT_PLAYER_ID = "CurrentPlayerInfoCardId";
 13        private const float AVATAR_PASSPORT_TOGGLE_ALPHA_THRESHOLD = 0.9f;
 14
 15        public static event Action<IDCLEntity, AvatarShape> OnAvatarShapeUpdated;
 16
 17        public AvatarRenderer avatarRenderer;
 18        public Collider avatarCollider;
 19        public AvatarMovementController avatarMovementController;
 20
 21        [SerializeField] internal AvatarOnPointerDown onPointerDown;
 22        internal IPlayerName playerName;
 23
 24        private StringVariable currentPlayerInfoCardId;
 25
 66226        private AvatarModel oldModel = new AvatarModel();
 27
 28        public bool everythingIsLoaded;
 29
 30        private Vector3? lastAvatarPosition = null;
 31        bool initializedPosition = false;
 32
 33        private Player player = null;
 034        private BaseDictionary<string, Player> otherPlayers => DataStore.i.player.otherPlayers;
 35
 36        private void Awake()
 37        {
 66138            model = new AvatarModel();
 66139            currentPlayerInfoCardId = Resources.Load<StringVariable>(CURRENT_PLAYER_ID);
 66140            avatarRenderer.OnImpostorAlphaValueUpdate += OnImpostorAlphaValueUpdate;
 66141        }
 42
 43        private void Start()
 44        {
 145            playerName = GetComponentInChildren<IPlayerName>();
 146            playerName?.Hide(true);
 147        }
 48
 49        private void PlayerClicked()
 50        {
 051            if (model == null)
 052                return;
 053            currentPlayerInfoCardId.Set(((AvatarModel) model).id);
 054        }
 55
 56        public void OnDestroy()
 57        {
 66158            Cleanup();
 59
 66160            if (poolableObject != null && poolableObject.isInsidePool)
 261                poolableObject.RemoveFromPool();
 62
 66163            avatarRenderer.OnImpostorAlphaValueUpdate -= OnImpostorAlphaValueUpdate;
 66164        }
 65
 66        public override IEnumerator ApplyChanges(BaseModel newModel)
 67        {
 268            DisablePassport();
 69
 270            var model = (AvatarModel) newModel;
 71#if UNITY_EDITOR
 272            gameObject.name = $"Avatar Shape {model.name}";
 73#endif
 274            everythingIsLoaded = false;
 75
 276            bool avatarDone = false;
 277            bool avatarFailed = false;
 78
 279            yield return null; //NOTE(Brian): just in case we have a Object.Destroy waiting to be resolved.
 80
 81            // To deal with the cases in which the entity transform was configured before the AvatarShape
 182            if (!initializedPosition && entity.components.ContainsKey(DCL.Models.CLASS_ID_COMPONENT.TRANSFORM))
 83            {
 184                initializedPosition = true;
 85
 186                avatarMovementController.MoveTo(
 87                    entity.gameObject.transform.localPosition - Vector3.up * DCLCharacterController.i.characterControlle
 88                    entity.gameObject.transform.localRotation, true);
 89            }
 90
 191            avatarRenderer.ApplyModel(model, () => avatarDone = true, () => avatarFailed = true);
 92
 293            yield return new WaitUntil(() => avatarDone || avatarFailed);
 94
 095            onPointerDown.Initialize(
 96                new OnPointerDown.Model()
 97                {
 98                    type = OnPointerDown.NAME,
 99                    button = WebInterface.ACTION_BUTTON.POINTER.ToString(),
 100                    hoverText = "view profile"
 101                },
 102                entity
 103            );
 104
 0105            entity.OnTransformChange -= avatarMovementController.OnTransformChanged;
 0106            entity.OnTransformChange += avatarMovementController.OnTransformChanged;
 107
 0108            entity.OnTransformChange -= OnEntityTransformChanged;
 0109            entity.OnTransformChange += OnEntityTransformChanged;
 110
 0111            onPointerDown.OnPointerDownReport -= PlayerClicked;
 0112            onPointerDown.OnPointerDownReport += PlayerClicked;
 0113            onPointerDown.OnPointerEnterReport -= PlayerPointerEnter;
 0114            onPointerDown.OnPointerEnterReport += PlayerPointerEnter;
 0115            onPointerDown.OnPointerExitReport -= PlayerPointerExit;
 0116            onPointerDown.OnPointerExitReport += PlayerPointerExit;
 117
 118
 0119            UpdatePlayerStatus(model);
 120
 0121            avatarCollider.gameObject.SetActive(true);
 122
 0123            everythingIsLoaded = true;
 0124            OnAvatarShapeUpdated?.Invoke(entity, this);
 125
 0126            EnablePassport();
 127
 0128            KernelConfig.i.EnsureConfigInitialized()
 129                        .Then(config =>
 130                        {
 0131                            if (config.features.enableAvatarLODs)
 0132                                avatarRenderer.InitializeImpostor();
 0133                        });
 0134        }
 0135        private void PlayerPointerExit() { playerName?.SetForceShow(false); }
 0136        private void PlayerPointerEnter() { playerName?.SetForceShow(true); }
 137
 138        private void UpdatePlayerStatus(AvatarModel model)
 139        {
 140            // Remove the player status if the userId changes
 0141            if (player != null && (player.id != model.id || player.name != model.name))
 0142                otherPlayers.Remove(player.id);
 143
 0144            if (string.IsNullOrEmpty(model?.id))
 0145                return;
 146
 0147            bool isNew = false;
 0148            if (player == null)
 149            {
 0150                player = new Player();
 0151                isNew = true;
 152            }
 153
 0154            player.id = model.id;
 0155            player.name = model.name;
 0156            player.isTalking = model.talking;
 0157            player.worldPosition = entity.gameObject.transform.position;
 0158            player.renderer = avatarRenderer;
 0159            player.onPointerDownCollider = onPointerDown;
 160
 0161            if (isNew)
 162            {
 0163                player.playerName = playerName;
 0164                player.playerName.SetName(player.name);
 0165                player.playerName.Show();
 0166                otherPlayers.Add(player.id, player);
 167            }
 0168            player.playerName.SetIsTalking(model.talking);
 0169            player.playerName.SetYOffset(avatarRenderer.maxY);
 0170        }
 171
 172        private void Update()
 173        {
 1174            if (player != null)
 175            {
 0176                player.worldPosition = entity.gameObject.transform.position;
 0177                player.forwardDirection = entity.gameObject.transform.forward;
 178            }
 1179        }
 180
 181        public void DisablePassport()
 182        {
 2183            if (onPointerDown.collider == null)
 0184                return;
 185
 2186            onPointerDown.SetColliderEnabled(false);
 2187        }
 188
 189        public void EnablePassport()
 190        {
 0191            if (onPointerDown.collider == null)
 0192                return;
 193
 0194            onPointerDown.SetColliderEnabled(true);
 0195        }
 196
 197        private void OnEntityTransformChanged(object newModel)
 198        {
 0199            DCLTransform.Model newTransformModel = (DCLTransform.Model)newModel;
 0200            lastAvatarPosition = newTransformModel.position;
 0201        }
 202
 203        public override void OnPoolGet()
 204        {
 2205            base.OnPoolGet();
 206
 2207            everythingIsLoaded = false;
 2208            initializedPosition = false;
 2209            oldModel = new AvatarModel();
 2210            model = new AvatarModel();
 2211            lastAvatarPosition = null;
 2212            player = null;
 2213        }
 214
 0215        void OnImpostorAlphaValueUpdate(float newAlphaValue) { avatarMovementController.movementLerpWait = newAlphaValue
 216
 217        public override void Cleanup()
 218        {
 665219            base.Cleanup();
 220
 665221            playerName?.Hide(true);
 665222            if (player != null)
 223            {
 0224                otherPlayers.Remove(player.id);
 0225                player = null;
 226            }
 227
 665228            avatarRenderer.CleanupAvatar();
 229
 665230            if (poolableObject != null)
 231            {
 6232                poolableObject.OnRelease -= Cleanup;
 233            }
 234
 665235            onPointerDown.OnPointerDownReport -= PlayerClicked;
 665236            onPointerDown.OnPointerEnterReport -= PlayerPointerEnter;
 665237            onPointerDown.OnPointerExitReport -= PlayerPointerExit;
 238
 665239            if (entity != null)
 240            {
 2241                entity.OnTransformChange = null;
 2242                entity = null;
 243            }
 665244        }
 245
 0246        public override int GetClassId() { return (int) CLASS_ID_COMPONENT.AVATAR_SHAPE; }
 247    }
 248}